Cute Running Puppy
본문 바로가기
개발일기/Java

영속성 컨텍스트

by 징구짱 2023. 3. 4.
728x90

영속성 컨텍스트
  • 엔티티를 영구 저장 하는 환경
  • 어플리케이션이 데이트베이스에서 꺼내온 데이터 객체를 보관하는 역할
  • 엔티티 매니저마다 개별적으로 부여되는 논리적 공간
  • 데이터 어플리케이션의 단의 동일성을 보장

자바의 엔티티 객체를 엔티티 매니저마다 가지고 있는 영속성 컨텍스트라는 공간에다 넣고 빼고 하면서 사용

 

 

JPA 엔티티의 상태
  • 비영속
    영속성 컨택스트와 관계가 없는 새로운 상태
    해당 객체의 데이터가 변경되거나 말거나 실제 DB 데이터와는 관련 없고 그냥 Java 객체인 상태
  • 영속
    엔티티 매니저를 통해 엔티티가 영속성 컨텍스트에 저장되어 관리되고 있는 상태
    이와같은 경우 데이터의 생성, 변경등을 JPA가 추적하면서 필요하면 DB에 반영
  • 준영속
    영속성 컨택스터에서 관리되다가 분리된 상태
    • 엔티티를 영속성 컨택스트에서 분리 em.detach(minsook);
    • 영속성 컨텍스트를 비우기 em.clear();
    • 영속성 컨택스트를 종료 em.close();
  • 삭제
    영속성 컨택스트에서 삭제된 상태

 

1차 캐시
  • 사용이유
    DB를 이용하는 작업은 부하와 비용이 심한 작업 (자주하는 것을 줄여야함)

  • 사용순서
    • 영속성 컨텍스트 내부에 1차캐시를 둠
    • find 로직 진행시 1차캐시 조회
    • 있으면 해당 데이터 반환 없을때만 select
    • 반환하기 전 1차캐시에 저장하고 반환

 

 

쓰기 지연 SQL 저장소

엔티티를 생성할 때 마다 DB를 다녀오는것은 비효율적
→여러번 DB를 방문하지 않도록 내부에 쓰기 지연 SQL 저장소를 둠

 

  • 사용 순서
    • 엔티티 객체들을 영속화
    • entityManager.commit() 메서드를 호출하면  내부적으로 쓰기 지연 SQL저장소에서 Flush 함
      -> Insert A, Insert B와 같은 쓰기 전용 쿼리들이 DB로 흘러감
    • commit 명령을 통해 흘려보낸 SQL문을 반영시킴

 

 

DirtyChecking

데이터의 변경을 감지하여 자동으로 수정

JPA는 1차캐시와 쓰기지연 SQL 저장소를 이용해서 변경과 수정을 감지

  • 사용 순서
    • JPA가 조회시점에 데이터 정보를 같이 저장(스탭샷)
    • 조회 시점의 데이터와 영속화한 entity 객체를 비교
    • 변경이 감지된 부분을 DB에 반영시킬 수 있는 SQL UPDATE문을 쓰기 지연 저장소에 저장해놓음
728x90

'개발일기 > Java' 카테고리의 다른 글

스프링부트 Swagger 사용법  (0) 2023.03.09
스프링부트 jwt토큰 사용 시 설정  (0) 2023.03.04
IntelliJ 프로젝트 자동 실행  (1) 2023.02.28
Postman 사용  (0) 2023.02.27
JPA 기초 예제  (0) 2023.02.26