티스토리 뷰

JPA

[JPA] 영속성 컨텍스트 장점

sayho 2023. 7. 9. 14:41
1차캐시

Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

// 1차 캐시에 저장됨
em.persist(member);

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

- find 를 사용하여 데이터 조회 시 데이터베이스를 먼저 찾는것이 아닌 1차 캐시를 먼저 조회해서 데이터를 찾음

Member findMember2 = em.find(Member.class, "member2");

영속 엔티티의 동일성 보장

- 1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공

 

엔티티 등록 - 트랜잭션을 지원하는 쓰기지연
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

// 엔티티 매니저는 데이터 변경 시 트랜잭션을 시작하여야 함
transaction.begin();

em.persist(memberA);
em.persist(memberB);
// 여기까지 insert sql을 데이터베이스에 보내지 않음

// 커밋하는 순간 데이터베이스에 insert sql을 보낸다
transaction.commit();

- 트랜잭션이 커밋되면 쓰기지연 SQL 저장소에 있는 insert 문이 flush 되면서 데이터베이스에 데이터가 저장되고 커밋됨

 

엔티티 수정 - 변경 감지
Member memberA = em.find(Member.class, "memberA");
memberA.setUsername("hi");
memberA.setAge(10);

// em.update(memberA) 와 같은 코드가 있어야 할 것 같지만 필요 없음 

transaction.commit(); // 트랜잭션 커밋

- 엔티티와 스냅샷을 비교함

- 스냅샷은 최초로 데이터가 들어온 상태

 

플러시

- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것

- 변경감지

- 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록

- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)

- 영속성 컨텍스트를 비우는 것이 아닌 컨텍스트의 변경 내용을 데이터베이스에 동기화 하는 과정이다

 

영속성 컨텍스트를 플러시 하는 방법

- em.flush() 

- 트랜잭션 커밋

- JPQL 쿼리 실행

 

준영속 상태

- 영속상태의 엔티티가 영속성 컨텍스트에서 분리되는 상태(detached)

- dirty checking 을 사용할 수 없음

 

준영속 상태로 만드는 방법

- em.detach(entity)

- em.clear() : 영속성 컨텍스트 초기화

- em.close() : 영속성 컨텍스트 종료

'JPA' 카테고리의 다른 글

[JPA] 실전예제 1~2  (0) 2023.07.29
[JPA] 기본키 매핑  (0) 2023.07.29
[JPA] 엔티티 매핑  (0) 2023.07.09
[JPA] 영속성 컨텍스트  (0) 2023.07.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함