[JPA] Entity의 4가지 상태
하이 ... 오늘은 엔티티의 4가지 상태를 나타내는 Entity의 생명주기를 정리해 두려고 한다.
Entity LifeCycle
1. 비영속 상태 (new / transient)
Book book = new Book(); // 단순하게 객체로 생성된 상태임.
- 순수한 객체 상태
- 영속성 컨텍스트와 관련이 아예 없는 상태를 의미
2. 영속 상태 (managed)
em.persist(book); // 객체를 영속성 컨텍스트에 저장한 상태
- EntityManager를 통해 엔티티를 영속성 컨텍스트에 저장한 상태
- 영속성 컨텍스트가 해당 엔티티를 관리하게 된 상태임
3. 삭제 (removed)
em.remove(book); // 영속성 컨텍스트, db에서 삭제
- 엔티티를 영속성 컨텍스트와 db에서 삭제한 상태
4. 준영속 상태 (detached)
em.detach(book); // 저장된 엔티티를 분리한 상태가 됨
- 영속성 컨텍스트에 저장되었다 다시 분리된 상태
- 더이상 영속성 엔티티가 관리하지않기에 1차 캐시 등에서 모든 정보가 삭제됨.
- 실무에서 잘사용하지 않음
em.close(); // 영속성 컨택스트 닫기
- 영속성 컨텍스트를 종료
- 관리하던 모든 엔티티가 준영속 상태가 되어 버림
em.clear(); // 영속성 컨텍스트 초기화
- 영속성 컨텍스트를 초기화 시킴 (새로 만든 영속성 컨텍스트의 상태와 동일함)
- 모든 엔티티가 준영속상태가 됨
- 1차 캐시에 관계없는 쿼리를 확인하고 싶을 때 사용 (직접 db에 쿼리를 날리게 됨)
- 준영속 상태의 경우 거의 비영속 상태와 비슷하마. 차이가 있다면 준영속 상태는 식별자를 보유하고 있음
- 준영속 상태일 때는 지연 로딩이 불가함 ( 프록시 객체 로딩 뒤 영속성 컨텍스트에서 데이터 불러올때 문제 발생)
Book book = em.merge(book);
- 준영속 상태의 엔티티를 다시 영속 상태로 변환
- 파라미터로 넘어온 엔티티의 식별자 값으로 영속성 컨텍스트 조회해서 찾아와 영속 상태로 변환
- 없으면 db 에서 조회하고 영속상태로 변환
- 그래도 없으면 새로운 엔티티 생성
- 불러온 엔티티와 파라미터로 넘긴 객체가 값이 다르면 값을 채우고 병합이 이루어짐
- 업데이트 시에는 merge 보다는 변경 감지를 이용하는게 좋음 ( 만약에 값을 안넣고 merge 해버리면 ... null 이 db에 들어가게 됨)
- 트랜잭션이 있는 서비스 계층에 식별자와 변경할 데이터를 명확하게 전달하고
- 서비스에서 id 로 find 해온 뒤 select 하고, 그 영속성 엔티티에 set을 수행해서 변경감지를 수행해야함.