- 엔티티를 영속 시킨다.
- 내부의 1차캐시가 있다.
- @id (Key)
- Entity (Value)
- 내부의 1차캐시가 있다.
이렇게 되면 무슨 이점이 있을까?
1. 1차 캐시에서 조회
멤버객체를 저장하고 조회를 하면
jpa는 영속성 컨텍스트에서
- 1차 캐시를 조회(DB를 바로 가지않음)
2. 데이터베이스에서 조회
1차 캐시에 없는 데이터를 조회 해보자
- 1차 캐시를 조회(없는 상황)
- DB에서 조회
- 1차 캐시에 저장
- 해당 데이터 반환
- 엔티티 매니저라는 것은 데이터베이스 트랜잭션 단위로 만들고 끝나면 종료된다.
- 고객의 요청이 하나 들어와서 비즈니스가 끝나면 영속성 컨텍스트가 지워져서 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(); // [트랜잭션] 커밋
- 영속성 컨텍스트 안에는 쓰기 지연 SQL 저장소 라는 것이 있다.
- persist(memberA)
- 1차캐시에 memberA 들어감
- 동시에 JPA가 엔티티를 분석하여 Insert Query 생성
- 쓰기지연 SQL 저장소에 쿼리 저장
- persist(memberB)
- 1차캐시에 memberB 들어감
- 동시에 JPA가 엔티티를 분석하여 Insert Query생성(현재 insert Query가 2개 저장되어 있음)
- transaction.commit();
- flush
- 영속성 컨텍스트의 변경 내용을 DB 에 반영하는 것을 말한다
- commit
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가 실행되는걸 알 수 있다.
- 비밀이 뭘까??
- 바로 영속성 컨텍스트 안에 있다.
- 1차 캐시에는스냅샷이라는 것이 들어있다. 최초 시점의 상태를 스냅샷을 떠둔다.
- JPA는 commit하는 시점에 flush()가 호출된다.
- 이때 엔티티와 스냅샷을 비교한다.
- 비교를 해보고 바뀌었다면
- UPDATE Query를 쓰기 지연 저장소에 저장하고
- DB반영
- 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 |