현재 회사에서 쓰는 스펙은 Spring Boot, Kotlin, JPA, QueryDSL, MySQL etc,,, 등등이 있다.
해당 스펙에 대한 경험이 없는 상태로 얼렁뚱땅 다른 사람의 코드를 보고 비슷하게 코드 작성하는것에는 한계가 있다.
오늘은 갑자기 다음의 내용이 궁금해졌다.
기본적으로 간단한 CRUD에 대해서는 JPA를 사용하는데
어떨때는 엔티티를 가져와서 값을 업데이트만 해도 디비에 적용되고
다른때는 save를 하는 것이다.
//jpa repsitory
@Repository
interface EntityRepository : JpaRepository<Id, Long> {
fun findById(id: Int): Entity
}
val myEntity: Entity = findById(id)
myEntity.age = 100
val myEntity = Entity()
EntityRepository.save(myEntity)
Transaction Template
Transaction = 해당 범위 안에서 에러가 나면 범위안에서 수행한 작업을 롤백한다.
@Transaction 어노테이션을 붙이게 되면 해당 메서드가 대상이 된다.
그러나 메서드의 일부분만 트랜잭션 처리를 해야한다면? 원하는 부분만 transactionTemplate로 감싸준다.
JPA
JPA에는 save와 같은 메서드가 없다. JPA는 ORM paradigm을 기반으로 하고 있기 때문이다.
JPA는 entity state machine 이다.
Entity State Machine 이란?
Entity State의 종류
- New : 새롭게 생성된 오브젝트. 디비의 어떤 테이블에도 연결되어 있지 않다.
- Persistent : 디비의 테이블 로우로 존재하고 현재의 Persistence Context 에 의해 관리되고 있다.
- Detached : 현재의 Persistence Context가 종료되면 이전의 모든 엔티티들은 detached 상태가 된다.
- Removed
만일 새로운 엔티티를 만들었다면 call persist를 해서 엔티티가 관리되도록 상태를 알려줘야 한다.
그리고 flush() 될때 이제 INSERT 가 된다.
JPA의 영속성 컨텍스트가 관리하는 객체의 값이 변경하는것을 감지하여 값이 변한다면 DB에 반영해준다.
JpaRepository는 CrudRepository로 부터 save method를 상속받는다.
틀린 사용법
@Transactional
fun saveEntity(id : Int, title: String) {
val myEntity = entityRepository.findById(id)
myEntity.setTitle(title)
entityRepository.save(myEntity) <- WRONG !
}
save를 하는 비용은 공짜가 아니다. save는 manage entitly의 merge를 호출하고 이는 CPU 싸이클이 할당되는 작업이다.
save() 는 매칭되는 모든 entity를 찾아서 overwrite 한다.
결론
정확한 이유는 아직 못찾았다.
새로운 엔티티를 생성하는 경우는 디비에 로우를 추가할수 있게 하기위해 .save를 써주는것 같고
기존의 값을 일부수정한는 경우에는 save를 하지 않아도 영속성컨텍스트에서 변경된 내용을 감지해서 해당 트랜잭션이 종료될 때 커밋해주는 것 같다.
기타
스프링부트는 Entity의 기본 CRUD가 가능하도록 JpaRepository 인터페이스를 제공한다.
그렇기에 간단하게 JpaRepository 인터페이스를 상속해서 사용할수 있는 것이다.
참고
https://vladmihalcea.com/best-spring-data-jparepository/
'개발 > 개발괴발' 카테고리의 다른 글
[HTTP] 그래서 PUT 이랑 PATCH 는 뭐가 다른건가요 - (2) (0) | 2022.10.05 |
---|---|
[HTTP] 그래서 PUT 이랑 PATCH 는 뭐가 다른건가요 - (1) (0) | 2022.10.04 |
모바일에서 로컬호스트 보기 (0) | 2021.10.31 |
벼락치기 자바스크립트 공부하기 (0) | 2020.11.09 |
이미지 처리가 날 눈물짓게 해 (feat. OpenCV) (0) | 2020.09.16 |