영속성 컨텍스트란?
- JPA를 이해하는데 가장 중요하다.
- 엔티티를 연구 저장하는 환경이라는 뜻이다.
- 영속성 컨텐스트는 눈에 보이는 것이 아니므로 EntityManager를 통해 접근한다.
// DB에 저장하는게 아닌 엔티티를 영속성 컨텍스트라는 곳에 저장하는것
EntityManager.persist(entity);
1. 비영속 상태
: JPA와 관련없음(EntityManager와 상관없음 + 사용하지않음)
// 비영속 상태
Member member = new Member();
member.setId(100L);
member.setName("HelloJPA");
2. 영속 상태
: EntityManager 사용 시점부터 영속 상태에 들어감 → 영속성 컨텍스트에 들어감
// 영속 상태
em.persist(member);
3. 준영속, 삭제
: em.detach(member) 실행하면 다시 영속성 컨텍스트에서 나옴
: em.remove()
4. 1차 캐시
- JPA는 일단 조회하면 무조건 영속성 컨텍스트에 올려둔다. (같은걸 조회하면 1차캐시에서 찾아옴)
- 영속성 컨텍스트에 들어가면 바로 DB에 들어가는것이 아닌 1차 캐시에 저장이 된다.
- 아래 이미지에서 find를 실행했음에도 select가 실행되지 않는 이유는 DB에서 찾아오는것이 아닌 먼저 1차 캐시에서 검색해왔기 때문!!
// 비영속 상태
Member member = new Member();
member.setId(101L);
member.setName("HelloJPA");
// 영속 상태(여기까지는 아직 쿼리를 날리지 않음)
em.persist(member);
Member findMember = em.find(Member.class, 101L);
5. 엔티티 등록( 트랜잭션을 지원하는 쓰기 지연 )
- memberA를 저장(persist) 하면 바로 DB로 쿼리를 날리는게 아니다.
- 저장하면 1차캐시에서 저장하고 쓰기지연 SQL 저장소에 쿼리를 생성하여 저장해둔다. ( SQL INSERT A, SQL INSERT B 생성된것 확인)
- 그럼 언제 DB로 날릴까?? transaction.commit 이 실행되면 DB로 쿼리를 날림!
6. 엔티티 수정
Member member = em.find(Member.class, 150L);
member.setName("ZZZZZ");
'JAVA' 카테고리의 다른 글
[JAVA] JPA 준영속 상태 (0) | 2021.11.09 |
---|---|
[JAVA] JPA 플러시(flush) (0) | 2021.11.09 |
[JAVA] JPA 애플리케이션 개발 (0) | 2021.11.02 |
[JAVA] JPA 프로젝트 생성(Maven) + 기본설정 (0) | 2021.11.02 |
[JAVA] JPA란? (0) | 2021.09.09 |