https://www.inflearn.com/course/ORM-JPA-Basic/unit/21687?category=questionDetail&q=385382

  1. 엔티티를 영속 시킨다.
    1. 내부의 1차캐시가 있다.
      1. @id (Key)
      2. Entity (Value)

이렇게 되면 무슨 이점이 있을까?


1. 1차 캐시에서 조회

https://www.inflearn.com/course/ORM-JPA-Basic/unit/21687?category=questionDetail&q=385382

멤버객체를 저장하고 조회를 하면

jpa는 영속성 컨텍스트에서

  • 1차 캐시를 조회(DB를 바로 가지않음)

2. 데이터베이스에서 조회

https://www.inflearn.com/course/ORM-JPA-Basic/unit/21687?category=questionDetail&q=385382

1차 캐시에 없는 데이터를 조회 해보자

  1. 1차 캐시를 조회(없는 상황)
  2. DB에서 조회
  3. 1차 캐시에 저장
  4. 해당 데이터 반환
  • 엔티티 매니저라는 것은 데이터베이스 트랜잭션 단위로 만들고 끝나면 종료된다.
  • 고객의 요청이 하나 들어와서 비즈니스가 끝나면 영속성 컨텍스트가 지워져서 1차 캐시가 지워져버려 그다지 큰 이득을 볼 수 있다곤 할 수 없다.

3. 영속 엔티티의 동일성 보장

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b);
  • 콘솔에 찍히는 값은 true 이다.
  • 1차 캐시로 반복 가능한 읽기(REPEEATABLE READ) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공

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

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋

https://www.inflearn.com/course/ORM-JPA-Basic/unit/21687?category=questionDetail&q=385382&tab=curriculum

  • 영속성 컨텍스트 안에는 쓰기 지연 SQL 저장소 라는 것이 있다.
  1. persist(memberA)
  2. 1차캐시에 memberA 들어감
  3. 동시에 JPA가 엔티티를 분석하여 Insert Query 생성
  4. 쓰기지연 SQL 저장소에 쿼리 저장
  5. persist(memberB)
  6. 1차캐시에 memberB 들어감
  7. 동시에 JPA가 엔티티를 분석하여 Insert Query생성(현재 insert Query가 2개 저장되어 있음)
  8. transaction.commit();
  9. flush
    • 영속성 컨텍스트의 변경 내용을 DB 에 반영하는 것을 말한다
  10. commit

https://www.inflearn.com/course/ORM-JPA-Basic/unit/21687?category=questionDetail&q=385382&tab=curriculum

5. 엔티티 수정 - 변경 감지

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // [트랜잭션] 시작
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
//em.update(member) 이런 코드가 있어야 하지 않을까?
transaction.commit(); // [트랜잭션] 커밋
  • 단순히 값만 바꿨지만
  • UPDATE Query가 실행되는걸 알 수 있다.
  • 비밀이 뭘까??

https://www.inflearn.com/course/ORM-JPA-Basic/unit/21687?category=questionDetail&q=385382&tab=curriculum

  1. 바로 영속성 컨텍스트 안에 있다.
  2. 1차 캐시에는스냅샷이라는 것이 들어있다. 최초 시점의 상태를 스냅샷을 떠둔다.
  3. JPA는 commit하는 시점에 flush()가 호출된다.
  4. 이때 엔티티와 스냅샷을 비교한다.
  5. 비교를 해보고 바뀌었다면
  6. UPDATE Query를 쓰기 지연 저장소에 저장하고
  7. DB반영
  8. commit() 수행

'DB > JPA' 카테고리의 다른 글

객체와 테이블 매핑  (0) 2022.12.30
준영속 상태  (0) 2022.12.30
플러시  (1) 2022.12.30
영속성 컨텍스트 1  (0) 2022.12.30
JPA - 애플리케이션 개발  (0) 2022.12.30

+ Recent posts