희디비
[JPA] 영속성 컨텍스트(entityManager) 본문
💡 영속성 컨텍스트란?
'엔티티를 영구 저장 하는 환경' 이라는 의미 입니다.
엔티티 매니저로 엔티티를 저장하거나 조회하면 영속성 컨텍스트에 엔티티를 저장하고 관리합니다.
🙄 영속성 컨텍스트 사용 이점
1차 캐시
동일성 보장
트랙잭션을 지원 하는 쓰기 지연
변경 감지
지연 로딩
📝 1차 캐시
1차 캐시 등록된 entity 조회 시 :
DB에서 가져 오는 것이 아닌 1차 캐시에서 가져 옵니다.
-> DB 접근 횟수가 적습니다.
트랜잭션의 flush() 호출 시 :
현재 객체의 상태와 비교 하여 다른 부분을 체크 하여 SQL을 작성합니다.
-> 객체의 상태가 변경 될때 SQL을 작성 하지 않아도 됩니다. (변경 감지)
(1차 캐시는 처음 영속 상태가 된 entity의 스냅샷을 가지고 있습니다.)
📝 동일성 보장
객체 조회 시 ( 1차 캐시에 없을 경우 ) :
DB에서 조회하여 해당 객체를 1차 캐시에 등록 합니다.
등록한 Entity의 참조를 반환 하기 때문에 1차 캐시 참조 == (동일성) 반환된 참조 입니다.
같은 객체를 두번 조회 시 :
DB에서 조회하여 1차 캐시에 등록, 반환 합니다.
같은 객체 조회 요청시 1차 캐시에 있는 entity의 참조를 반환 합니다.
📝 트랜잭션을 지원 하는 쓰기 지연 / 변경 감지
em.persist(member); // meber.age = 2
member.setAge(20)
JPA는 한 트랜잭션 안에서 flush()를 호출 할때 SQL을 DB에 전송 합니다.
이는 변경 감지와 연관 있습니다.
기존:
member.setAge(20) -> update 쿼리를 작성 하여 column을 바꿔야 합니다.
JPA:
트랜잭션의 commit 단계의 flush()를 호출 할때, 1차 캐시에 처음 등록 된 member의 상태와
현재 member 의 상태를 비교하여 다를 경우 update 쿼리를 작성 해줍니다.
(JPA는 기본 전략 으로 모든 필드를 업데이트 합니다.)
이점 :
트랜잭션의 마지막 변경 상태를 기준으로 쿼리를 자동 작성 해주기 때문에
개발자는 별도의 쿼리문을 안 써도 되는 이점이 있습니다.