- 코딩 공부

JPA 영속성 관리 - 내부 동작 방식

방개입니다 2023. 5. 17. 00:25

 

JPA에서 가장 중요한 것 

객체와 관계형 데이터베이스 메핑하기 

영속성 컨텍스트 

  •    엔티티를 영구 저장하는 환경 
  •    눈에 보이는것이 아니다 - 엔티티 매니저를 통해서 전달 

 

 

영속성 컨텍스트의 이점 

  1. 1차 캐시 
  2. 동일성(Identity) 보장 
  3. 트랜잭션을 지원하는 쓰기 지연 (Transactional write-behind) 
  4. 변경 감지 (Dirty Checking)
  5. 지연 로딩 (Lazy Loading)

 

영속 에티티의 동일성 보장  

 

1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공 

트루가 나온다. 

 

 

쓰기지연 SQL 저장소에 저장해두다가 

transaction.commit(); 트랜잭션 커밋을 해야지 인서트를 디비에 보낸다. 

 

flush가 되면서 날라가고 commit이 되면서 된다. 

 

더티체킹 = 변경감지 

엔티티의 값을 바꿀려면 셋해서 바꿔서 업데이트 한 후 코드를 날려야되는데 

그렇게 안해도 자동으로 된다. 

 

영속성은 컨텍스트  단에 다 있다. 

JPA는 데이터베이스를 커밋하는 시점에 내부적으로 Flush라는게 호출되는데 

 

1차 캐시에는 

@ID @ Entity @스냅샷 

엔티티와 스냅샷을 비교한다. *스냅샷 = 최초로 1차캐시들어오는 스냅샷을 떠 놓는다. 

지금같이 맴버 A값을 변경하면 JPA커밋되는 시점에 JPA가 이걸 다 비교한다. 

Entity와 스냅샷을 일일이 다 비교한다. 

 

 

플러시 

영속성 컨택스트를 비우지 않음 

영속성 컨텍슽의 변경내용을 데이터베이스에 동기화 

트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨 

 

JPA 데이터를 맞추거나 동기화는 데이터 트랜잭션에 위임해서 쓴다. 

 

 

준영속 상태 

영속 => 준영속 

영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached) 

영속성 컨텍스트가 제공하는 기능을 사용 못함 

 

준영속 상태 

  1. Detach 
    • 특정 엔티티만 준영속 상태로 전환 
  2. Clear 
    • 영속성 컨텍스트를 완전히 초기화 
  3. Close 
    • 영속성 컨텍스트를 종료