Persistence Context
정의 : 인스턴스로 존재하는 엔티티를 관리하고 영속화시키는 논리적 영역
특징
- 엔티티를 관리하고 필요에 따라 DB의 데이터를 저장, 조회, 수정, 삭제(EntityManager)
- 크게 1차 캐시 저장소와 쿼리문 저장소로 나뉨
- 비영속, 영속, 준영속, 삭제 상태가 있음
1차 캐시 저장소
역할 : persistence context가 관리하는 엔티티 정보를 보관
특징
- 엔티티에 대한 스냅샷을 같이 저장하여 엔티티의 변경을 감지
쿼리문 저장소
역할 : 수행할 쿼리문을 저장
특징
- 여러 쿼리를 모아두어 DB에 대한 접근을 줄이기 때문에 성능상에 이점이 생김
- EntityManager의 flush()를 이용해 쿼리문을 DB에 적용
비영속 상태
- persistence context와 관련없는 상태의 엔티티
영속 상태
- persistence context에서 관리되는 상태의 엔티티
- DB에 저장될 가능성이 있는 상태의 엔티티
- persist()를 이용해 비영속 상태의 엔티티가 영속 상태로 변함
- inset 쿼리문이 쿼리문 저장소에 저장
- flush() 시에 DB에 엔티티가 반영(엔티티는 남아있고, 쿼리문만 사라짐)
- find()로 DB에서 엔티티를 찾아오면 영속 상태로 1차 캐시 저장소에 보관
- 이미 1차 캐시 저장소에 보관하는 엔티티를 찾으면 DB에 접근하지 않음
준영속 상태
- persistence context에서 관리되었지만 현재는 관리되지 않는 상태의 엔티티
- merge()를 이용해 준영속 상태의 엔티티를 영속 상태로 변경
- detach()를 이용해 영속 상태의 엔티티를 준영속 상태로 변경
- clear()를 이용해 persistence context 전체를 초기화
- close()를 이용해 persistence context를 닫음
삭제 상태
- persistence context에서 관리되지 않으며 DB에서 제거된 상태의 엔티티
- 1차 캐시 저장소에서 엔티티가 제거되고, 쿼리문 저장소에 delete 쿼리문이 저장
- flush() 전까지는 DB에 반영 안됨
참고자료