※ 인프런 강의 김영한님의 「자바 ORM 표준 JPA 프로그래밍」을 학습한 내용을 정리한 글입니다.
영속에서 준영속으로 변할 수 있는 상태가 뭐가 있을까?
영속 상태
조회할 때 1차 캐시에서 데이터 찾을 수 있음. JPA가 관리하는 상태가 됨
준영속 상태
영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)된 것
- 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.
준영속상태로 만드는 방법
- em.detach(entity) : 특정 엔티티만 준영속 상태로 전환한다.
- em.clear() : 영속성 컨텍스트를 완전히 초기화한다.
- em.close() : 영속성 컨텍스트를 종료한다.
엔티티를 준영속 상태로 전환 : detach()
// 영속
Member member = em.find(Member.class, 150L);
member.setName("AAAAA");
em.detach(member); // 영속성 컨텍스트에서 더 이상 관리하지 못 하게 끄집어 냄
System.out.println("===============");
tx.commit();
console 출력 결과
Hibernate:
select
member0_.id as id1_0_0_,
member0_.name as name2_0_0_
from
Member member0_
where
member0_.id=?
===============
SELECT 쿼리만 출력되고 UPDATE 쿼리는 출력되지 않는다.
이렇게 em.detach(member)를 실행해서 준영속 상태로 만든다는 의미는 엔티티가 영속성 컨텍스트가 관리하지 않는 상태로 만든다는 것을 의미한다.
준영속 상태이므로 영속성 컨텍스트가 지원하는 어떤 기능도 동작하지 않는다.
- 1차 캐시에서 제거됨
- 쓰기 지연 SQL 저장소에 저장되었던 관련 SQL모두 제거
따라서 transaction.commit()이 일어나도 데이터베이스에 저장이 되지 않는다.
영속성 컨텍스트 초기화 : clear()
// 영속
Member member = em.find(Member.class, 150L);
member.setName("AAAAA");
em.clear(); // 영속성 컨텍스트를 통째로 지워버림
Member member1 = em.find(Member.class, 150L); // clear()로 1차 캐시 내용을 지워버렸기 때문에 select문 실행해서 데이터 가져옴
System.out.println("===============");
tx.commit();
em.clear()는 영속 컨텍스트에 있는 모든 것을 초기화 시킨다.(영속성 컨텍스트를 제거하고 새로 만든 것과 같다.)
console 출력 결과
Hibernate:
select
member0_.id as id1_0_0_,
member0_.name as name2_0_0_
from
Member member0_
where
member0_.id=?
Hibernate:
select
member0_.id as id1_0_0_,
member0_.name as name2_0_0_
from
Member member0_
where
member0_.id=?
===============
영속성 컨텍스트가 초기화 되어 같은 Key 값으로 조회해도 1차 캐시에 남아있지 않기 때문에 SELECT 쿼리를 두 번 수행한다.
영속성 컨텍스트 종료 : close()
영속성 컨텍스트를 종료하면 해당 영속성 컨텍스트가 관리하던 영속 상태의 엔티티가 모두 준영속 상태가 된다.
영속성 관리 정리
- 엔티티 매니저를 만들면 그 내부에 영속성 컨텍스트도 함께 만들어 진다. 이 영속성 컨텍스트는 엔티티 매니저를 통해서 접근할 수 있다. (엔티티 매니저는 엔티티 매니저 팩토리에서 생성한다.)
- 영속성 컨텍스트는 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. (1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연(transactional write-behind), 변경 감지(dirty checking), 지연 로딩 기능(lazy loading) 등이 장점)
- 영속성 컨텍스트에 저장한 엔티티는 플러시 시점에 데이터베이스에 반영됨 (일반적으로 트랜잭션이 커밋될 때 영속성 컨텍스트가 플러시된다.)
- 영속성 컨텍스트가 관리하는 엔티티를 영속 상태, 더 이상 관리하지 못하면 준영속 상태 라고 한다. 준영속 상태의 엔티티는 더는 영속성 컨텍스트의 관리를 받지 못하므로 영속성 컨텍스트가 제공하는 1차 캐시, 동일성 보자, 쓰기 지연, 변경 감지, 지연 로딩 같은 기능을 사용할 수 없다.
'JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑 - 단방향 연관관계 (0) | 2022.08.07 |
---|---|
[JPA] 엔티티 매핑 (0) | 2022.07.28 |
[JPA] 플러시(Flush) (0) | 2022.07.18 |
[JPA] 영속성 관리 (0) | 2022.07.18 |
[JPA] JPA의 소개 (0) | 2022.07.17 |
댓글