본문 바로가기
컴퓨터 프로그래밍/Spring

[Spring] Entity 의 상태

by 한33 2024. 8. 21.

* 비영속

  • 쉽게 말하자면 new 연산자를 통해 인스턴스화 된 Entity 객체를 의미
  • 아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않음
  • 비영속 상태는 JPA가 관리하지 못하기 때문에 해당 객체의 데이터를 변경해도 변경 감지가 이루어지지 않음

* 영속

 

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

비영속 상태는 JPA가 관리하지 못하기 때문에 해당 객체의 데이터를 변경해도 변경 감지가 이루어지지 않음


* 준영속

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

 

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

  • detach(entity) : 특정 Entity만 준영속 상태로 전환합니다.
    • 영속성 컨텍스트에서 관리되다(Managed)가 분리된 상태(Detached)로 전환

  • 준영속 상태로 전환되면 1차 캐시 즉, 캐시 저장소에서 제거되기 때문에 JPA의 관리를 받지 못해 영속성 컨텍스트의 어떠한 기능도 사용할 수 없음

em.contains(memo); 는 해당 객체가 영속성 컨텍스트에 저장되어 관리되는 상태인지 확인하는 메서드로 em.detach(memo); 이후 확인했을 때 false가 출력된 것을 확인할 수 있었음

 

 

  • clear() : 영속성 컨텍스트를 완전히 초기화.
    • 영속성 컨텍스트의 모든 Entity를 준영속 상태로 전환
    • 영속성 컨텍스트 틀은 유지하지만 내용은 비워 새로 만든 것과 같은 상태가 됨
    • 따라서 계속해서 영속성 컨텍스트를 이용할 수 있음

 

  • close() : 영속성 컨텍스트를 종료.
    • 해당 영속성 컨텍스트가 관리하던 영속성 상태의 Entity들은 모두 준영속 상태로 변경
    • 영속성 컨텍스트가 종료되었기 때문에 계속해서 영속성 컨텍스트를 사용할 수 없음

  • em.close(); 메서드 호출 이후 EntityManager를 사용하려고 하자 오류가 발생
    • 영속성 컨텍스트가 종료되면 계속해서 영속성 컨텍스트를 사용할 수 없다는 것을 확인할 수 있음

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

  • merge(entity) : 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환.
  • merge(entity) 동작
    • 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회.
      1. 해당 Entity가 영속성 컨텍스트에 없다면?
        1. DB에서 새롭게 조회합니다.
        2. 조회한 Entity를 영속성 컨텍스트에 저장합니다.
        3. 전달 받은 Entity의 값을 사용하여 병합합니다.
        4. Update SQL이 수행됩니다. (수정)
      2. 만약 DB에서도 없다면 ?
        1. 새롭게 생성한 Entity를 영속성 컨텍스트에 저장합니다.
        2. Insert SQL이 수행됩니다. (저장)
  • 따라서 merge(entity) 메서드는 비영속, 준영속 모두 파라미터로 받을 수 있으며 상황에 따라 ‘저장’을 할 수도 ‘수정’을 할 수도 있음.

* 삭제

 

remove(entity) : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환