저번 포스팅에 이어서 영속성 컨텍스트에 대해서 더 자세하게 알아보겠습니다.
1차 캐시
- 영속성 컨텍스트 안에는 1차 캐시가 있습니다.
- 1차 캐시는 @Id와 그에 매칭되는 Entity가 있습니다.
- em.persist(member)를 하면 바로 데이터베이스에 저장되는 것이 아닙니다.
- 우선 1차 캐시에 저장되었다가 transaction.commit를 했을 때 쿼리문이 발생합니다.
// 비영속
Member member = new Member();
member.setId(100L);
member.setName("hello");
// 영속
em.persist(member);
System.out.println("=====쿼리문?=====");
tx.commit();
위의 코드를 실행시켰을 때
tx.commit() 부분에서 쿼리문이 발생하는 것을 볼 수 있습니다.
// 비영속
Member member = new Member();
member.setId(100L);
member.setName("hello");
// 영속
em.persist(member);
Member findMember = em.find(Member.class, 100L);
System.out.println("findMember.getId() = " + findMember.getId());
System.out.println("findMember.getName() = " + findMember.getName());
System.out.println("=====쿼리문?=====");
tx.commit();
위의 코드는 조회를 했을 때입니다.
- 조회를 했을 때 쿼리문이 발생하지 않습니다.
- 즉 jpa에서는 조회를 할 때 우선 영속성 컨텍스트의 1차 캐시에 존재여부를 확인하고 없으면 데이터베이스에 요청합니다.
=> 대부분의 요청이 트랜잭션 단위로 일어나기 때문에 엄청난 데이터 이득으로 이어지지는 않습니다.
엔티티 수정
이번에는 엔티티 수정에 대해서 알아보겠습니다.
다른 말로는 변경감지라고 하며 영어로는 더티체킹이라고 합니다.
Member member = em.find(Member.class, 100L);
member.setName("aaa");
tx.commit();
위의 코드를 실행시키면
사진과 같이 select와 update문이 발생합니다.
- 즉, 특별히 update코드 없이 데이터가 수정되는 것입니다.
이 사진을 보시면 더 쉽게 이해하실 수 있습니다.
- 우선 em.find로 데이터베이스에서 데이터를 가져올 때 스냅샷을 찍고 1차캐시에 저장합니다.
- 트랜잭션이 마무리 될 때 flush()가 발생하고 이때 스냅샷과 entity의 값을 비교합니다.
- 비교해서 달라진 값이 존재한다면 update 쿼리를 발생시킵니다.
출처
https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔
www.inflearn.com
'JPA' 카테고리의 다른 글
JPA 엔티티 매핑 - 필드와 컬럼 매핑 (0) | 2021.11.23 |
---|---|
JPA 엔티티 매핑 - 데이터베이스 스키마 자동 생성 (0) | 2021.11.16 |
JPA 엔티티 매핑 - 소개 및 객체와 테이블 매핑 (0) | 2021.11.15 |
jpa - 플러시, 준영속 상태 (0) | 2021.10.16 |
JPA - 영속성 컨텍스트 (0) | 2021.10.15 |
댓글