인프런 커뮤니티 질문&답변
게시글 테스트 데이터 삽입 - @PersistenceContext 에 관하여
해결된 질문
작성
·
22
0
DataInitializer 와 관련하여, EntityManager 를 @Autowired 가 아닌, @PersistenceContent 로 가져온 까닭이 궁금합니다.
제가 이해한 바에 따르면, initialize 메서드에서 정의된 ExecutorService 의 스레드 풀은 트랜잭션 전파가 이뤄지지 않으니, TransactionTemplate 을 사용하여 명시적으로 트랜잭션 블록을 지정해주고, 영속화를 위한 과정에서, entityManager 의 프록시 객체가 트랜잭션 내부에서 적절한 객체를 가져와 수행한다고 알고 있습니다.
이 과정에서, EntityManager 의 프록시 객체를 위해 @PersistenceContext 를 사용하여 선언함은 알겠으나, @Autowired 를 사용하여 스프링에서 관리하는 것 역시도 SharedEntityManager 에서 파생된, 동일한 프록시 객체를 반환하는 걸로 알고 있습니다.
PersistenceContext 로 em 을 가져온 이유가 있나요? 아니면 선호하시는 방식이라 채택한 방법인가요?
물론 제가 이해한 바에서 틀린 부분이 있을 수도 있으니 잘못 이해한 바가 있으면 정정도 부탁드립니다.
강의 잘 보고 있습니다~
답변 1
0
jack8226님, 안녕하세요!
TransactionTemplate을 사용하여 트랜잭션을 따로 열고 EntityManager를 활용하는 부분은,
단순히 건건이 쿼리보단 벌크가 빠르므로 테스트 데이터 삽입을 빠르게 처리하기 위한 작업이었고,
그냥 JPA에서 bulk 연산을 하려면 트랜잭션 종료 시점에 한번에 flush 되니까 그렇게 처리할 수 있겠더라고요.
이를 위해 TransactionTemplate으로 트랜잭션을 직접 연 것이고(같은 클래스에서 aop는 동작 안하므로), 벌크 용도로 EntityManager를 쓴 것입니다.
PersistenceContext 로 em 을 가져온 이유가 있나요? 아니면 선호하시는 방식이라 채택한 방법인가요?
그리고 질문 주신 사항에 대해서도 딱히 의미를 두고 차이를 만든 부분은 아니라, 크게 신경쓰실 필요는 없을 것 같습니다..!
어떠한 방향을 선호하는 것도 아니고, 그러한 세부적인 차이를 알 정도로 JPA를 공부하진 않았고 공부할 생각도 딱히 없습니다. (개인적으로 선호하는 방향은 JPA 자체를 아예 안쓰는 것이고, 실제로도 안쓰고 있습니다.)
저도 질문 주신 것 보고 무슨 차이가 있었나 궁금해서 지피티한테 물어봤지만,
이 답변을 그대로 전달드린다고 해서 딱히 의미가 있을 것 같지도 않고, 작성한 스크립트에서는 딱히 동작 상 차이가 있지도 않네요.
그냥 JPA 학습할 때 @PersistenceContext를 썼던 기억과 JPA 관련 애노테이션이라 쓴 것이고, 단순 데이터 초기화 스크립트 용도라 별다른 의미를 두거나 동작 상의 차이를 이해하고 있던 부분은 아닙니다.
또 개인적으로 추구하는 방향은, 굳이 몰라도 된다고 판단한 부분은 추상화된 영역까지 굳이 알려고 하진 않기도 합니다.
코드 의도를 파악하시는 것 너무 좋은 자세지만, 해당 부분은 저도 딱히 신경쓰고 만든 부분은 아니라 만족스러운 답변은 아닐듯하여 죄송스러운 마음이 있네요.. ㅎㅎㅎ






CountDownLatch 에 대해서 이론적으로는 알고 있었지만, 제공해주신 코드를 통해 이렇게도 사용 하는구나~ 를 좀 알게 되어 코드 전체를 조금 구석구석 확인했던 것 같습니다.
좋은 강의 감사드립니다~