본문 바로가기
Develop/Spring

[JPA] Entity의 4가지 상태

by 코딩의성지 2021. 8. 8.

하이 ... 오늘은 엔티티의 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을 수행해서 변경감지를 수행해야함.

반응형

댓글