1. 1차 캐시 기능: Map 자료구조 ➡️ 효율적으로 관리
2. 쓰기 지연 저장소(ActionQueue): DataBase의 트랜젝션처럼 Query를 담고 있다가 Transaction Commit 을 하면서 한번에 반영한다.
3. 변경감지(Dirty Checking): 최초상태(loaded state)와 현재 상태를 비교해서 변경 내용이 있다면 UpdateQeury 를 발생한다.
(이때, 비교는 트랜잭션 commit 을 호출한 다음 flush method 가 호출되면서 비교한다)
내부적으로 캐시 저장소를 가지고 있다.
Entity 객체들이 1차 캐시 저장소에 저장되고 key
에는 @Id
로 매핑한 식별자 값을 저장하고,
value
에는 해당 Entity 클래스의 객체를 저장한다.
🚨 식별자값을 사용하여 Entity 객체를 구분하고 관리한다.
SQL 을 모아두고 있다가 트랜잭션 commit 후에 한 번에 DB에 반영한다.
flush()
트랜잭션 commit 이후 flush()
메서드가 호출되어 영속성 컨텍스트의 변경 내용들을 DB 에 반영하는 역할을 수행한다.
즉, 쓰기 지연 저장소의 SQL들을 DB에 요청하는 역할을 수행한다.
: JPA 가 관리하고 있는 Entity Class가 아니고 순수한 Entity Class 상태
관리되게 하고 싶은 Entity Class 객체를 persist()
로 영속성 컨텍스트에 저장하게 한다.
👾 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의 식별자 값으로 영속성 컨텍스트를 조회한다.