JPA - 01. 영속성 관리
영속성 관리
엔티티의 생명 주기
- 비영속 (new / transient)
- 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- 영속 (managed)
- 영속성 컨텍스트에 관리되는 상태
- 준영속 (detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태
- em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
- em.clear() : 영속성 컨텍스트 자체를 완전 초기화
- em.close() : 영속성 컨텍스트 종료
- 삭제 (removed)
- 삭제된 상태
영속성 컨텍스트
- JPA를 이해하는 가장 중요한 용어
- 엔티티를 영구 저장하는 환경
-
EntityManager.persist 메소드를 통해 우리가 만든 엔티티를 넣어줌
-
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); Member member = new Member(); member.setId(1L); member.setName("helloA"); // 위까지 객체 생성한 상태 => 비영소 em.persist(member); // 영속성 컨텍스트에 member entity를 등록 => 객체를 저장 => 영속
-
영속성 컨텍스트의 이점
- 1차 캐시
- DB PK값이 key, Entity 자체가 value로 이루어진 캐시가 존재
- DB PK 값은 @id가 붙어있는 변수
- persist 메소드로 entity를 등록하면 1차 캐시에 저장됨
- 1차 캐시에 저장된 entity는 DB까지 조회하지 않고 캐시에서 바로 불러옴
- 1차 캐시에 없는 entity는 DB를 조회하여 불러온 후, 1차캐시에 저장
- 현실
- 영속성 컨텍스트를 가지고 있는 EntityManger는 하나의 트랜잭션 단위로 동작함
- 하나의 요청이 들어오고 나면 트랜잭션이 종료되므로 영속성 컨텍스트 및 1차 캐시 역시 날라감
- 일반적인 경우, 큰 이득을 볼 수는 없음
- 영속 엔티티의 동일성 보장
- 영속성 컨텍스트에 등록된 엔틴티는 동일성 비교 시 true가 나옴
- 1차 캐시를 통해 트랜잭션 격리 수준을 REPEATABLE READ 등급으로 application 차원에서 제공
- 단, 같은 트랜잭션 안에서 실행될 때만 가능 (당연한 말!!!)
- 트랜잭션을 지원하는 쓰기 지연
- 기본적으로 commit하는 순간까지 DB에 insert 쿼리를 보내지 않음
- Hibernate가 제공하는 batch size 설정을 통해 한 방에 보낼 쿼리 사이즈 설정 가능
- commit 전까지 쓰기 지연 SQL 저장소에 모아뒀다가 flush할 때 한 번에 보냄
- hibernate.jdbc.batch.size의 값을 조정하여 설정 가능
- 변경 감지 (Dirty Checking)
- 1차 캐시에 있는 값을 스냅샷과 비교하여 변경 사항을 자동으로 DB에 변경됨
- persist를 다시 호출할 필요없이 Java Collection에 값을 새로 설정해주듯이 하면 update가 됨
- 지연 로딩 (Lazy Loading)
플러시 (Flush)
- 영속성 컨텍스트의 변경 내용을 DB에 반영시켜 동기화
- 변경 감지 발생
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 => 쿼리를 DB에 전송
- 호출 방법
- em.flush()로 직접 호출
- 트랜잭션 커밋 시 자동 호출
- JPQL 쿼리 실행 시 자동 호출
- 플러시 모드 옵션값을 AUTO => COMMIT으로 수정 가능
- 영속성 컨텍스트를 비우는 것이 아님
Java 11 사용 시
INFO: HHH000206: hibernate.properties not found
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
- 위의 에러가 발생
- jdk 11부터 jaxb dependency 없어져 수동으로 종속성 추가를 해줘야 함
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
- 의존성에 위의 코드 주입해야 에러 발생 안 함
댓글남기기