정의
영속성 컨텍스트란 엔티티를 영구 저장하는 환경을 말한다.
상태
영속성 컨텍스트의 상태는 비영속, 영속, 준영속, 삭제 네 가지가 있다.
비영속
영속성 컨텍스트와 전혀 관계가 없는 상태
Member member = new Member();
member.setName("이름");
영속
영속성 컨텍스트에 관리되는 상태
em.getTransaction().begin() // em: EntityManager
Member member = new Member();
member.setName("이름");
em.persit(member); // 이 때 영속성 컨텍스트의 1차 캐시에 저장된다.
준영속
영속성 컨텍스트에 저장되었다가 분리된 상태
Member member = new Member();
member.setName("이름");
em.persist(member); // id = 1로 저장
Member member2 = new Member3();
member3.setId(member.getId()); // 이 때에도 준영속 상태라고 한다.
em.detach(member); // 영속성 컨텍스트에서 분리
삭제
삭제된 상태
em.remove(member); // 삭제
특징
영속성 컨텍스트의 주요 특징을 알아보자.
영속성 컨텍스트의 식별자 값
영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태의 객체는 식별자 값이 반드시 존재해야 한다.
엔티티 클래스에서 @Id로 지정한 필드가 식별자 값이 된다.
영속성 컨텍스트와 데이터베이스 저장
JPA는 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하는데 이를 flush라고 한다.
flush를 한다고해서 1차 캐시가 비워지지 않는다. 1차 캐시를 비우려면 clear를 호출해야 한다.
Member member = new Member();
member.setName("테스트");
member.setAge(22);
em.persist(member); // 영속 상태가 될 뿐 SQL이 날아가지 않는다.
em.flush(); // 이 때 DB에 쿼리를 날린다.
영속성 컨텍스트의 장점
영속성 컨텍스트의 장점은 다음과 같다.
- 1차 캐시
- 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연
- 변경 감지
- 지연 로딩
1차 캐시
영속성 컨텍스트 내부에는 영속 상태의 엔티티를 저장하는 1차 캐시라 불리는 저장소가 있다. 1차 캐시의 키는 식별자 값이고 값은 엔티티의 인스턴스이다.
동일성 보장
영속성 컨텍스트는 엔티티의 동일성을 보장해준다.
동일성은 주소값을 비교하는 것이고, 동등성은 그 내부의 값이 동등한지 비교하는 것이다.
Member member = new Member();
member.setName("test");
em.persist(member);
Member find = em.find(Member.class, 1);
// 여기서 find와 member는 동일하다.
// find.equals(member) -> true
트랜잭션을 지원하는 쓰기 지연
find()를 사용해 엔티티를 저장해도 바로 INSERT 쿼리가 DB에 보내지지 않는다. 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 쓰기 지연 SQL 저장소라는 곳에 모아둔다. 나중에 flush가 될 때 모아둔 쿼리를 모두 DB에 날리며 이를 쓰기 지연이라고 한다.
변경 감지
자세한 내용은 여기를 참고하자.
간단하게 정리하면 영속성 컨텍스트 내의 스냅샷과 엔티티를 비교하여 변경된 엔티티가 있으면 UPDATE 쿼리를 날린다.
지연 로딩
연관 관계가 매핑되어 있는 엔티티를 조회 시 우선 프록시 객체를 반환하고, 실제로 필요할 때 쿼리를 날려 가져오는 기능이다.
'Spring' 카테고리의 다른 글
JPA - 영속성 컨텍스트의 변경 감지와 병합 (0) | 2024.08.22 |
---|