• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

EntityMager를 어떤식으로 넣어주는건가요?

20.11.02 19:20 작성 조회수 79

0

안녕하세요!

여기서 EntityMager를 @Autowired할때 스프링 컨텍스트에서 매번 EntityMager를 생성하고 빈으로 등록해서 자동으로 주입시켜주는건가요?? (EntityMager는 공유되면 안되는 객체이므로 매번 생성하는걸로 이해했습니다.)

추가적으로 @DataJpaTest를 통해 테스트를 할때 @Entity 어노테이션과 @Repository 어노테이션이 붙은 클래스만 빈으로 등록되는걸로 알고 있습니다. 그러면 이때 EntityMager는 빈으로 등록되지도 않는데 어떻게 주입되는걸까요?

답변 1

답변을 작성해보세요.

0

안녕하세요. m s님 좋은 질문입니다.

먼저 EntityManager를 공유하면 큰 문제가 발생하겠지요. 그래서 여기에 주입된 EntityManager는 사실 진짜 EntityManager가 아닙니다. 여기에 주입된 EntityManager는 트랜잭션에 연결된 진짜 EnttiyManager와 연결시켜주는 가짜 프록시 객체라고 이해하시면 됩니다. (겉모양은 같지만요)

스프링이 이런 메커니즘을 제공하기 때문에 개발자는 공유에 대한 걱정없이 현재 나의 트랜잭션에 연결된 영속성 컨텍스트에 안전하게 접근할 수 있는 것이지요. 그래서 한 트랜잭션 안에서 여러 EntityManager에 접근해도 모두 같은 EntityManager(영속성 컨텍스트)에 안전하게 접근할 수 있습니다. 개발자가 직접 이런 부분까지 신경을 써야 한다면 버그 투성이겠지요?

관련해서 더 자세한 내용은 JPA책 13.1 트랜잭션 범위의 영속성 컨텍스트, 15.2 엔티티 비교를 참고하시면 도움이 되실꺼에요.

추가로 질문 주신 부분은 @DataJpaTest가 EntityManager도 주입 가능하게 지원해줍니다.

감사합니다.