1. 영속성 컨텍스트란,

- jpa에서 가장 중요한 용어로, “엔티티를 영구 저장하는 환경”이라는 뜻이다.
- EntityManager.persist(”entity”); 를 통해 생성해서 접근할 수 있다.
- 눈에 보이지 않는 논리적인 개념
- 엔티티의 생명주기
- 비영속 ( new / transient ) : 영속성 컨텍스트와 전형 관계가 없는 새로운 상태
- 영속 ( managed ) : 영속성 컨텍스트에 관리되는 상태
- 준영속 ( detached ) : 영속성 컨텍스트에 저장됐다가 분리된 상태
- 삭제 ( removed ) :삭제된 상태
2. 엔티티 조회, 1차 캐시


- BEFORE, AFTER 사이에 em.persist(member)로 저장을 했는데 콘솔을 보면 BEFORE, AFTER 후에 저리된걸 볼수 있다.
이건 등록될 때 1차 캐시로 먼저 저장을 하고 commit 될 때 저장하는 구조이기 때문이다. 이때 em.find는 commit 시점이 아니라 캐시에서 확인 후 있으니까 바로 반환 받는다.
3. 영속 엔티티의 동일성 보장


- 처음 실행할 때 한 번 가져오고 캐시에 저장한 후에 존재하면 캐시에서 가져오기 때문에 콘솔을 보면 1번만 실행하고 캐시에 저장된 데이터를 가져오는걸 볼 수 있다.
그리고 캐시에 저장된 데이터를 가져오기 때문에 둘은 같은 엔티티로 비교하면 true가 나온다.
4. 트랜잭션을 지원하는 쓰기 지원


- insert문으로 DB에 등록하는 쿼리가 있어도 1차 캐시에 저장하고 COMMIT되는 시점에 등록되는데, 1차 캐시에 저장될 때 쓰기 지연 SQL 저장소에도 저장된다.
그래서 1차 캐시에 저장하고, 쓰기 지연 SQL 저장소에도 저장하고 COMMIT 될 때 같이 저장된다.

- 설명이 읽고 코드를 보면 순서가 이해가 잘 될 것이다.

- 그래서 로직상 ===가 마지막인데 콘솔에 출력된 걸 보면 ===가 먼저 나오고 INSERT문이 마지막에 2번 진행되는 걸 확인할 수 있다.

- 그럼 나는 10개 이상 쿼리가 쌓이는걸 원치않은데.. 싶으면 persistence.xml에서 배치 옵션을 추가하면 보다 세밀하게 JPA를 사용할 수 있다.
- 빨간줄의 표시가 쿼리문이 10가 되면 먼저 COMMIT을 진행하는 옵션이다.
5. 엔티티 수정

- 수정시에는 내용을 수정하고 persist에 넣는 작업이 필요없다.

- 콘솔을 보면 peresist에 넣는 작업이 없음에도 자동으로 update문이 적용된 걸 확인할 수 있다.

- 저렇게 가능한 이유는 영속 컨텍스트가 만들어지고 1차 캐시에 저장되기 전에 flush()가 적용되면서 초기의 상태를 스냅샷이라는 영역에 저장을 하고, 1차 캐시가 저장될 때 비교해서 변경된 부분이 있으면 자동으로 쓰기 지연 SQL 저장소에 저장이 되고 DB에 flush를 먼저하고 commit이 된다.
6. 엔티티 삭제

- 삭제는 엔티티에서 대상 조회 후 em.remove로 삭제하면 끝이다. 영속성 컨텍스트에서 삭제하는 구조는 저장되고 삭제되는 것만 다르지 insert와 같다.
출처 : 인프런 김영한 강사님