JPA Entity 생명주기(Entity Lifecycle)

code++·2026년 7월 14일

JPA는 엔티티(Entity)를 영속성 컨텍스트(Persistence Context) 를 통해 관리한다.

엔티티는 생성부터 삭제까지 다음과 같은 4가지 상태를 가진다.

비영속(Transient)
        ↓
영속(Persistent)
        ↓
준영속(Detached)
        ↓
삭제(Removed)

1. 비영속(Transient)

비영속 상태는 영속성 컨텍스트가 관리하지 않는 새로운 객체이다.

Product product = new Product();

이 객체는 단순히 JVM 메모리에만 존재하며 DB와는 아무런 관계가 없다.

특징

  • 영속성 컨텍스트가 관리하지 않는다.
  • DB에 저장되지 않는다.
  • Dirty Checking이 동작하지 않는다.

2. 영속(Persistent)

영속 상태는 영속성 컨텍스트가 엔티티를 관리하는 상태이다.

Product product = productRepository.findById(1L).get();

또는

productRepository.save(product);

이후부터 해당 엔티티는 영속성 컨텍스트의 관리 대상이 된다.

특징

  • 1차 캐시를 사용할 수 있다.
  • Dirty Checking이 동작한다.
  • 쓰기 지연(Write Behind)이 적용된다.
  • 트랜잭션 종료 시 변경 사항이 자동으로 DB에 반영된다.

예를 들어

@Transactional
public void update() {

    Product product = productRepository.findById(1L).get();

    product.setPrice(30000);

}

save()를 호출하지 않아도 Dirty Checking으로 인해 UPDATE SQL이 자동으로 실행된다.


3. 준영속(Detached)

준영속 상태는 영속성 컨텍스트가 더 이상 엔티티를 관리하지 않는 상태이다.

예를 들어

entityManager.detach(product);

를 호출하면 해당 엔티티는 준영속 상태가 된다.

특징

  • 영속성 컨텍스트의 관리 대상이 아니다.
  • Dirty Checking이 동작하지 않는다.
  • 객체를 수정해도 DB에 반영되지 않는다.

4. 삭제(Removed)

삭제 상태는 삭제가 예약된 상태이다.

productRepository.delete(product);

또는

entityManager.remove(product);

를 호출하면 삭제 상태가 되며,

트랜잭션이 Commit되면 DELETE SQL이 실행된다.

DELETE
FROM product
WHERE id = 1;

Entity 생명주기 정리

상태설명
비영속(Transient)단순히 생성된 객체로 영속성 컨텍스트가 관리하지 않는다.
영속(Persistent)영속성 컨텍스트가 관리하는 상태이며 Dirty Checking, 1차 캐시 등을 사용할 수 있다.
준영속(Detached)영속성 컨텍스트가 더 이상 관리하지 않는 상태이다.
삭제(Removed)삭제가 예약된 상태이며 Commit 시 DELETE SQL이 실행된다.

한 줄 요약

  • 비영속 : new로 생성한 객체
  • 영속 : JPA가 관리하는 객체
  • 준영속 : JPA가 더 이상 관리하지 않는 객체
  • 삭제 : 삭제가 예약된 객체

JPA 전체 흐름

JPA
    ↓
Hibernate
    ↓
@Transactional
    ↓
영속성 컨텍스트
    ↓
Entity(영속 상태)
    ↓
1차 캐시
    ↓
Dirty Checking
    ↓
Write Behind
    ↓
Flush
    ↓
Commit
    ↓
Database
profile
일상

0개의 댓글