[TIL] 230701 Spring: 영속성 컨텍스트 기능, 상태

CountryGirl·2023년 7월 1일
0

TIL

목록 보기
13/80

📌 영속성 컨텍스트 기능

1. 1차 캐시 기능: Map 자료구조 ➡️ 효율적으로 관리
2. 쓰기 지연 저장소(ActionQueue): DataBase의 트랜젝션처럼 Query를 담고 있다가 Transaction Commit 을 하면서 한번에 반영한다.
3. 변경감지(Dirty Checking): 최초상태(loaded state)와 현재 상태를 비교해서 변경 내용이 있다면 UpdateQeury 를 발생한다.
(이때, 비교는 트랜잭션 commit 을 호출한 다음 flush method 가 호출되면서 비교한다)

1차 캐시 기능

내부적으로 캐시 저장소를 가지고 있다.
Entity 객체들이 1차 캐시 저장소에 저장되고 key에는 @Id 로 매핑한 식별자 값을 저장하고,
value 에는 해당 Entity 클래스의 객체를 저장한다.
🚨 식별자값을 사용하여 Entity 객체를 구분하고 관리한다.

쓰기 지연 저장소 (ActionQueue)

SQL 을 모아두고 있다가 트랜잭션 commit 후에 한 번에 DB에 반영한다.

flush()

트랜잭션 commit 이후 flush() 메서드가 호출되어 영속성 컨텍스트의 변경 내용들을 DB 에 반영하는 역할을 수행한다.
즉, 쓰기 지연 저장소의 SQL들을 DB에 요청하는 역할을 수행한다.

변경 감지 (Dirty Checking)

  1. JPA 는 영성속 컨텍스트에 Entity 를 저장할 때 최초 상태 (Loaded State) 를 저장한다.
  2. 트랜잭션이 commit 되고 flush 가 호출되면 Entity의 현재 상태와 저장한 최초 상태를 비교한다.
  3. 변경 내용이 있다면 Update SQL 을 생성하여 쓰기 지연 저장소에 저장하고 모든 쓰기 지연 저장소에 SQL 을 DB 에 요청한다.
  4. DB 의 트랜잭션이 commit 되면서 반영된다.

📌 상태

영속 상태

비영속 상태

: JPA 가 관리하고 있는 Entity Class가 아니고 순수한 Entity Class 상태

관리되게 하고 싶은 Entity Class 객체를 persist() 로 영속성 컨텍스트에 저장하게 한다.

  1. 비영속 상태의 Entity 를 EntityManager 를 통해 영속성 컨텍스트에 저장하여 관리되는 상태로 만들어준다 == 영속상태

👾 Debug (persist 호출 후)
em ➡️ persistenceContext ➡️ entityEntryContext ➡️ nonEnhancedEntityXref
➡️ value ➡️ entityEntry : (MANAGED)

(MANAGED) 라고 상태가 표시되어있으면 관리되고 있는 객체이다.

준영속 상태

: 영속성 컨텍스트에 의해서 저장되어 관리가 되다가 분리된 상태
1. detach method
2. clear method
3. close method

🚨 영속된 상태일 때만 변경감지 (Dirty Checking) 이 진행된다.

detach()

: 특정 entity 를 준영속 상태로 전환한다.

clear()

: 호출하게 되면 컨텍스트를 완전히 초기화한다. 영속성 컨텍스트에 들어있던 모든 Entity를 전부 준영속 상태로 만든다.

close()

: clear() 는 비우고 다시 사용할 수 있지만 close() 완전히 종료시켜버린다.

준영속 상태 ➡️ 영속성 상태

merge()
: 전달받은 Entity를 사용해 새로운 영속 상태의 Entity를 반환한다.

전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회한다.

  • 해당 Entity가 영속성 컨텍스트에 없다면?
    1. DB를 조회
    1. 조회한 Entity를 영속성 컨텍스트에 저장
    2. 전달받은 Entity 값을 사용해 병합
    3. Update SQL 수행 ➡️ 수정
    • 만약 DB 에도 없다면?
    1. 새롭게 생성한 Entity를 영속성 컨텍스트에 저장한다.
    2. Insert SQL 수행 ➡️ 저장 (새로 저장)
profile
💻🌾시골소녀의 엉망징창 개발 성장일지🌾💻 (2023.05.23 ~)

0개의 댓글