티스토리 뷰

인프런수업/JPA

연속성 컨텍스트

날따라해봐요요롷게 2022. 4. 22. 15:47

Entity를 영구 저장하는 환경

 

엔티티의 생명주기

- 비영속

: 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태

- 영속

: 영속성 컨텍스트에 관리되는 상태

- 준영속

: 영속성 컨텍스트에 저장되었다가 분리된 상태

- 삭제

 

 


영속성 컨텍스트의 이점

- 1차 캐시

: 영속 컨텍스트에 pk로 지정한 id 값이 엔터티와 함께 key와 value로 저장되어 있다.

JPA의 Find~~ 는 모두 영속성 컨텍스트에서 1차 캐시로 엔터티를 갖고오는 것이다.

Member member = new Member();
member.setId("member1");
member.setUsername("회원");

// 엔티티 영속
em.persist(member)

단, 1차 캐시는 하나의 트랜잭션 안에서 발생하는 캐시이다.

전체가 다 사용하는 캐시는 2차 캐시이므로 전체가 사용하는 캐시는 아니다. 따라서 성능의 이점이 크지는 않다.

 

- 동일성 보장

: 1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 어플리케이션 차원에서 제공

 

- 트랙잭션을 지원하는 쓰기 지연

Member member1 = new Member(150L, "member1");
Member member2 = new Member(160L, "member2");
em.persist(member1);
em.persist(member2);
transaction.commit();

JPA는 persist영속성 컨텍스트로 들어가 있는 상태에서는 DB로 데이터를 바로 넣지 않는다.

Transaction이 일어나야 db에 쿼리문을 날려 데이터를 넣는다.

persist 가 일어나면 쓰기 지연이 일어 나는데 버퍼링 같은 것으로 날려지는 트렌젝션이 몇 개 이상 모아졌을 때 db에 던지도록 한다. 이 때 사용되는 것이 JPA의 Batch Size 이다.

 

- 변경 감지(엔터티 수정)

JPA에서 엔티티를 수정하게 되면 어떤 매커니즘으로 이루어지는 건가?

엔터티를 수정하기 위해 DB에서 엔티트를 가져올 때 1차 캐시에 스냅샵으로 해당 엔티티를 저장해 놓는다.

후에 엔터티를 변경하였을 때 스냅샵에 있는 기존의 엔티티와 비교를 하여 엔티티가 변경 되면 Flush 과정을 거치며 해당 update 쿼리문을 db에 날려 데이터를 수정한다.


- Flush

수정, 삭제 등 변경 감지 시 작동한다.

수정된 엔티티 쓰기 지연 sql 저장소에 등록한다.

쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송

 

영속성 컨테스트를 flush 하는 방법

• em.flush() - 직접 호출
• 트랜잭션 커밋 - 플러시 자동 호출
• JPQL 쿼리 실행 - 플러시 자동 호출

 

flush 특징

• 영속성 컨텍스트를 비우지 않음 -> 1차 캐시에 그대로 들어있음
• 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
• 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화
하면 됨


 

 

 

 

 

'인프런수업 > JPA' 카테고리의 다른 글

JPA 기본  (0) 2022.05.13
JPA Repository - Query Method  (0) 2022.05.11
h2  (0) 2022.04.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함