본문 바로가기
JPA/Annotation

@PersistenceContext

by BAYABA 2021. 10. 13.
  1. 개인 공부 목적으로 작성한 글입니다.
  2. 아래 출처를 참고하여 작성하였습니다.

목차

  1. @PersistenceContext 란?
  2. @PersistenceContext를 사용해야 하는 이유

1. @PersistenceContext 란?

  1. EntityManager를 빈으로 주입할 때 사용하는 어노테이션입니다.
  • 스프링에서는 영속성 관리를 위해 EntityManager가 존재합니다.
  • 그래서 스프링 컨테이너가 시작될 때 EntityManager를 만들어서 빈으로 등록해둡니다.
  • 이 때 스프링이 만들어둔 EntityManager를 주입받을 때 사용합니다.
  1. @PersistenceContext로 지정된 프로퍼티에 아래 두 가지 중 한 가지로 EntityManager를 주입해줍니다.
  • EntityManagerFactory에서 새로운 EntityManager를 생성하거나
  • Transaction에 의해 기존에 생성된 EntityManager를 반환해줍니다.

2. @PersistenceContext를 사용해야 하는 이유

  1. EntityManager를 사용할 때 주의해야 할 점은 여러 쓰레드가 동시에 접근하면 동시성 문제가 발생하여 쓰레드 간에는 EntityManager를 공유해서는 안됩니다.
  • 일반적으로 스프링은 싱글톤 기반으로 동작하기에 빈은 모든 쓰레드가 공유합니다.
  • 그러나 @PersistenceContext으로 EntityManager를 주입받아도 동시성 문제가 발생하지 않습니다.
  1. 동시성 문제가 발생하지 않는 이유는
  • 스프링 컨테이너가 초기화되면서 @PersistenceContext으로 주입받은 EntityManager를 Proxy로 감쌉니다.
  • 그리고 EntityManager 호출 시 마다 Proxy를 통해 EntityManager를 생성하여 Thread-Safe를 보장합니다.

출처

  1. [Spring] annotation 종류와 쓰임새
  2. Spring에서 @PersistenceContext의 동작 원리
  3. 5. [JPA] 엔티티 매니저

'JPA > Annotation' 카테고리의 다른 글

@MappedSuperclass  (0) 2021.10.10
@JoinColumn  (0) 2021.10.06
@EnableJpaRepositories  (0) 2021.09.27
@EntityScan  (0) 2021.09.27