반응형
1. 준영속 상태란?
준영속 상태(Detached)는 말 그대로 한 번 영속 상태였다가 영속성 컨텍스트와의 관계가 끊어진 상태를 말합니다.
즉, 엔티티 객체는 여전히 메모리에 존재하지만 JPA가 해당 엔티티를 관리하지 않는 상태입니다.
📌 영속 상태 → 준영속 상태 전환 시, 더 이상 1차 캐시나 변경 감지(Dirty Checking)가 동작하지 않습니다.
2. 준영속 상태로 만드는 방법
JPA에서 엔티티를 준영속 상태로 전환하는 방법은 크게 세 가지가 있습니다.
- em.detach(entity)
→ 특정 엔티티만 준영속 상태로 전환합니다. - em.clear()
→ 영속성 컨텍스트를 완전히 초기화하여 모든 엔티티를 준영속 상태로 만듭니다. - em.close()
→ 영속성 컨텍스트를 종료합니다. (트랜잭션 종료 시 주로 발생)
3. 준영속 상태의 특징
- 1차 캐시에서 제거됨
→ 해당 엔티티는 영속성 컨텍스트가 관리하지 않음 - 변경 감지(Dirty Checking) 안 됨
→ 준영속 상태에서는 필드 값을 변경해도 DB에 반영되지 않음 - 다시 영속 상태로 만들려면 merge() 필요
→ 준영속 → 영속 상태 복귀는 em.merge(entity)로 가능 - 조회 시 DB에서 다시 조회
→ 1차 캐시에서 찾을 수 없으므로 select 쿼리 실행
4. 예제 코드
// 1. 영속 상태
Member member = em.find(Member.class, 150L);
member.setName("AAAAA"); // 변경 감지 대상
// 2. 준영속 상태 전환
// em.detach(member); // 특정 엔티티만 준영속
em.clear(); // 영속성 컨텍스트 전체 초기화
// 3. 동일 엔티티 재조회
Member member2 = em.find(Member.class, 150L);
System.out.println("===============================");
tx.commit();
💻 실행 결과
Hibernate:
select
m1_0.id,
m1_0.name
from
Member m1_0
where
m1_0.id=?
Hibernate:
select
m1_0.id,
m1_0.name
from
Member m1_0
where
m1_0.id=?
===============================
- 첫 번째 em.find()에서 조회한 후, em.clear()로 캐시가 비워졌기 때문에
- 두 번째 em.find()도 DB에서 다시 select 쿼리를 실행합니다.
💡 Tip: 준영속 상태 전환은 주로 대규모 데이터 처리 시 메모리 최적화를 위해 사용됩니다.
예를 들어, 배치 처리 중 일부 데이터만 영속 상태로 유지하고 나머지는 em.clear()로 정리하면 메모리 사용량을 줄일 수 있습니다.
반응형
'Back end > Spring Project' 카테고리의 다른 글
| [Spring] JPA - @MappedSuperclass (0) | 2025.08.27 |
|---|---|
| [Spring] JPA 양방향 연관관계와 연관관계의 주인 (0) | 2025.08.20 |
| [Spring] JPA flush (0) | 2025.08.14 |
| [Spring] JPA 기본 CRUD 동작 예제 (0) | 2025.08.13 |
| [Spring] Maven profile 이용한 환경별 (local, dev, prod) 빌드 및 설정 분리 (0) | 2025.07.23 |