EntityManagerFactory는 여러 스레드에서 동시에 접근해도 안전하지만, 생성하는 비용이 상당히 크다. 따라서 EntityManagerFactory에서 요청이 올때마다 생성 비용이 거의 없는 EntityManager를 생성한다. (EntityManager는 Thread Safe하지 않아, 여러 스레드가 동시에 접근하면 동시성 문제가 발생한다 = 요청(스레드)별로 한개 씩 할당)
이때 만들어진 EntityManager는 내부적으로 Database Connection을 사용해서 DB를 사용한다.
영속성 컨텍스트란?
- JPA를 이해하는데 가장 중요한 용어이다.
- 엔티티를 영구 저장하는 환경이라는 뜻이다.
- 어플리케이션과 DB사이에서 객체를 보관하는 가상의 DB같은 역활을 한다.
- 서비스별로 하나의 EntityManager Factory가 존재하며 Entity Manager Factory에서 디비에 접근하는 트랜잭션이 생길 때 마다 쓰레드 별로 Entity Manager를 생성하여 영속성 컨텍스트에 접근한다!
- EntityManager에 엔티티를 저장하거나 조회하면 EntityManager는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
- 영속성 컨텍스트 EntityManager를 생성할 때 만들어지며 EntityManager를 통해 영속성 컨텍스트에 접근하고 관리한다.
1차 캐시
- Save 메서드와 같이 DB변경하는 메서드를 실행하였을 때 바로 DB가 업데이트 되지 않고 영속성 컨텍스트 내부에 있는 캐시를 거쳐서 DB가 업데이트 된다. 해당 캐시를 1차 캐시라고 부름.
1차 캐시가 있으므로 좋은점?
만약에 1차 캐시에 없을 경우 DB에서 직접 조회하고 1차 캐시에 저장후 반환 요총이 시작되면 영속성 컨텍스트를 생성하고 끝나면 영속성 컨텍스트를 지움. 이때 1차 캐시도 삭제된다. 따라서 애플리케이션 전체에서 공유하는 것이 아님
JPA 동작 순서(find를 했을경우).
- 유저가 요청을 보내면 EntityManagerFactory에서 EntityManager을 생성해준다.
- EntityManager가 영속성 컨텍스트에 접근해 1차캐시 저장소에서 값이 있는지 조회한다.
- 값이 존재 한다면 DB로 쿼리문을 날리지않고 바로 반환해준다.
- 값이 존재 하지 않다면 DB로 들어가 조회한후에 영속성 컨텍스트에 저장한후 반환한다.
Reference
[JPA] 영속성 컨텍스트란?
잘 보고 갑니다~~ 역시 재피터의 노트북!!