영속성 컨텍스트
- 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에 쿼리 실행
- em.flush() - 직접 호출
- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출
플러시를 한다고 해도 1차 캐시가 날아가지는 않는다
✅ 아래와 같이 영속성 컨텍스트에 엔티티를 올리고 JPQL을 실행하면 커밋 전임에도 불구하고 쿼리가 실행됨
준영속 상태(영속성 컨텍스 → 비영속이 된것)
✅ 준영속 상태로 만드는 방법
- em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
- em.clear() : 영속성 컨텍스트를 완전히 초기화 (1차 캐쉬도 사라짐)
- em.close() : 영속성 컨텍스트를 종료
비영속
✅ 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
* 해당 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 참조하여 작성하였습니다.
반응형
'JPA > JPA 기초' 카테고리의 다른 글
[JPA] 프록시 객체와 지연로딩 정리 (0) | 2023.08.27 |
---|---|
JPA 정리(3) - 연관관계, 양방향 매핑 (0) | 2023.07.17 |
JPA 정리(2) - 스키마 생성 및 제약 조건 (0) | 2023.07.17 |