• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

엔티티 매니저 동시성

23.02.19 18:26 작성 조회수 465

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

일반적으로 스프링 컨테이너는 싱글톤 기반으로 동작하기에 빈은 모든 쓰레드가 공유합니다. 그런데@PersistenceContext을 통해 주입 받은 EntityManager는 동시성 문제가 발생하지 않는다고 해서 의문이 생겼습니다. 따라서 관련된 내용을 공부하던 중 아래 질문의 영한님 답변을 봤습니다. https://www.inflearn.com/questions/158967/%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94-entitymanager%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B6%81%EA%B8%88%ED%95%9C-%EC%A0%90%EC%9D%B4-%EC%9E%88%EC%96%B4-%EC%A7%88%EB%AC%B8-%EB%82%A8%EA%B9%81%EB%8B%88%EB%8B%A4

제가 이해한 바로는 private final EntityManager em;를 통해 주입 받은 엔티티매니저는 싱글톤 빈이지만 일반적인 빈들과는 다릅니다.

공통점 : 일반적인 스프링 빈과 엔티티 매니저는 모두 프록시 객체를 주입받는다. 그리고 이는 모두 싱글톤이다.

차이점 : 일반적인 스프링 빈은 호출될때마다 에플리케이션 전체를 대상으로 해당 빈이 스프링 컨테이너에 등록되어 있는지 찾고 있으면 스프링 컨테이너에서 찾아 반환, 없으면 빈을 생성하고 등록(CGLIB 기술)

반면 엔티티매니저는 이해가 가지 않습니다. 책 581 페이지를 보면 A, B 코드에서 호출한 엔티티 매니저는 서로 다르며 , 582에서 멀티 쓰레드에서 같은 코드에서 호출한 엔티티 매니저는 서로 같습니다.

일반적인 싱글톤 빈들이나 엔티티 매니저 모두 싱글톤이며 프록시 객체를 주입 받는 것 같은데 그 안의 원리들이 조금 다른 것 같은데 이 점이 궁금합니다.

답변 1

답변을 작성해보세요.

0

안녕하세요. 흥흐음님

EntityManager em;를 통해 주입 받은 엔티티매니저는 가짜 프록시 엔티티 메니저 입니다.

이 엔티티매니저를 호출하면 현재 쓰레드가 사용하는 트랜잭션에 묶여 있는 영속성 컨텍스트를 사용하게 됩니다.

쓰레드1과 쓰레드2는 각각 사용하는 트랜잭션이 다릅니다. 그리고 동시에 같은 메서드를 호출하더라도 쓰레드1은 쓰레드1이 사용하는 영속성 컨텍스트에 접근하고, 쓰레드2는 쓰레드2가 사용하는 영속성 컨텍스트에 접근하게 됩니다.

이것을 바로 가짜 프록시 엔티티 메니저가 중간에서 이런 역할을 해주는 것이지요.

책 581 페이지의 13.4 스레드와 영속성 컨텍스트 그림은 같은 메서드를 호출하는 것으로 생각하시면 됩니다. 여기서 핵심은 바로 트랜잭션입니다. 같은 트랜잭션을 사용하면 같은 영속성 컨텍스트에 접근한다고 이해하시면 됩니다.

감사합니다.