JPA 엔티티 생명주기 (Entity Life Cycle) 정리

JPA 엔티티 생명주기 (Entity Life Cycle) 정리

JPA에서 엔티티는 비영속 → 영속 → 준영속 → 삭제의 상태를 가지며, 각 상태는 EntityManager가 엔티티를 어떻게 관리하는지에 따라 달라집니다.


1. JPA 엔티티의 4가지 생명주기 상태

상태설명주요 메서드
비영속 (Transient)EntityManager가 관리하지 않는 상태new 객체 생성
영속 (Persistent)EntityManager가 관리하는 상태, 변경 시 자동으로 DB 반영persist(), find(), merge()
준영속 (Detached)EntityManager가 더 이상 관리하지 않는 상태, 변경해도 DB에 반영되지 않음detach(), clear(), close()
삭제 (Removed)엔티티가 삭제된 상태, 트랜잭션이 커밋되면 DB에서 제거됨remove()

2. 상태별 상세 설명 및 코드 예제

(1) 비영속 (Transient)

  • 특징
    • EntityManager가 관리하지 않는 상태.
    • DB와 연관이 없으며, 변경해도 영속성 컨텍스트에 반영되지 않음.
  • 코드 예제
User user = new User(); // 비영속 상태
user.setUsername("John");

new 키워드로 생성한 객체는 아직 EntityManager와 연결되지 않았으므로 비영속 상태입니다.


(2) 영속 (Persistent)

  • 특징
    • EntityManager가 관리하는 상태.
    • 변경 사항이 자동으로 DB에 반영됨 (Dirty Checking).
    • 1차 캐시에 저장되므로 같은 EntityManager에서 동일 엔티티 조회 시 DB 조회 없이 캐시 사용.
  • 코드 예제
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();

User user = new User();
user.setUsername("John");

em.persist(user); // 영속 상태로 변경 (1차 캐시에 저장)
user.setUsername("Mike"); // 변경 감지(Dirty Checking), 트랜잭션 종료 시 자동 반영

tx.commit(); // DB에 반영됨 (INSERT 실행)
em.close();

📌 중요 개념

  • Dirty Checking (변경 감지):
    • EntityManager는 영속 상태 엔티티의 변경 사항을 감지하고, 트랜잭션 종료 시 자동으로 UPDATE 실행.
  • 1차 캐시:
    • 같은 EntityManager 내에서 동일 엔티티를 여러 번 조회하면 DB를 조회하지 않고 1차 캐시에서 가져옴.

(3) 준영속 (Detached)

  • 특징
    • EntityManager가 더 이상 관리하지 않는 상태.
    • 변경해도 자동으로 DB에 반영되지 않음.
    • 다시 영속 상태로 만들려면 merge() 사용.
  • 코드 예제
User user = em.find(User.class, 1L); // 영속 상태
em.detach(user); // 준영속 상태로 변경

user.setUsername("NewName"); // 변경해도 DB에 반영되지 않음

📌 준영속 상태가 되는 방법
| 방법 | 설명 |
|------|------|
| detach(entity) | 특정 엔티티만 준영속 상태로 변경 |
| clear() | 영속성 컨텍스트를 초기화하여 모든 엔티티를 준영속 상태로 변경 |
| close() | 영속성 컨텍스트를 종료하여 모든 엔티티를 준영속 상태로 변경 |

📌 준영속 상태에서 다시 영속 상태로 변경

User mergedUser = em.merge(user); // 다시 영속 상태로 변경

(4) 삭제 (Removed)

  • 특징
    • remove()를 호출하면 엔티티가 삭제 상태가 됨.
    • 트랜잭션이 커밋될 때 DB에서 삭제됨 (DELETE 실행).
  • 코드 예제
User user = em.find(User.class, 1L);
em.remove(user); // 삭제 상태

삭제 상태가 되면 commit() 시 실제 DB에서 DELETE 쿼리가 실행됩니다.


3. JPA 엔티티 상태 변화 예제

EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();

// 1. 비영속 상태
User user = new User();
user.setUsername("John");

// 2. 영속 상태
em.persist(user);

// 3. 준영속 상태
em.detach(user);

// 4. 다시 영속 상태로 변경
User mergedUser = em.merge(user);

// 5. 삭제 상태
em.remove(mergedUser);

tx.commit();
em.close();

4. 생명주기 상태 변화 정리

상태 변화메서드설명
비영속 → 영속persist(entity)엔티티를 영속성 컨텍스트에 등록
영속 → 준영속detach(entity), clear(), close()영속성 컨텍스트에서 분리
준영속 → 영속merge(entity)엔티티를 다시 영속 상태로 변경
영속 → 삭제remove(entity)삭제 상태로 변경 후 트랜잭션 커밋 시 DB에서 제거

5. 정리

  • JPA 엔티티는 비영속 → 영속 → 준영속 → 삭제의 4가지 상태를 가진다.
  • 영속 상태의 엔티티는 변경 감지(Dirty Checking)를 통해 자동으로 DB에 반영된다.
  • detach(), clear(), close()를 사용하면 준영속 상태가 되어 EntityManager가 더 이상 관리하지 않는다.
  • 삭제 상태가 되면 remove() 호출 후 트랜잭션 커밋 시 실제 DELETE 쿼리가 실행된다.
  • 준영속 상태에서 다시 영속 상태로 만들려면 merge()를 사용해야 한다.

JPA 생명주기를 잘 이해하면 효율적인 성능 최적화와 데이터 관리가 가능합니다! 🚀

profile
AI 답변 글을 주로 올립니다.

0개의 댓글