영속성 컨텍스트는 JPA 개념에서 매우 중요하고 잘 이해하고 넘어가야 하는 개념이므로 최대한 흐름을 머릿속으로 생각하면서 정리하기.
영속성 컨텍스트란?
- 엔티티를 영구 저장하는 환경이라는 뜻
- 엔티티 매니저를 통해서 영속성 컨텍스트에 접근
엔티티의 생명주기
1. 비영속 - 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
2. 영속 - 영속성 컨텍스트에 관리되는 상태
3. 준영속 - 영속성 컨텍스트에 저장되었다가 분리된 상태 ex) em.detach(entity) - 특정 엔티티만 준영속 상태로 전환
// em.clear() - 영속성 컨테스트를 완전히 초기화 // em.close() - 영속성 컨텍스트를 종료
4. 삭제 - 삭제된 상태
//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//객체를 저장한 상태(영속)
em.persist(member);
//회원 엔티티를 영속성 컨텍스트에서 분리(준영속 상태)
em.detach(member);
//객체를 삭제한 상태(삭제)
em.remove(member);
영속성 컨텍스트의 이점
- 1차 캐시
- 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연
- 변경 감지 ex) 객체에 새로운 데이터로 변경시 jpa가 자동으로 update sql을 db에 보냄
- 지연 로딩
1차 캐시
영속 상태인 엔티티를 조회하면 1차 캐시에서 조회를 하므로 DB로 쿼리를 보내지 않고도 조회 가능하다
만약 1차 캐시에 없는 엔티티를 조회 시 해당 엔티티를 DB에서 조회 후 가져오고 1차 캐시에 추가로 넣어준다 그 후로는 1차 캐시에서
조회 가능
동일성 보장
1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
트랜잭션을 지원하는 쓰기 지연
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // 트랜잭션 시작
em.persist(MemberA);
em.persist(MemberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // 트랜잭션 커밋
엔티티 수정(변경 감지)
// 위에 엔티티매니저 코드 생략....
transaction.begin(); //트랜잭션 시작
//영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
//영속 엔티티 데이터 수정
memberA.setUsername("Hi");
memberA.setAge(10);
//!!!! em.update(member) 코드가 없어도 데이터가 변경되는 이유 글에서 설명 !!!
transaction.commit();
update 관련 코드를 작성하지 않아도 해당 데이터가 바뀌는 이유는 영속 컨텍스트에서 엔티티와 스냅샷을 비교해 데이터 변경이 있으면 해당 데이터로 update sql를 db로 보낸다.
플러시
- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것이다.
- 플러시 발생시 변경 감지 , 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 , 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
- 영속성 컨텍스트를 플러시하는 방법 1. em.flush() 2. 트랜잭션 커밋 3. JPQL 쿼리 실행
- 플러시는 영속성 컨텍스트를 비우는 것이 아님
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 된다.
[출처] 해당 내용은 김영한 강사님의 인프런 강의를 학습하며 복습을 위해 정리한 글입니다. - https://www.inflearn.com/course/ORM-JPA-Basic
'Spring > JPA' 카테고리의 다른 글
| [JPA] 상속관계 매핑 (0) | 2023.03.05 |
|---|---|
| [JPA] 연관관계 매핑의 종류 (0) | 2023.03.05 |
| [JPA] EntityMapping / 연관관계 매핑2 (0) | 2023.03.04 |
| [JPA] EntityMapping / 연관관계 매핑 1 (0) | 2023.03.04 |
| [JPA | 전체적인 흐름 키워드 위주로 정리] JPA는 무엇인가? (0) | 2023.03.03 |