인프런 커뮤니티 질문&답변

씨쁠쁠러버님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요, EntityManager에 대해 궁금한 점이 있어 질문 남깁니다.

21.02.23 14:27 작성

·

2.7K

9

JPA 기본편 강의와 같이 듣고 있습니다.

좋은 강의 항상 감사드립니다.

(질문 도중 제가 잘못 이해 하고 있는 부분이 있다면 말씀주시기 바랍니다.)

다름 아니라 EntityManager는 요청이 들어올 때 생성되어 사용됬다가

해당 요청이 마무리 되면 삭제된다고 이해 하고 있습니다.

근데 @Repository를 DI를 통해 생성할 때 @RequiredArgsConstructor

를 통해 EntityManager도 생성해줍니다.

그럼 이 EntityManager 인스턴스는 @RequiredArgsConstructor

위 어노테이션으로 인해 필요할 때 마다 그 때 그 때 생성된다고 볼 수 있을까요? 

아니면 싱글톤 객체 안에 필드임으로 그 때 그 때 새로운 값을 할당 받는건가요?

감사합니다, 좋은 하루 되세요~

답변 2

19

김영한님의 프로필 이미지
김영한
지식공유자

2021. 02. 23. 22:38

안녕하세요. 승범님

먼저 @RequiredArgsConstructor는 단순하게 생성자를 자동으로 만들어주는 롬복 애노테이션입니다.

스프링은 생성자가 하나이면 자동으로 @Autowired가 적용됩니다.

따라서 EntityManager가 생성자를 통해서 주입되고, 최종적으로 다음 필드에 담겨집니다.

private final EntityManager em;

결과적으로 주입된 EntityManager는 싱글톤이 맞습니다.

여기에서 싱글톤이니 동시성 문제가 될 수 있지요.

스프링 프레임워크는 여기에 실제 EntityManager를 주입하는 것이 아니라, 사실은 실제 EntityManager를 연결해주는 가짜 EntityManager를 주입해둡니다.

그리고 이 EntityManager를 호출하면, 현재 데이터베이스 트랜잭션과 관련된 실제 EntityManager를 호출해줍니다.

덕분에 개발자는 동시성 이슈에 대한 고민없이, 쉽게 개발할 수 있습니다.

관련해서 JPA 책 13.1 트랜잭션 범위의 영속성 컨텍스트를 참고해보시면 더 자세한 내용을 이해하실 수 있습니다.

추가로 생성자 하나, @RequiredArgsConstructor 주입 부분은 스프링 핵심 원리 - 기본편에서 자세히 설명드립니다^^

감사합니다.

5

씨쁠쁠러버님의 프로필 이미지

2021. 02. 24. 11:09

정말 최고의 답변이네요, 동시성 문제 하며 

제가 명확히 질문드리지 못한 궁금한 점까지

다 짚어 주셨습니다. 정말 감사드립니다.

책에서 한 번 찾아봐야겠습니다.

강의는 간단한 프로젝트 끝나고 스프링에 대한 깊은 이해를 위해

꼭 듣도록 하겠습니다. 

감사합니다. 좋은 하루 되세요~