JPA/영속성 컨텍스트

Spring 영속성 컨텍스트

수달하나 2021. 7. 14. 15:37

JPA에서 가장 중요한 2가지

 

  • 객체와 관계형 데이터 베이스 매핑 (Object Relational Mapping)
  • 영속성 컨텍스트

웹 어플리케이션 개발시 EntityManager Factory가 고객의 요청에 따라서 EntityManager 를 생성하고 EntityManager를 통해서 데이터를 관리하게 된다.

 

영속성 컨텍스트

 

엔티티를 영구 저장하는 환경 : EntityManager.persist(entity); (눈에 보이는 개념은 아니다)

 

 

엔티티의 생명주기

  • 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  • 영속(managed): 영속성 컨텍스트에 관리되는 상태
  • 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed): 삭제된 상태

 

◆ 비영속 상태

 

객체를 생성만 한 상태. JPA 관계 없이 객체만 딱 생성한 상태

 

 

 영속 상태 

 

엔티티 메니저를 통해서 객체를 저장한 상태 ex) EntityManager.persist(entity);

 

 

영속성 컨텍스트의 장점

  • 1차 캐시 : DB 확인 전 캐시에 저장되어 있는 데이터를 확인 후 저장되어 있으면 가져옴. 큰 이점은 아님.
  • 동일성(identity) 보장
  • 트랜잭션을 지원하는 쓰기 지연(Transactional write-begind)
  • 변경 감지(Dirty Checking) : 실시간 변경을 감지한다.
  • 지연 로딩(Lazy Loading)

 

객체를 영속성 컨텍스트에 저장할 때 1차 캐시에 저장이 된다. 동시에 jpa가 엔티티를 분석하고 쓰기 지연 sql 저장소에도 저장을 한다. 이후 다른 인스턴스를 생성했을 때 같은 과정을 반복하고 트랜잭션을 commit 하는 시점에 쓰기 지연 sql 저장소에 있던 데이터들이 한꺼번에 실제 db로 들어가게 된다.

 

※ 플러시(flush) : 쓰기 지연 sql 저장소에 있던 데이터들이 실제 데이터베이스로 저장되는 행위. 데이터 베이스로 저장된다고 해서 영속성 컨텍스트를 비우는 것은 아니다. 

 

 

 준영속 상태

 

영속 → 준영속

영속 상태의 엔티티가 영속성 컨텍스트에서 분리 되는 상황