- 엔티티를 영구 저장하는 환경이라는 뜻으로, 자바 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 역할을 한다.
엔티티 매니저 팩토리란 무엇인가요?
- 엔티티 매니저를 만드는 공장
- DB를 하나만 사용하는 애플리케이션은 일반적으로 엔티티 매니저 팩토리를 하나만 생성한다.
- 이렇게 1개마 만들어서 애플리케이션 전체에서 공유하도록 설계되어 있다.
엔티티 매니저란 무엇인가요?
- 엔티티를 저장하고, 수정하고, 조회하고, 삭제하는 등 엔티티와 관련된 모든일(엔티티의 생명주기 포함)을 한다.
- 비영속 상태 : 영속성 컨텍스트와 전혀 관계가 없는 상태
- 영속 상태 : 영속성 컨텍스트에 저장된 상태
- 준영속 상태 : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제 : 영속성 컨텍스트와 DB에서 삭제된 상태
- 영속성 컨텍스트는 식별자 값으로 엔티티를 구분하고, 영속 상태에서는 식별자 값이 반드시 있어야 한다. 만약, 식별자 값이 없으면, 예외가 발생한다.
- 엔티티를 영속성 컨텍스트에 저장하면, JPA는 보통 트랜잭션을 commit 하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 바영한다. -> Flush
- 영속성 컨텍스트의 변경 내용을 DB에 반영한다. 이떄, 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 것이지, 영속성 컨텍스트에 보관된 엔티티를 지운다고 생각해서는 안된다.
- 영속성 컨텍스트를 flush 하는 3가지 방법 방법 1. em.flush()를 직접 호출한다. 방법 2. TX commit시, flush가 자동 호출된다. 방법 3. JPQL 쿼리 실행시, flush가 자동 호출된다.
- flush 실행하면, 다음과 같이 동작한다.
- 변경 감지가 동작해서, 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾는다.
- 수정된 엔티티는 수정 쿼리르 만들어 쓰지 지연 SQL 저장소에 등록한다.
- 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송한다.
- 1차 캐시
- 동일성 보장
- TX를 지원하는 쓰기 지연
- 변경 감지
- 지연 로딩
- 영속성 컨텍스트를 사용하면 엔티티 관리 및 생명주기 관리에 관한 복잡성이 추가될 수 있다.
- 이로 인해 관리 포인트가 늘어날 수 있으며, 이를 잘못 이해하거나 관리하지 않으면 버그가 발생할 수 있다.