
GIF 출처 : https://sigridjin.medium.com/spring-transaction-관리에-대한-메모-f391fd2885b4
그림 자료 출처 : 김영한 - 자바 ORM 표준 JPA 프로그래밍 그림자료
1 ) JPA 란?
2 ) JPA 구동 방식
3 )
4 )

JPA는 영속성 콘텍스트 ( Persistence Context ) 라는 환경을 통해 Entity를 저장한다. 여기서 영속성 콘텍스트는 " 엔티티를 영구 저장하는 환경 " 이라는 의미를 가지고 있다.
" 그럼 JPA가 데이터베이스에 어떠한 과정을 통해서 데이터를 CRUD 하는가? "
먼저 JPA의 설정정보를 담은 파일을 조회하여 정보를 찾는다. 이는 데이터베이스의 URL , USERNAME , PASSWORD 등을 담고 있다. 그 후에 EntityManagerFactory를 생성하여 EntityManager를 생성하여 Entity를 관리한다.

이를 토대로 사용자가 특정한 요청을 웹 어플리케이션에 주문한 상황을 예시로 들어보자. 사용자가 요청을 하게 되면 EntityManagerFactory는 그에 맞는 EntityManager를 생성한다. 그 후 EntityManager를 통해서 사용자는 DB에 접근하는 트랜잭션 과정을 거친다. 
해당 과정을 통해서 JPA는 데이터베이스와 사용자의 요청 사이에서 CRUD가 이루어지도록 한다. 이때 엔티티는 하나의 생명주기를 가지는데 총 4가지의 생명주기 상태가 존재한다.
- 엔티티의 생명주기
1. 비영속 ( new / transient )
: 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
2. 영속 ( managed )
: 영속성 컨텍스트에 관리되는 상태
3. 준영속 ( detached )
: 영속성 컨텍스트에 저장되었다가 분리된 상태
4. 삭제 ( Removed )
: 삭제가 된 상태
그럼 이러한 영속성 콘텍스트를 사용하는 이유는 무엇인가? 영속성 콘텍스트를 사용하는 것에는 다양한 이점이 뒤따른다.
- 장점
- 1차 캐시이기 때문에 매번 SQL을 던지지 않는다. 이 때문에 데이터베이스의 접근을 최소화한다.
- 그에 따른 지연 로딩 , 쓰기 지연으로 데이터베이스 접근 최소화
- 변경 감지로 영속성 컨텍스트가 엔티티의 변경 사항을 자동으로 감지하여 트랜잭션 커밋 시 변경된 엔티티만 데이터베이스에 반영하는 장점
그렇다면 어떠한 과정을 통해 1차캐시와 DB의 접촉이 이루어지는가?

JPA는 1차 캐시에서 @Id 값을 통해서 Entity를 조회하고 해당하는 정보를 가져온다. 만약 해당하는 @Id가 존재하지 않을경우 DB를 조회한 후 이를 1차 캐시에 저장하게 된다.