한줄정리
@PersistenceContext
private EntityManager entityManager;

@PersistenceContext 어노테이션이 스프링 컨테이너에 등록된 빈을 찾아 주입 해줍니다.

 


EntityManager 사용

 

Java 에서 EntityManager는 다음과 같이 사용했을 겁니다.

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");
EntityManager entityManager = entityManagerFactory.createEntityManager();

EntityTransaction entityTransaction = entityManager.getTransaction();

entityTransaction.begin();

try {
    // ... 작업
    
    // 트랜젝션 커밋
    entityTransaction.commit();
} catch (Exception e) {
    e.printStackTrace();
    entityTransaction.rollback();
} finally {
    entityManager.close();
}

entityManagerFactory.close();

코드를 보면 알 수 있지만

트랜잭션을 우리가 직접 관리합니다.

 

필요에 따라서 영속성 컨텍스트를 비워야 한다면 중간에 다음과 같은 코드를 추가해줍니다.

entityManager.flush();
entityManager.clear();

영속성 컨텍스트의 1차 캐시 내용을 모두 DB에 반영하고 영속성 컨텍스트를 비우라는 로직입니다.

 

그런데 스프링 프레임워크 내에서 JPA 를 사용할 때에는 트랜젝션을 관리하는 일을 프레임워크가 처리해줍니다.

따라서 애플리케이션 초기화 시점에 EntityManager를 Bean으로 등록 하는데

이렇게 등록된 EntityManager 빈을 어노테이션의 도움을 받아 주입 하는 것 입니다.

 

@Autowired 와 동일한 기능이나 스프링 부트 낮은 버전에서는 @Autowired 어노테이션이 동작하지 않을 수 있습니다.