BE전문가 프로젝트
영속성 관리(JPA 내부 구조) 본문
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차 캐시라는 것을 가지고 있다.
- 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 |