• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

엔티티매니저의 대해 질문이 있습니다!

23.07.25 22:00 작성 조회수 254

1

EntityManager는 빈 스코프가 프록시로 설정된다고 알고있습니다. 하지만 결국은 원본 엔티티매니저를 사용하는것이라고 이해했습니다. 그러면 요청이 들어오면 엔티티매니저를 사용하는데 엔티티매니저 내에 영속성 컨텍스트가 있고 싱글톤으로 유지된다면 영속성컨텍스트가 다른 요청이랑 공유되는게 아닌가요?

싱글톤으로 등록되어 있는데 영속성컨텍스트가 공유되지 않는 이유가 궁금합니다. 엔티티매니저가 빈인데 어떻게 요청마다 생성되는것인지 궁금합니다.

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.27

안녕하세요, 인프런 AI 인턴이에요. EntityManager와 영속성 컨텍스트에 대한 질문이시군요.

EntityManager는 일종의 영속성 컨텍스트를 관리하는 역할을 하며, 이를 통해 데이터베이스와의 상호작용을 담당합니다. 영속성 컨텍스트는 엔티티를 관리하고 데이터베이스와의 변화를 추적합니다. 따라서 EntityManager는 엔티티매니저 팩토리에서 생성되며, 요청이 들어올 때마다 새로운 EntityManager가 생성됩니다.

EntityManager는 보통 스프링 프레임워크에서는 빈 스코프가 프록시로 설정되지 않습니다. 대신에 스프링에서는 EntityManager를 요청이 들어올 때마다 생성해주는 프록시 개념인 EntityManager Proxy를 사용합니다. 이 Proxy는 실제 EntityManager를 생성하고, 요청이 끝난 후에 자동으로 종료시키는 역할을 합니다.

따라서 각각의 요청은 독립된 EntityManager를 사용하게 되며, 그에 따라 각각의 영속성 컨텍스트도 독립적으로 관리되게 됩니다. 이를 통해 각각의 요청과 엔티티의 생명주기를 독립적으로 관리할 수 있습니다.

싱글톤으로 등록된 EntityManager가 영속성 컨텍스트가 공유되지 않는 이유는 스프링 프레임워크의 트랜잭션 매니저와의 연동이 해당 EntityManager의 영속성 컨텍스트를 적절히 관리하기 때문입니다. 트랜잭션의 시작과 종료에 따라 EntityManager의 영속성 컨텍스트가 생성과 소멸을 반복하게 되며, 이를 통해 각각의 요청마다 독립된 영속성 컨텍스트를 유지할 수 있게 됩니다.

요청마다 EntityManager가 생성되는 이유는, 스프링 프레임워크가 해당 EntityManager를 요청 단위로 관리하기 위해 새로운 EntityManager를 생성하는 것입니다. 이를 통해 엔티티매니저의 생명주기와 요청의 생명주기를 동일하게 관리할 수 있고, 요청이 처리되는 동안에만 영속성 컨텍스트가 유지되도록 구현됩니다.

더 자세한 내용은 스프링 프레임워크의 트랜잭션 매니저와 영속성 컨텍스트의 동작 원리를 참고하시면 좋을 것 같아요. 추가적인 질문이 있으면 언제든지 물어보세요! 즐거운 개발하세요! :)