2022-08-15 22:12:54
Spring JPA를 다루는 자바 개발자가 알아야 할 핵심요소인 영속성컨텍스트에 대해 간단히 짚고 넘어가려 합니다. (저 자신도 정리 할겸)
JPA에서 영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 뜻입니다.
애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 합니다. 엔티티 캐시
로도 불립니다.
EntityManagerFactory
로 생성된 EntityManager
에 의해 영속성컨텍스트는 관리됩니다.
즉, 엔티티를 em.persist
를 하여 EntityManager
에 영속된 순간 영속성컨텍스트에 의해 관리되기 시작한다고 보면 될 것 같습니다.
자바 어플리케이션과 데이터베이스 사이에서 엔티티를 관리해주는 중간 관리자 정도로 이해하고 넘어가겠습니다.
EntityManager
에 의해 관리되지 않는 상태입니다.EntityManager
에 의해 관리되며, 영속성컨텍스트에 저장된 상태입니다.em.persist(엔티티)
em.detach
를 통해 영속성컨텍스트에서 분리된 상태입니다.em.remove(엔티티)
<id, ENTITY>
형태로 저장되어 있습니다.EntityManager
의 flush() 나 트랜잭션의 commit 을 통해 한번에 보내지게 됩니다.EntityManager
의 flush 시점에 미리 작성해 둔 스냅샷과 엔티티를 비교해서 변경된 엔티티의 내용을 감지합니다.Dity Checking의 흐름
- 트랜잭션을 커밋하면
EntityManager
의 내부에서 먼저 플러시가 호출됨.- 엔티티와 스냅샷을 비교하여 변경된 엔티티를 찾음.
- 변경된 엔티티가 있으면 수정 쿼리를 생성하고 쿼리저장소(쓰기 지연 SQL 저장소)에 저장.
- 쿼리저장소에 저장된 SQL들을 flush 함.
- 트랜잭션 커밋을 통해 데이터베이스에 영구적으로 반영.
Persistable
을 구현하여 isNew를 true로 만들어 주는 방법입니다. @Override
public boolean isNew() {
return createDate == null;
}
@CreatedDate
을 통해 생성한 createdDate는 null이 될 수 없고, 새롭게 생성된 엔티티는 persist 하기 전에는 null 일 수 밖에 없기 때문에(해당 시점에 JPA가 직접 할당) isNew 변수를 true/false인지 쉽게 판단할 수 있게 됩니다.참고사이트 :
https://leegicheol.github.io/jpa/jpa-is-new/
https://huisam.tistory.com/entry/persistContext
https://binco.tistory.com/entry/JPA-%EC%98%81%EC%86%8D%EC%84%B1%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%A0%95%EC%9D%98-%ED%95%B5%EC%8B%AC%EC%9A%94%EC%95%BD