개발기록

JPA 엔티티 생명주기: Transient, Persistent, Detached 상태 본문

Spring

JPA 엔티티 생명주기: Transient, Persistent, Detached 상태

Danuvibe 2021. 6. 4. 17:47

JPA(Java Persistence API)에서 엔티티 객체는 생명주기 동안 여러 상태를 거칩니다. 주요 상태로는 Transient, Persistent, Detached가 있으며, 추가로 Removed 상태도 존재합니다. 각 상태의 특징과 전환 과정을 살펴보겠습니다.

1. Transient (비영속)

  • 정의: 엔티티 객체가 생성되었지만 아직 영속성 컨텍스트에 저장되지 않은 상태
  • 특징:
    • JPA가 이 객체를 관리하지 않음
    • 데이터베이스와 연관이 없음
  • 예시: new 키워드로 객체를 생성한 직후
User user = new User();  // Transient 상태

2. Persistent (영속)

  • 정의: 엔티티 객체가 영속성 컨텍스트에 의해 관리되는 상태
  • 특징:
    • JPA가 이 객체를 관리함
    • 데이터베이스에 저장되어 있거나, 저장될 예정
    • 변경 감지(Dirty Checking), 지연 로딩 등의 기능 사용 가능
  • 예시: EntityManager.persist() 호출 후, 또는 데이터베이스에서 조회한 직후
entityManager.persist(user);  // Persistent 상태로 전환
User foundUser = entityManager.find(User.class, 1L);  // 조회된 객체는 Persistent 상태

3. Detached (준영속)

  • 정의: 한 번 영속 상태였다가 영속성 컨텍스트에서 분리된 상태
  • 특징:
    • JPA가 더 이상 이 객체를 관리하지 않음
    • 식별자(ID)를 가지고 있음
    • 변경 감지 등의 기능을 사용할 수 없음
  • 예시: EntityManager.detach() 호출 후, 또는 영속성 컨텍스트가 종료된 후
entityManager.detach(user);  // Detached 상태로 전환
// 또는
entityManager.close();  // 영속성 컨텍스트 종료 시 모든 엔티티가 Detached 상태가 됨

4. Removed (삭제)

  • 정의: 엔티티 객체가 영속성 컨텍스트와 데이터베이스에서 삭제되기로 예정된 상태
  • 특징:
    • 트랜잭션 커밋 시 실제로 데이터베이스에서 삭제됨
  • 예시: EntityManager.remove() 호출 후
entityManager.remove(user);  // Removed 상태로 전환

상태 전환 다이어그램

다음은 JPA 엔티티 생명주기의 상태 전환을 보여주는 Mermaid 다이어그램입니다.

 

Comments