JPA - 영속성 컨텍스트의 이점

iseon_u·2022년 7월 2일
0

JPA

목록 보기
3/6
post-thumbnail

영속성 컨텍스트의 이점


  • 1차 캐시
  • 동일성 (identity) 보장
  • 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
  • 변경 감지 (Dirty Checking)
  • 지연 로딩 (Lazy Loading)

엔티티 조회, 1차 캐시

// 엔티티를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setName("회원1");

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

1차 캐시에서 조회

  • 먼저 1차 캐시에서 조회
  • 엔티티가 있다면 캐시에 있는 값을 그대로 조회
// 엔티티를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setName("회원1");

// 1차 캐시에 저장된 상태
em.persist(member);

// 1차 캐시에서 조회
Member findMember = em.find(Member.class, "member1");

데이터베이스에서 조회

  1. 1차 캐시에 있는지 확인
  2. DB 조회
  3. 조회한 값 1차 캐시에 저장
  4. 반환
Member findMember2 = em.find(Member.class, "member2");

영속 엔티티의 동일성 보장

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "Member1");

System.out.println(a == b); // 동일성 비교 true
  • 1차 캐시로 반복 가능한 읽기 (REPEATABLE READ) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공

엔티티 등록

트랜잭션을 지원하는 쓰기 지연

  • 커밋하는 순간에 DB 에 SQL 전송
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

// 엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.

transaction.begin(); // 트랜잭션 시작

em.persist(memberA);
em.persist(memberB);
// 여기까지 INSERT SQL 을 데이터베이스에 보내지 않는다.

// 커밋하는 순간 데이터베이스에 INSERT SQL 을 보낸다.
transaction.commit(); // 트랜잭션 커밋

엔티티 수정

변경 감지

  1. 엔티티를 찾는다.
  2. 값을 변경한다.
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(); // 트랜잭션 커밋

변경 감지

Dirty Checking

스냅샷

  • 최초 시점, 값을 읽어온 시점의 상태를 저장
  • 엔티티와 스냅샷 비교

엔티티 삭제

Member memberA = em.find(Member.class, "memberA");
em.remove(memberA); // 엔티티 삭제
profile
🧑🏻‍💻 Hello World!

0개의 댓글