JPA 엔티티 생명주기란?
JPA에서 엔티티(Entity)란 단순한 객체가 아니고, 영속성 컨텍스트와(Persistence Context)의 관계에 따라 서로 다른 상태를 가진다. 이러한 상태를 엔티티 생명주기라고 한다. 그리고 이 상태 변화에 따라 SQL 실행 지점, 변경 감지, 캐시 사용 여부가 달라진다.
엔티티 생명주기는 크게 4가지로 나뉜다.

비영속
- 엔티티가 아직 영속성 컨텍스트에 저장되지 않은 상태 (단순히 new로 생성된 객체)
- DB에도 저장되지 않았고, JPA가 관리하지도 않음
- 트랜잭션, flush, commit과 아무 관련 없음
Member member = new Member();
member.setName("Alice");
// 이 점의 member는 순수한 자바 객체
영속(Managed)
- 영속성 컨텍스트가 관리하는 상태
- 1차 캐시에 저장됨
- 동일 트랜잭션 내 동일 엔티티는 항상 같은 객체
- JPA가 엔티티의 변경을 추적(Dirth Checking)
- flush 시점에 SQL을 생성하고, commit 시 DB에 반영된다. -> 영속 상태의 엔티티는 JPA가 관리하게 된다.
em.persist(member); // 저장
em.find(Member.class, id); // 조회
준영속(Detached)
한때는 영속 상태였지만, 영속성 컨텍스트에서 분리된 상태를 말한다.
- 1차 캐시에 없음
- 값 변경해도 DB에 반영안된다. (flush, commit, dirty checking 등 불가)
- 객체는 살아있으나 JPA의 관리 대상이 아님
em.detach(entity); // 특정 엔티티만 분리
em.clear(); // 영속성 컨텍스트 초기화
em.close(); // EntityManager 종료
Member member = em.find(Member.class, 1L);
em.clear();
member.setName("Bob"); // DB 반영 안 됨
삭제(Removed)
영속성 컨텍스트에서는 관리되지만, DB에서 삭제 예정인 상태이다.
- 1차 캐시에서는 제거
- flush 시 DELETE SQL 실행
- commit 시 DB에서 실제 삭제
Member member = em.find(Member.class, 1L);
em.remove(member);
영속성 엔티티와 준영속성 엔티티의 차이는?
Dirty Checking 가능 여부의 차이가 있다.
merge는 언제쓸까?
준영속 상태를 다시 영속 상태로 만들고 싶을 때 쓴다. (단, 새 객체가 반환된다)
OSIV 환경에서 엔티티는 언제까지 영속인가?
View 렌더링 시점까지 영속
엔티티 생명주기 흐름
더보기
비영속 (new)
|
| persist()
v
영속 (managed)
|
| detach() / clear() / close()
v
준영속 (detached)
|
| remove()
v
삭제 (removed)
반응형
'TIL' 카테고리의 다른 글
| [TIL] 블로킹/논블로킹과 동기/비동기 (0) | 2026.02.10 |
|---|---|
| [TIL] 동시성 문제와 낙관락/비관락 (0) | 2026.02.04 |
| [TIL] JPA 동작 원리 (0) | 2026.01.27 |
| [TIL] ORM (0) | 2026.01.26 |
| [TIL] AWS와 k8s (0) | 2025.10.28 |