반응형
1. 영속(Persistent) 상태란?
**영속 상태(Persistent State)**란, JPA의 영속성 컨텍스트에 의해 관리되는 엔티티 객체 상태를 의미한다.
즉, 엔티티가 EntityManager의 관리 하에 있으며, 변경 사항이 자동으로 DB에 반영되는 상태이다.
✅ 영속 상태의 특징
- persist()를 호출하여 저장하면 영속 상태가 된다.
- 트랜잭션이 종료될 때 변경된 내용이 자동으로 반영된다.
- find()나 JPQL 조회 시 영속 상태 객체를 반환한다.
- 동일한 트랜잭션 내에서 1차 캐시에 의해 동일 객체를 반환한다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
}
// 영속 상태 예제
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = new Member();
member.setName("John Doe");
em.persist(member); // 영속 상태로 변환
tx.commit();
2. 준영속(Detached) 상태란?
**준영속 상태(Detached State)**란, 한때 영속 상태였지만 현재는 영속성 컨텍스트에서 관리되지 않는 상태를 의미한다.
즉, EntityManager가 더 이상 객체를 추적하지 않으며, 변경 사항이 자동으로 DB에 반영되지 않는다.
✅ 준영속 상태의 특징
- 영속 상태의 엔티티가 detach(), clear(), close() 등을 통해 관리되지 않는 상태가 된다.
- 엔티티가 변경되더라도 flush()를 해도 변경 사항이 반영되지 않는다.
- merge()를 사용하면 다시 영속 상태로 변경할 수 있다.
3. 영속 상태와 준영속 상태의 차이
비교 항목 | 영속(Persistent) 상태 | 준영속(Detached) 상태 |
관리 여부 | EntityManager가 관리 | EntityManager가 관리하지 않음 |
변경 감지 | 자동 변경 감지 (flush()) | 변경해도 DB 반영 안됨 |
트랜잭션 종료 후 | 그대로 유지 | 영속성 컨텍스트에서 분리됨 |
다시 영속화 | 필요 없음 | merge()를 통해 가능 |
4. 준영속 상태 만드는 방법
JPA에서 준영속 상태로 만드는 방법은 크게 3가지가 있다.
4.1 detach(entity)
특정 엔티티를 준영속 상태로 만든다.
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = em.find(Member.class, 1L);
em.detach(member); // 특정 객체를 준영속 상태로 변경
tx.commit();
4.2 clear()
영속성 컨텍스트를 초기화하여 모든 영속 엔티티를 준영속 상태로 변경한다
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member1 = em.find(Member.class, 1L);
Member member2 = em.find(Member.class, 2L);
em.clear(); // 모든 엔티티가 준영속 상태로 변경됨
tx.commit();
4.3 close()
현재 EntityManager를 종료하여 모든 영속 엔티티를 준영속 상태로 만든다.
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = em.find(Member.class, 1L);
em.close(); // 영속성 컨텍스트 종료 -> 모든 엔티티가 준영속 상태로 변경됨
5. 준영속 상태의 활용 예시
5.1 DTO 변환 후 조회 성능 최적화
JPA에서 조회 후 영속 상태를 유지할 필요 없는 경우, detach()를 활용하여 불필요한 메모리 낭비를 방지할 수 있다.
Member member = em.find(Member.class, 1L);
MemberDTO dto = new MemberDTO(member.getId(), member.getName());
em.detach(member); // 불필요한 영속 상태 유지 방지
5.2 merge()를 활용한 준영속 객체 수정
준영속 상태의 엔티티를 다시 영속 상태로 만들고 싶다면, merge()를 사용한다.
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = em.find(Member.class, 1L);
em.detach(member); // 준영속 상태로 변경
// 준영속 상태 객체 수정
member.setName("Updated Name");
// merge()로 다시 영속화
Member mergedMember = em.merge(member);
tx.commit();
6. 정리
- 영속 상태: EntityManager가 관리하는 상태, 변경 사항이 자동 반영됨.
- 준영속 상태: EntityManager에서 분리된 상태, 변경 사항이 반영되지 않음.
- 준영속 상태 만드는 방법:
- detach(entity): 특정 엔티티만 분리
- clear(): 모든 엔티티 초기화
- close(): EntityManager 종료
반응형
'Backend > JPA' 카테고리의 다른 글
JPA - flush()란? (0) | 2025.02.12 |
---|---|
JPA - 영속성 컨텍스트 (Persistence Context) 특징 (0) | 2025.02.11 |