영속 컨텍스트란?
엔티티매니저 (Entity Manager)가 엔티티를 영구 저장하는 환경을 말한다.
영속 컨텍스트는 2가지의 저장소가 존재한다.
1. 1차캐시 저장소
2. 쓰기지연 SQL
1차캐시 저장소
Entity 를 persist()를하면 그림과같이 1차 캐시에 저장된다.
만약, 여기서 find() 조회가 일어난다면
DB에서 조회를 하지않고, entityManager에있는 1차캐시에 조회를 실시한다.
조회할 데이터가 1차캐시에 없다면 DB에서 조회를한다.
DB에서 조회를한 데이터를 1차캐시에 다시 저장해두고 반환을한다.
-> 나중에 또 다시 같은데이터를 조회할때 1차캐시에서 바로 반환하기위함이다.
---> 이 특징때문에 같은 Entity를 조회해도 동일성이 보장이된다.
2. 쓰기 지연 SQL 저장소
영속 컨텍스트는 쓰기 지연 SQL 저장소도 포함하고 있다.
이 SQL 저장소는 각종 SQL을 모아뒀다가, 트랜젝션이 Commit() 을할때 한번에 보내주는 역할을한다.
여기서 , 플러시 개념이 존재한다.
플러시란?
쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송하는 역할을한다.
플러시가 일어나는 메소드는 3가지가 있다.
1.em.flush()
2.transaction.commit()
3.JPQL 쿼리 실행
플러시에는 옵션이 하나 존재한다. FlushModeType.COMMIT을 설정하면,
커밋할때만 플러시가 일어나게할수있다. 이외 flush()와 JPQL로는 커밋이 일어나지않는다.
--------------------------------------------------------------------------------------------------
플러시를 하기전에 영속상태를 해제할수 도 있다.
영속상태에서 해제된 상태를 준영속 상태라고도 한다.
준영속상태로 만드는 방법은 3가지가 존재한다.
1.detach() 메소드로 해당 엔티티 해제하기
2.clear() 메소드로 영속성컨텍스트 초기화하기
3.close() 메소드로 영속성 컨텍스트 (엔티티 매니저)종료하기
이렇게 준영속상태로 만들어주면 더이상 영속성 컨텍스트가 관리를 하지않기때문에,
플러시, 커밋이 일어나도 쿼리가 생성되지않는다.
'자바 > 스프링(Spring)' 카테고리의 다른 글
스프링 @ModelAttribute 에 관하여 (0) | 2022.04.19 |
---|---|
스프링에서 로그(log) 찍기 (0) | 2022.04.19 |
웹 스코프(Scope)와 프록시 기술 (0) | 2021.12.31 |
스프링 빈 생명주기 (0) | 2021.12.26 |
스프링 : 원하는 타입의 빈 복수 조회하기 (0) | 2021.12.22 |