본문 바로가기
내일배움캠프(Sparta)/Spring

[Spring] Entity의 상태

by mmm- 2023. 11. 7.

Entity의 상태

  • 비영속(Transient)
    • new 연산자를 통해 인스턴스화 된 Entity 객체
    • 아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않음
    • JPA가 관리하지 못하기 때문에 해당 객체의 데이터를 변경해도 변경 감지가 이루어지지 않음
  • 영속(Managed)
    • persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만듦
      em.persist(memo);​
    • 관리받은 상태(영속 상태)인 MANAGED상태가 됨.
  • 준영속(Detached)
    • 영속성 컨텍스트에 저장되어 관리되다가 분리된 상태
    • 영속상태 ➡️ 준영속 상태로 바꾸는 법 (3가지)
      • detach(entity)
        : 특정 Entity만 준영속 상태로 전환
        em.detach(memo);​​

        • 영속성 컨텍스트에서 관리(Managed)되다가 분리(Detached)된 상태로 전환
        • 그래서 데이터를 수정해도 변경감지 기능을 사용할 수 없어 Update SQL이 수행되지 않음.
      • clear()
        : 영속성 컨텍스트를 완전히 초기화
        em.clear();​

        • 영속성 컨텍스트의 모든 Entity를 준영속 상태로 전환
        • 영속성 컨텍스트 틀은 유지하고 내용만 비워 새로 만든 것과 같은 상태가 됨.
        • 틀은 유지하고 있기 때문에 계속해서 영속성 컨텍스트를 사용해 새로운 entity를 영속 상태로 만들거나 기존의 entity를 다시 영속 상태로 만드는 것이 가능.
      • close()
        : 영속성 컨텍스트를 종료
        em.close();​

        • 해당 영속성 컨텍스트가 관리하던 영속성 상태의 Entity들은 모두 준영속 상태로 변경
        • 영속성 컨텍스트가 종료되었기 때문에 계속해서 영속성 컨텍스트를 사용할 수 없음.
    • 준영속 상태 ➡️ 영속상태로 바꾸는 법
      • merge(entity)
        : 전달받은 Entity를 사용해 새로운 영속 상태의 Entity를 반환. (때에 따라 수정하거나 저장함)
        em.merge(memo);​

        • merge(entity) 동작
          • 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회
            1. 해당 Entity가 영속성 컨텍스트에 없다면?
              1. ) DB에서 새롭게 조회
              2. ) 조회한 Entity를 영속성 컨텍스트에 저장
              3. ) 전달받은 Entity의 값을 사용해 병합
              4. ) Update SQL이 수행됨 (수정)
            2. 만약 DB에서도 없다면?
              1. ) 새롭게 생성한 Entity를 영속성 컨텍스트에 저장
              2. ) Insert SQL이 수행됨 (저장)
          • merge(entity) 메서드는 비영속, 준영속 모두 파라미터로 받을 수 있으며 상황에 따라 '저장', '수정' 가능
  • 삭제(Removed)
    em.remove(memo);
    •  remove(entity)
      : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환