1. 영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
- 엔티티 매니저를 통해서 영속성 컨텍스트에 접근함
- 논리적인 개념
2. 엔티티의 생명주기
- 비영속
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- 영속
영속성 컨텍스트에 관리되는 상태
- 준영속
영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제
삭제된 상태
3. 영속성 컨텍스트의 이점
- 1차 캐시
1차 캐시에서 조회 : DB를 직접 조회하는 것이 아닌 1차 캐시에서 조회하는 것
데이터베이스에서 조회 : 1차 캐시에 없으면 DB에서 조회 후 1차 캐시에 저장하고 반환함
--> JPA는 엔티티를 조회하면 영속성 컨텍스트에 올림
- 동일성 보장
같은 트랜잭션 안에서 1차 캐시로 읽으면 동일성을 보장함
- 트랜잭션을 지원하는 쓰기 지연
엔티티 매니저로 persist해도 INSERT SQL을 데이터베이스에 보내지 않고 트랜잭션을 커밋하는 순간 보냄
- 변경 감지
(1) flush() (commit시 호출)
(2) 엔티티와 스냅샷 비교
: 엔티티와 스냅샷(값을 읽어온 최초 시점의 상태)을 비교하여 바뀌었으면 반영
(3) UPDATE SQL 생성
(4) flush
(5) commit
JPA는 값을 바꾸면 트랜잭션이 commit 되는 시점에 변경을 반영함
4. 플러시
영속성 컨텍스트의 변경내용을 데이터베이스에 반영
* 플러시 발생
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
* 영속성 컨텍스트를 플러시하는 방법
- em.flush() 직접 호출
query가 DB에 바로 반영 (1차 캐시 유지)
- 트랜잭션 커밋 -> 플러시 자동 호출
- JPQL 쿼리 실행 -> 플러시 자동 호출
플러시는
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요함 -> 커밋 직전에만 동기화하면 됨
5. 준영속 상태
- 영속 상태의 엔티티가 영속성 컨텍스트에서 분리 (detached)
- 영속성 컨텍스트가 제공하는 기능을 사용하지 못함 (update, dirty checking 불가능)
* 준영속 상태로 만드는 방법
- em.detach(entity)
: 특정 엔티티만 준영속 상태로 전환
- em.clear()
: 영속성 컨텍스트를 완전히 초기화
: EntityManager 안의 영속성 컨텍스트를 모두 지움 (1차 캐시를 지움)
- em.close()
: 영속성 컨텍스트를 종료
: 더이상 관리X, 데이터 변경해도 변경되지 않음
'학습' 카테고리의 다른 글
[Java] JPA 강의 - 5 (연관관계 매핑 기초) (0) | 2024.01.18 |
---|---|
[Java] JPA 강의 - 4 (엔티티 매핑) (0) | 2024.01.17 |
[Java] JPA 강의 - 1, 2 (JPA 소개) (0) | 2024.01.11 |
[Java] Arrays 클래스 (0) | 2023.10.17 |
[Java] Stack & Queue (0) | 2023.10.16 |