영속성 관리

엔티티의 생명 주기

  • 비영속 (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>
  • 의존성에 위의 코드 주입해야 에러 발생 안 함



인프런 - 김영한님의 JPA 강의를 정리한 내용입니다.


김영한님 인프런 강의

댓글남기기