Backend/JPA
[자바 ORM 표준 JPA 프로그래밍] 3장. 영속성 관리
anxi
2024. 1. 29. 20:22
엔티티 매니저 팩토리, 엔티티 매니저
- 엔티티 매니저 팩토리
// persistence.xml 코드의 <persistence-unit name = "{name}">
EntityManagerFactory emf = Persistence.createEntityManagerFactory("{name}");
- 엔티티 매니저를 만드는 공장
- 공장을 만드는 비용은 상당히 크다. -> 한 개의 엔티티 매니저 팩토리를 만들어서 전체 애플리케이션에서 공유
- 여러 스레드가 동시에 접근해도 안전 -> 서로 다른 스레드 간에 공유 가능
- 엔티티 매니저
EntityManager em = emf.createEntityManager();
- 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유 금지
영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
em.persist(entity);
- 위의 메소드 실행시 entity가 영속성 컨텍스트에 저장된다.
- 엔티티 매니저 생성 시 하나의 영속성 컨텍스트 생성
- 엔티티 매니저를 통해 영속성 컨텍스트에 접근 및 관리 가능
엔티티 생명주기
비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태
Member member = new Member();
member.setId(1L);
member.setUsername("a");
- 엔티티 객체를 생성하고 아직 저장하지 않은 상태
- 영속성 컨텍스트나 DB와는 전혀 관련이 없다.
영속 : 영속성 컨텍스트에 저장된 상태
em.persist(member);
- 영속성 컨텍스트가 관리하는 엔티티
- 영속 상태 : 영속성 컨텍스트에 의해 관리
- em.find()나 JPQL을 사용하여 조회한 엔티티 또한 영속 상태이다.
준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태
// 특정 엔티티를 준영속 상태로 변경
em.detach(member);
// 영속성 컨텍스트 닫기
em.close();
// 영속성 컨텍스트 초기화
em.clear();
삭제 : 삭제된 상태
em.remove(member);
- 엔티티를 영속성 컨텍스트와 DB에서 삭제한다.
영속성 컨텍스트의 특징
- 영속성 컨텍스트와 식별자 값
- 영속성 컨텍스트는 엔티티를 식별자 값(PK)로 구분
- 영속 상태는 식별자 값이 반드시 있어야 한다.
- 영속성 컨텍스트와 DB 저장
- 트랜잭션 커밋할 때 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 반영한다.(flush)
- 장점
- 1차 캐시 : 영속성 컨텍스트 내부의 캐시
- 영속성 컨텍스트 내 영속 상태인 엔티티가 있다면 이후 조회시 DB에서 조회하는 것이 아닌 1차 캐시에서 조회한다.
- 동일성 보장
- find를 통해 영속 상태 엔티티를 여러개 조회해서 동일성(==)을 비교해도 참(True)을 반환한다. (실제 인스턴스 동일)
- 트랜잭션을 지원하는 쓰기 지연
- 쓰기 지연 SQL 저장소에 쿼리를 저장해두고 트랜잭션 커밋 시 DB에 쿼리를 보낸다.
- 변경 감지 (Dirty Checking)
- 엔티티의 변경사항을 DB에 자동으로 반영하는 기능
- 영속성 컨텍스트에 보관된 엔티티와 플러시 시점의 엔티티를 비교해서 엔티티를 수정한다.
- 지연 로딩
- 1차 캐시 : 영속성 컨텍스트 내부의 캐시
플러시 : 영속성 컨텍스트의 변경 내용을 DB에 반영
플러시 방법
1. 직접 호출 : em.flush()
2. 트랜잭션 커밋 시 플러시 자동 호출
3. JPQL 쿼리 실행 시 플러시 자동 호출
병합 : merge()
- 영속 상태가 아닌 엔티티를 새로운 영속 상태로 반환
- 영속 상태가 아닌 엔티티가 영속 상태로 변경되는 것이 아닌 새로운 영속 상태의 엔티티가 되는 것이다.
출처 : 자바 ORM 표준 JPA 프로그래밍 책