[JPA] EntityManager 와 Thread Safety

GuruneLee·2023년 1월 1일
0

Let's Study 공부해요~

목록 보기
32/36
post-thumbnail

Thread Safe하지 않은 객체를 싱글톤 빈으로 등록하고 주입받아 사용하면 어떻게 될까.

컨테이너에 등록된 싱글톤빈은 동일한 인스턴스로서 여러 스레드에서 사용된다.
따라서, Thread Safe하지 않은 빈을 주입받으면 다중 스레드 상황(ex.같은 요청이 여러번 들어옴)에서 예상치 못한 결과가 나타날 수 있다.

이 때 대표적인 예가, JPA의 영속성컨텍스트를 관리하는 EntityManager 객체이다.
EntityManager는 Thread Safe하지 않으므로, 주입받아서 사용하면 파멸을 불러올 수 있다.

// 이렇게 쓰면 안된다는 말이다
@Component
class SomeComponent(
    private val entityManager: EntityManager
) { //... }

따라서 EntityManger를 사용할 때는, 사용처마다 새로운 인스턴스를 만들어주어야 하며, 이를 위해 EntityManagerFactory가 쓰인다. EntityManagerFactory는 Thread Safe하므로, 빈에 등록해두고 마음껏 사용해도 된다 이말입니다.

// Factory 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("name")
// entity manager 생성
EntityManager em = emf.createEntityManager();

혹은, @PersistentContext 어노테이션을 사용해 EntityManager를 주입받으면 EntityMagerFactory를 사용할 때 처럼 사용하는게 가능하다 (내부적으로 EntityManagerFactory를 사용하기 때문)


@PersistentContext와 관련해선 다음 블로그를 참고해보자. 이해가 잘 가진 않는다.

profile
Today, I Shoveled AGAIN....

0개의 댓글