JPA를 사용하는데 EntityManager와 영속성 컨텍스트를 이해하지 못하게 사용해 왔다. 그래도 내가 사용하는 기술을 이해하지 못하고 사용하면 의도치 않게 동작하거나 버그가 발견되도 수정하는데 상당히 많은 시간을 쓰게 될 수 도 있기에 이번에 알아보려 한다.

Entity Manager

EntityManager를 직접 다룰일을 드물지만 1차 캐시를 비우려할때 em.clear()를 통해서 비워본 경험은 있다. 이때 EntityManager를 constructor Injection을 통해서 주입을 받는데, 그럼 EntityManager는 싱글톤으로 관리되는 걸까? 결론 부터 말하면 아니다. 주입을 받는 객체 마다 새로 생성해서 주입하는 것처럼 보인다.

두 Repository의 em(EntityManager)의 인스턴스 값을 보게되면 @10659, @12381로 다른 걸 확인할 수 있다.

그렇다면 EntityManager는 언제 생성될까? spring을 써본 사람은 쉽게 유추가 가능하게 Spring 컨테이너가 올라올때 빈을 생성하는데 이때 올라오게 된다.

EntityManager → Session → SessionImplementor → SessionImpl

스크린샷 2021-09-11 오후 8.05.46.png

스크린샷 2021-09-11 오후 8.04.05.png

스크린샷 2021-09-11 오후 8.05.09.png

스크린샷 2021-09-11 오후 8.05.34.png

스크린샷 2021-09-11 오후 8.09.14.png

영속성 컨텍스트