스프링

[JPA] 영속성 관리[4]

zumsim 2024. 12. 9. 21:54
728x90
반응형
플러시

 

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 과정이다.

  1. 변경 감지가 동작해서 영속성 컨텍스트의 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다.
  2. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다

 

영속성 컨텍스트를 플러시하는 방법

 

  1. em.flush() 직접 호출
  2. 트랜잭션 커밋 시 자동 호출
  3. JPQL 쿼리 실행 시 자동 호출

 

플러시 모드 옵션

 

엔티티 매니저에 플러시 모드를 직접 지정하려면 javax.persistence.FlushModeType을 사용하면 된다.

  • FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시(기본값)
  • FlushModeType.COMMIT : 커밋할 때만 플러시

 

* 플러시는 영속성 컨텍스트에 보관된 엔티티를 지우는게 아닌 변경 내용을 데이터베이스에 동기화하는 것이다.

 

 

준영속

 

영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 것을 준영속 상태라 한다.

따라서 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다. 

 

영속 상태의 엔티티를 준영속 상태로 만드는 방법

  1. em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
  2. em.clear() : 영속성 컨텍스트를 완전히 초기화
  3. em.close() : 영속성 컨텍스트를 종료

 

detach()

 

public void testDetached() {
    Member member = new Member();
    member.setId("memberA");
    member.setUsername("회원A");
 
    //member 엔티티 영속 상태
    em.persist(member);
 
    //member 엔티티 영속성 컨텍스트에서 분리, 준영속 상태
    em.detach(member);
 
    transaction.commit();
}
cs

 

detach가 호출되는 순간 1차 캐시부터 쓰기 지연 SQL 저장소까지 해당 엔티티를 관리하기 위한 모든 정보가 제거된다.

 

 

clear()

 

Member member = em.find(Member.class, "memberA");
 
em.clear(); // 영속성 컨텍스트 초기화
 
//준영속 상태(변경감지 작동 X)
member.setUsername("changeName");
cs

 

 

 

close()

 

public void closeEntityManager() {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
 
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
 
   tx.begin(); // 트랜잭션 시작
 
    Member memberA = em.find(Member.class, "memberA");
    Member memberB = em.find(Member.class, "memberB");
 
   tx.commit(); // 트랜잭션 커밋
 
   em.close(); // 영속성 컨텍스트 닫기(종료)
}
cs

 

 

 

준영속상태의 특징

 

1. 거의 비영속 상태에 가깝다.

 -> 영속성 컨텍스트가 관리하지 않으므로 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩등의 그 어떤 기능도 동작하지 않는다.

 

2. 식별자 값을 가지고 있다.

 -> 비영속 상태는 없을 수도 있지만, 준영속 상태는 이미 한 번 영속 상태였으므로 반드시 가지고 있다.

 

3. 지연 로딩을 할 수 없다.

 -> 지연 로딩은 실제 객체 대신 프록시 객체를 로딩해두고 실제 사용할 때 영속성 컨텍스트를 통해 불러오는 방식이지만 준영속 상태는 영속성 컨텍스트가 관리하지 않기 때문에 지연 로딩시 문제가 발생한다.

728x90
반응형

'스프링' 카테고리의 다른 글

[JPA] 영속성 관리[5]  (0) 2024.12.10
[JPA] 영속성 관리[3]  (1) 2024.11.27
[JPA] 영속성 관리[2]  (0) 2024.11.26
[JPA] 영속성 관리[1]  (0) 2024.11.25
[Spring Boot] 동적 쿼리 처리를 위해 Querydsl 알아보기  (0) 2023.02.13