[TIL] 2025-03-11

Yuri·2025년 3월 11일

TIL

목록 보기
58/59
post-thumbnail

@PersistenceContext

  • EntityManager를 빈으로 주입할 때 사용하는 어노테이션

    • 스프링에서는 영속성 관리를 위해 EntityManager 가 존재한다.
    • Spring Container 가 시작될 때 EntityManager를 만들어서 빈으로 등록해둔다.
    • 이 때, 스프링이 만들어둔 EntityManager를 주입받을 때 사용한다.
      👉 @Autowired 대신 @PersistenceContext
  • @PersistenceContext 로 지정된 프로퍼티에 아래 두 가지 중 한 가지로 EntityManager를 주입한다.

    • EntityManagerFactory에서 새로운 EntityManager를 생성한다.
    • Transaction에 의해 기존에 생성된 EntityManager를 반환해준다.

@PersistenceContext를 사용하는 이유

  1. EntityManager는 여러 쓰레드가 동시에 접근하면 동시성 문제가 발생하여 쓰레드 간에는 EntityManager를 공유해서는 안된다.
    • 일반적으로 스프링은 싱글톤 기반으로 동작하기에 빈은 모든 쓰레드가 공유한다.
    • @PersistenceContext으로 EntityManager를 주입받아도 동시성 문제가 발생하지 않는다.
  2. 동시성 문제가 발생하지 않은 이유
    • 스프링 컨테이너가 초기화되면서 @PersistenceContext 으로 주입받은 EntityManager를 Proxy로 감싼다.
    • EntityManager 호출 시 마다 Proxy를 통해 EntityManager를 생성하여 Thread-Safe를 보장한다.

🔗 참고
@PersistenceContext

⛓️‍💥 연관관계

양방향 사용을 지양하자

실무에서 양방향을 지양하는 이유는 사이드 이펙트 때문이다.
👎 비즈니스 로직에서 명확하게 통제되지 않은 사이드 이펙트는 유지보수하기 어렵다.

문제를 간단히 하자

@OneToMany의 cascade, orphanRemoval ... 등 복잡하게 사이드 이펙트를 고려하고 예상하기 보다 사이드 이펙트를 유발하는 연관관계는 줄이자.
@ManyToOne 을 사용하자!

🎬 오늘의 영상학습

https://www.youtube.com/watch?v=Xc0t4O-TuPY

profile
안녕하세요 :)

0개의 댓글