본문 바로가기
Spring

Spring 기초 7 (Entitiy 상태) (Entitiy 영속/비영속 기능)

by sehunbang 2024. 1. 20.

1. Entity의 상태

 

 

비영속(Transient)

 

쉽게 말하자면 new 연산자를 통해 인스턴스화 된 Entity 객체를 의미합니다.

아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않습니다.

 

영속화(Managed)

.persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만듭니다

 

 

준영속(Detached) (not managed)

.detach( entity )

영속성 컨텍스트에 저장되어 관리되다가 분리된 상태를 의미합니다

분리 된 상태여서 객체의 값을 바꾸어도 업데이트 되지 않음 (Dirty Checking 없음)

 

영속 상태에서 준영속 상태로 바꾸는 방법 :

 

.detach(entity) : 특정 Entity만 준영속 상태로 전환.

.clear() : 컨텍스트를 초기화.

.close() : 컨텍스트를 종료.

 

준영속 상태에서 다시 영속 상태로 바꾸는 방법:

 

merge( entity ) : 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환합니다.

  • Entity의 식별자 값으로 영속성 컨텍스트를 조회합니다.
    1. 해당 Entity가 영속성 컨텍스트에 없다면?
      1. DB에서 새롭게 조회합니다.
      2. 조회한 Entity를 영속성 컨텍스트에 저장합니다.
      3. 전달 받은 Entity의 값을 사용하여 병합합니다.
      4. Update SQL이 수행됩니다. (수정)
    2. 만약 DB에서도 없다면 ?
      1. 새롭게 생성한 Entity를 영속성 컨텍스트에 저장합니다.
      2. Insert SQL이 수행됩니다. (저장)

따라서 merge(entity) 메서드는 비영속,

준영속 모두 파라미터로 받을 수 있으며 상황에 따라 저장을 할 수도 ‘수정을 할 수도 있습니다.

//

 

삭제(Removed)

.remove(entitiy); 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환합니다.

( commit 후 Delete SQL이 DB에 요청되었습니다. )