본문 바로가기
Backend/JPA

JPA - 영속 상태와 준영속 상태의 차이 및 준영속 상태 만드는 방법

by 재성스 2025. 2. 12.
반응형

 

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에서 분리된 상태, 변경 사항이 반영되지 않음.
  • 준영속 상태 만드는 방법:
    1. detach(entity): 특정 엔티티만 분리
    2. clear(): 모든 엔티티 초기화
    3. close(): EntityManager 종료
반응형

'Backend > JPA' 카테고리의 다른 글

JPA - flush()란?  (0) 2025.02.12
JPA - 영속성 컨텍스트 (Persistence Context) 특징  (0) 2025.02.11