본문 바로가기
JPA/JPA 기초

JPA 정리(1) - 영속성 컨텍스트

by 옹알이옹 2023. 7. 17.

영속성 컨텍스트

이미지 없음

  • DB의 데이터들을 관리해주는 객체로 관리 해주는 주체
  • 단순하게 영속성 컨텍스트 == 1차캐시라고 생각
  • persist(entity)를 사용하여 영속성 컨텍스트에 저장
  • JPA를 통해 조회한 Entity들은 자동으로 영속성 컨텍스트에 등록된다. => 이미 DB에 있는 것들을 조회 한 것이기 때문에 commit을 해도 DB에 새로 등록되지 않는다.
  • 영속성 컨텍스트에 있는 Entity의 setter를 통해 값을 변경한 뒤 commit을 하면 DB에 동일한 ID(pk)를 가진 로우와 비교하여 달라진 부분에 대해 update를 실행,그렇기에 Entity의 setter메소드를 자제해야 한다. -> Dirty Checking

 

!중요 : persist() 함수가 DB에 저장하는 것이 아니라 단순 영속성 컨텍스트에 등록하는 것이고,

commit, flush 등을 통해 영속성 컨텍스트에 등록된 엔티티 중 DB에 없는 것들을 DB에 저장하는 것.

 

처음 JPA를 접했을 때 위의 개념을 가볍게 넘기고 토이 프로젝트를 진행 하였는데 정말 너무나 중요한 것이었다..

 

영속성 컨텍스트 플러시 하는 방법 : DB에 쿼리 실행

  1. em.flush() - 직접 호출
  2. 트랜잭션 커밋 - 플러시 자동 호출
  3. JPQL 쿼리 실행 - 플러시 자동 호출

플러시를 한다고 해도 1차 캐시가 날아가지는 않는다

 ✅ 아래와 같이 영속성 컨텍스트에 엔티티를 올리고 JPQL을 실행하면 커밋 전임에도 불구하고 쿼리가 실행됨

 

이미지 없음
이미지 없음

준영속 상태(영속성 컨텍스 → 비영속이 된것)

 ✅ 준영속 상태로 만드는 방법

  1. em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
  2. em.clear() : 영속성 컨텍스트를 완전히 초기화 (1차 캐쉬도 사라짐)
  3. em.close() : 영속성 컨텍스트를 종료

비영속

 ✅ 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태

 

* 해당 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 참조하여 작성하였습니다.

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

반응형