- 코딩 공부
JPA 영속성 관리 - 내부 동작 방식
방개입니다
2023. 5. 17. 00:25
JPA에서 가장 중요한 것
객체와 관계형 데이터베이스 메핑하기
영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
- 눈에 보이는것이 아니다 - 엔티티 매니저를 통해서 전달
영속성 컨텍스트의 이점
- 1차 캐시
- 동일성(Identity) 보장
- 트랜잭션을 지원하는 쓰기 지연 (Transactional write-behind)
- 변경 감지 (Dirty Checking)
- 지연 로딩 (Lazy Loading)
영속 에티티의 동일성 보장
1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
트루가 나온다.
쓰기지연 SQL 저장소에 저장해두다가
transaction.commit(); 트랜잭션 커밋을 해야지 인서트를 디비에 보낸다.
flush가 되면서 날라가고 commit이 되면서 된다.
더티체킹 = 변경감지
엔티티의 값을 바꿀려면 셋해서 바꿔서 업데이트 한 후 코드를 날려야되는데
그렇게 안해도 자동으로 된다.
영속성은 컨텍스트 단에 다 있다.
JPA는 데이터베이스를 커밋하는 시점에 내부적으로 Flush라는게 호출되는데
1차 캐시에는
@ID @ Entity @스냅샷
엔티티와 스냅샷을 비교한다. *스냅샷 = 최초로 1차캐시들어오는 스냅샷을 떠 놓는다.
지금같이 맴버 A값을 변경하면 JPA커밋되는 시점에 JPA가 이걸 다 비교한다.
Entity와 스냅샷을 일일이 다 비교한다.
플러시
영속성 컨택스트를 비우지 않음
영속성 컨텍슽의 변경내용을 데이터베이스에 동기화
트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨
JPA 데이터를 맞추거나 동기화는 데이터 트랜잭션에 위임해서 쓴다.
준영속 상태
영속 => 준영속
영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
영속성 컨텍스트가 제공하는 기능을 사용 못함
준영속 상태
- Detach
- 특정 엔티티만 준영속 상태로 전환
- Clear
- 영속성 컨텍스트를 완전히 초기화
- Close
- 영속성 컨텍스트를 종료