(2) JPA 영속성 관리 (플러시, 준영속)
이전 시간에 했던 JPA 영속성 관리를 더 알아보도록 하자
오늘은 플러시와 준영속에 대해 알아본다.
음 아직 준영속 상태를 어떻게 사용하는지는 잘 모르겠음,
1. 준영속
영속 -> 준영속 상태 변화를 알아본다. 준영속 은 영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된것을 준 영속 상태라 한다.
- 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할수 없다.
준영속 상태로 만드는 방법
- em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
- em.clear() : 영속성 컨텍스트 완전 초기화
- em.close() : 영속성 컨텍스트 종료
1-1. 엔티티를 준영속 상태로 전환 : detach()
public class Jpa {
public void testDetached() {
// 비영속
Member member = new Member();
member.setId(1);
member.setUserName("한승우");
// 영속
em.persist(member);
// 영속성 컨텍스트에서 분리(준영속 상태)
em.detach(member);
// 커밋
transaction.commit();
}
}
이렇게 em.detach(member) 를 실행해서 준영속 상태로 만든다는 의미는 엔티티가 영속성 컨텍스트가 관리하지 않는 상태로 만든다는것을 의미 한다. 준영속 상태이므로 영속성 컨텍스트가 지원하는 어떤 기능도 동작하지 않는다.
- 1차 캐시에서 제거
- 쓰기 지연 SQL 저장소에 저장되었던 관련 SQL 모두 제거 따라서 transaction.commit() 이 일어나도 데이터 베이스 저장 x
1-2. 영속성 컨텍스트 초기화 : clear()
// 영속 상태(엔티티 조회)
Member member = em.find(Member.class, "memberA");
//
em.clear(); // 영속성 컨텍스트 초기화
// 준영속 상태
member.setUsername("한승우");
em.clear()는 영속 컨텍스트에 있는 모든 것을 초기화 시킨다. (영속성 컨텍스트를 제거하고 새로 만든것과 같음) 따라서 memberA는 준영속 상태가 되며, member.setUser() 가 실행되더라도 영속성 컨텍스트가 관리하지 않느 상태이므로 이름을 변경하여도 데이터 베이스에는 반영되지 않는다.
1-3 영속성 컨텍스트 종료 : close()
영속성 컨텍스트를 종료하면 해당 영속성 컨텍스트가 관리하던 영속 상태의 엔티티가 모두 준영속 상태가 된다.
2. 영속성 관리 정리
- 엔티티 매니저를 만들면 그 내부에 영속성 컨텍스트도 함께 만들어 진다. 이 영속성 컨텍스트는 엔티티 매니저를 통해서 접근할 수 있다. (엔티티 매니저는 엔티티 매니저 팩토리에서 생성한다.)
- 영속성 컨텍스트는 애플리케이션과 데이터 베이스 사이에서 객체를 보관하는 가상의 데이터베이스 역할을 한다. (1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연), 변경감지 지연로딩 등이 장점이다.
- 영속성 컨텍스트에 저장한 엔티티는 플러시 시점에 데이터 베이스에 반영이 된다. (= 트랜잭션이 커밋될때, 영속성 컨텍스트 플러시가 된다.)
- 영속성 컨텍스트가 관리하는 엔티티를 영속 상태, 더이상 관리하지 못하며 ㄴ준영속 상태라고 한다.