본문 바로가기

SearchDeveloper/Java

[JPA] 영속성 컨텍스트(Persistence Context) : 엔티티 관리 공간

영속성 컨텍스트(Persistence Context)

  • 엔티티를 관리하는 논리적인 공간이다.
  • DB 와의 동기화를 위해 엔티티 변경 정보를 관리한다. 
  • 엔티티를 등록, 해제할 수 있어 그 상태를 관리하는 엔티티 생명주기가 존재한다.
 
영속성 컨텍스트

엔티티 생명 주기

entity 생명주기
  • em.persist(member); 를 하면 Member 객체가 영속성 컨텍스트에 등록되어 commit 시 CRATE 쿼리로 변환해 실행하여 DB와 동기화를 한다.
  • persist() 호출 전인 객체(비영속) 나 detached(준영속)나 removed(삭제) 된 엔티티는 아무리 setter로 데이터를 변경하거나 무슨 짓을 해도 DB 에 반영되지 않는다. 영속성 컨텍스트는 그 사실을 모르기 때문이다.
  • flush(): 영속성 컨텍스트와 DB 를 동기화하는 메소드

쓰기 지연

  • JPA는 엔티티가 변경된다고 해서 바로바로 DB에 반영되는게 아니라 변경 사항을 영속성 컨텍스트에 저장한다.
  • 트랜잭션이 commit 될 때 비로소 영속성 컨텍스트의 정보를 활용해 DB 쿼리를 생성하여 실행한다.
쓰기 지연

영속성 컨텍스트의 구성 요소: 1차 캐시 

Member member = em.find(Member.class, "1");
Member member1 = em.find(Member.class, "1");

member == member1 인 이유

  • 영속성 컨텍스트 에는 1차 캐시가 존재한다.
  • find() 가 호출되면 캐시에서 먼저 찾고 없으면 DB 에서 가져와 캐시에 담는다.
  • id가 "1" 인 엔티티는 한 번 가져온 이력이 있으므로 cache hit 이 발동해 동일한 엔티티를 반환하는 것이다.
 
 

1차 캐시

 

영속성 컨텍스트의 구성 요소: 스냅샷 

update 방식

  • 영속상태(영속성 컨텍스트에 들어간 엔티티) 는 객체 setter() 만 호출해도 영속성 컨텍스트 안 캐시 데이터가 변경된다. 이것을 변경 감지라고 한다. 
  • commit이 실행되면 엔티티 초기값을 저장한 스냅샷과 엔티티를 비교해 다르면 UPDATE 쿼리 생성 후 실행한다.
스냅샷
 

[JPA] 영속성 컨텍스트(Persistence Context) : 엔티티 관리 공간

 

레퍼런스

자바 ORM 표준 jpa 프로그래밍 책

글 읽어주셔서 언제나 감사합니다. 좋은 피드백, 개선 피드백 너무나도 환영합니다.