영속성 컨텍스트란?
엔티티를 영구 저장하는 환경 임.
DB에서 꺼내온 데이터 객체를 보관하는 역할을 함.
영속성 컨텍스트는 '엔티티 매니저'를 통해 엔티티를 조회하거나 저장할 때 엔티티를 보관하고 관리함.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("ㅁㅁㅁ"):
EntityManager em = emf.createEntityMenager();
Person sukhee = new Member();
sukhee.setId("sukhee");
sukhee.setUsername("인간병기");
JPA 엔티티 상태
1. 비영속(new) : 영속성 컨텍스트와 관계가 없는 상태. 실제 DB의 데이터와는 관련이 없고 그냥 JAVA 객체인 상태
2. 영속(Managed) : 엔티티 매니저를 통해 엔티티가 영속성 컨텍스트에 저장되어 관리되고 있는 상태. 데이터의 생성, 변경 등을 JPA가 추적하면서 DB에 반영함. (Dirty Check 처럼)
- em.persist(sukhee);
3. 준영속(Detached) : 영속성 컨텍스트로 관리 되다가 분리된 상태
- em.detech(sukhee) : 엔티티를 영속성 컨텍스트에서 분리
- em.clear() : 영속성 컨텍스트 비우기
- em.close() : 영속성 컨텍스트 종료
4. 삭제(Removed) : 영속성 컨텍스트에 삭제된 상태
- em.remove(sukhee)

<1차 캐시>
구조
엔티티 매니저
> 영속성 컨텍스트
> 1차 캐치 & 쓰기 지연 SQL 저장소
영속성 컨텍스트 안에는 '1차 캐시' 가 존재함.
Q - 왜 있음? 어디다 씀?
DB를 이용하는 작업은 많은 비용이 발생함.
조회 등의 작업은 굉장히 빈번히 일어나는데, 조회 요청이 있을 때마다 DB에 SQL 날리는 건 굉장히 비효율적이라고 생각 안 함? 비용이 너무 많이 발생함. 이런 낭비를 없애기 위한 것이 바로 1차 캐시!

진행 흐름
1. 데이터 요청이 있을 때 1차 캐시를 먼저 조회함.
2. 1차 캐시 내에 해당 데이터가 있다면 1차 캐시에 담긴 내용을 그대로 반환
3. 해당 데이터가 없다면 DB로 쿼리를 날려 값을 받아옴.
4. 요청에 응답하기 전, 가져온 데이터를 1차 캐시에 저장하고 값을 반환함.
=> 같은 요청이 들어오면 미리 가져온 값을 이용하면 되니 비용이 절감됨.
<쓰기 지연 SQL 저장소>

<<설명이 굉장히 난해함.해당 부분은 보지 말 것. (추후 수정)>>
작업이 필요한 내용이 있을 때 마다 DB에 요청을 보내는 것은 몹시 비효율적임.
.persist(memberA)
.persist(MemberB)
1. 이렇게 엔티티 컨텍스트에 요청 내용들을 영속화하고
2. Entity Manager 를 통해 commit() 메서드를 호출하면,
2-2. Flush가 일어나 영속성 컨텍스트에 쌓인 SQL문을 DB로 보냄
2-3. 흘러들어온 SQL문을 DB에 반영시킴
DirtyChecking ( 데이터 변경을 감지해 자동으로 수정함 )

update 등의 수정작업을 할 때
repository.save() 를 통해 엔티티를 저장하던가
해당 메서드에 @Transactional 을 붙여주면 DB까지 값 변경이 반영됨.
1차 캐시 사용의 장점
- DB 조회 횟수를 줄임
- 1차 캐시를 사용해 DB row 1개 당 객체 1개가 사용되는 것을 보장 (객체 동일성 보장)
'스프링' 카테고리의 다른 글
| @Enumerated (value = EnumType.ORDINAL) 지양하는 이유 (0) | 2022.12.28 |
|---|---|
| 22.12.26 회고 (0) | 2022.12.26 |
| 콘솔 sql 가독성 살리기 (0) | 2022.12.22 |
| API에 원하는 컬럼만 추려서 반환하는 방법 (0) | 2022.12.21 |
| Bean 등록하기 (0) | 2022.12.19 |
댓글