[JPA] 영속성 컨텍스트 (persist context)

김형진·2023년 4월 9일
0
post-thumbnail

JPA에는 영속 컨테이너라는 개념이 존재한다.

EntityManager를 통해 관리되는 객체는, 생성 혹은 변경 시 곧바로 DB에 반영되는 것이 아니라, 트랜잭션이 끝나는 시점(혹은 JPQL이 호출되기 이전)에 반영이 된다.

예를 들어,

@Transactional
public void test(){
	Member member = new Member(1L, "member1");
	em.persist(member);  //em = EntityManager 인스턴스
	member.changeMemberName("멤버1")
}

에서 em의 persist 메소드가 호출된 시점에 DB에 insert쿼리가 실행되고
changeMemberName메소드가 호출된 시점에 update쿼리가 실행됐을 것 같지만,
사실 트랜잭션이 끝나는 시점인 test메소드가 종료되는 시점에 insert와 update가 한 번에 이뤄진다.

이게 가능한 이유는 JPA는 영속성 컨텍스트라는 개념을 사용하기 때문인데, 쉽게 말해 엔티티가 DB에 반영되기 이전 하나의 단계가 더 있는 것이다.

업로드중..

persist 호출을 통해 영속성 컨텍스트로부터 관리를 받게 된 엔티티는 이후 엔티티에 변경이 생기면 영속 컨텍스트 내의 sql저장소에 update쿼리가 저장되어 commit시 한 번에 반영된다.

추가로, 엔티티의 변경을 감지하고 update sql을 저장할 수 있는 이유는, 영속 컨텍스트 내에 (DB로부터 엔티티를 조회해온 시점의)엔티티 상태를 저장하는 스냅샷이 있기 때문이다.

영속 컨텍스트에서는 flush(DB에 반영)이 발생하면 sql저장소 내의 sql들을 DB로 날려보내기 전 dirty check 라고 하는 엔티티 변경 감지 단계를 거치게 되는데,
이 때 컨텍스트 내에 저장된 이전에 엔티티 상태를 저장한 스냅샷과 현재 엔티티 상태를 비교하여 변경이 감지되면 update쿼리를 sql저장소에 추가로 저장한 뒤 DB에 반영하고 commit한다.

출처 : 인프런 김영한 - https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

profile
히히

0개의 댓글