본문 바로가기
JPA

JPA - 영속성 컨텍스트2

by 근즈리얼 2021. 10. 16.
728x90

저번 포스팅에 이어서 영속성 컨텍스트에 대해서 더 자세하게 알아보겠습니다.

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

 

728x90

댓글