BE전문가 프로젝트

영속성 관리(JPA 내부 구조) 본문

JPA

영속성 관리(JPA 내부 구조)

원호보고서 2022. 9. 25. 15:33

JPA에서 가장 중요한 2가지

  • 객체와 관계형 데이터베이스 매핑하기
  • 영속성 컨텍스트

EntityManager Factory에서 고객의 요청이 올 때 마다 EntityManager를 생성한다.

 

영속성 컨텍스트

  • JPA를 이해하는데 가장 중요한 용어
  • Entity를 영구 저장하는 환경이라는 뜻
  • EntityManager.persist(entity) - entity 컨텍스트를 통해 entity를 영속화 한다는 의미
  • 영속성 컨텍스트는 논리적인 개념
  • 엔티티 매니저를 통해 영속성 컨텍스트에 접근

EntityManager안에 눈에 보이지않는 컨텍스트가 생성된다.

 

엔티티의 생명주기

엔티티의 생명주기
비영속 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
영속 영속성 컨텍스트에 관리되는 상태
준영속 영속성 컨텍스트에 저장되었다가 분리된 상태
삭제 삭제된 상태

비영속

객체 생성만 하고 JPA를 사용하지 않았기 때문에 비영속 상태라고 한다.

 

영속

객체 생성 후 EntityManager를 가져와 persist를 하게 되면 member는 영속 컨텍스트에 들어가면서 영속 상태가 된것을 의미한다.

            Member member = new Member();
            member.setId(100L);
            member.setName("member1");

            System.out.println("==== BEFORE ===");
            em.persist(member);
            System.out.println("=== AFTER ===");
            
            tx.commit();

영속상태가 된다고 해서 DB에 쿼리가 전송되는 것이 아니다.

위에서 본 것 처럼 commit하는 시점에 영속성 컨텐스트에 있는 것이 쿼리에 전송된다.

 

준영속, 삭제

준영속

  • 단순히 객체를 영속성 컨텍스트에서 꺼내여 관계를 삭제하는 것을 의미한다.

삭제

  • 데이터 자체를 영구적으로 삭제하는 것을 의미한다.

 

영속성 컨텍스트의 이점

애플리케이션과 DB사이에 중간 계층에서 이어주는 역할을 한다. 이것으로 얻을 수 있는 이점은

  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경 감지
  • 지연 로딩

 

엔티티 조회, 1차캐시

데이터 찾을 때

 

<<1차 캐시에 없는 데이터를 찾을 때>>

- 영속성 컨택스트는 내부에 1차 캐시라는 것을 가지고 있다.

- JPA는 우선적으로 1차 캐시에서 데이터를 찾고 난 후 DB에서 데이터를 찾는다.

- 만약 1차 캐시에 없는 데이터를 찾을 시에는 DB에서 데이터를 찾을 후 1차캐시에 저장한다.

- 이 모든 것은 하나의 트랜잭션 즉 하나의 비즈니스에서만 1차캐시가 적용되기 때문에 트랜잭션이 끝나면 1차 캐시도 지워진다.(전체에서 공유하는 캐시는 2차 캐시라고 한다.)

 

영속 엔티티의 동일성 보장

마치 우리가 자바 컬랙션에서 똑같은 레퍼런스가 있는 객체를 꺼내어 비교했을 때 true가 나오는 것과 같다.

 

엔티티 등록 - 트랜잭션을 지원하는 쓰기 지연

- 영속성 컨텍스트 안에는 1차캐시 뿐만 아니라 쓰기 지연 SQL 저장소가 존재한다.

- persist를 하는 순간 데이터는 1차캐시에 저장하고 SQL문은 쓰기 지연 SQL저장소에 저장한다.

- commit하는 순간 쓰기 지연 SQL 저장소에 있는 SQL문들이 Flush가 되면서 DB로 보낸다.

 

버퍼링(JDBC 배치)

DB에 데이터를 한번에 보낼 수 있는 방법이 있다.

 

<!-- 배치여부(버퍼링) -->
<property name="hibernate.jdbc.batch_size" value="10"/>

- persistence.xml에 위에 설정값을 추가하면 Commit 직전까지 sql을 모았다가 날리는 이점을 얻을 수 있다.

 

엔티티 수정 - 변경 감지

JPA에서는 데이터를 마치 자바 컬랙션 다루듯 사용하기 위해 나온 것임으로 변경된 값을 따로 DB에 저장하지 않아도 데이터 값이 변경된다.

동작 원리

- JPA는 commit하는 시점에 내부적으로 flush가 호출이 된다.

- 1차 캐시안에는 스냅샷이라는 것이 존재하는데 최초 시점에 상태를 스냅샷으로 남겨둔다.

- jpa는 1차 캐시안에 있는 객체와 스냅샷의 데이터 값을 비교한다.

- 데이터값이 변경되었다면 JPA는 쓰기지연 저장소에 UPDATE SQL을 저장한다.

 

'JPA' 카테고리의 다른 글

준영속 상태  (0) 2022.09.25
플러시  (0) 2022.09.25
JPQ의 작동원리와 JPA 애플리케이션 개발 및 JPQL 맛보기  (0) 2022.09.18
JPA 프로젝트 생성(HelloWolrd) 후 DB 설정  (0) 2022.09.05
JPA란?  (0) 2022.08.14
Comments