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
정말 최고의 답변이네요, 동시성 문제 하며
제가 명확히 질문드리지 못한 궁금한 점까지
다 짚어 주셨습니다. 정말 감사드립니다.
책에서 한 번 찾아봐야겠습니다.
강의는 간단한 프로젝트 끝나고 스프링에 대한 깊은 이해를 위해
꼭 듣도록 하겠습니다.
감사합니다. 좋은 하루 되세요~