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

shef님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

영속성 컨텍스트 2

엔티티매니저와 영속성컨텍스트에 관해서

22.01.05 18:56 작성

·

807

3

여러 질문 답변을 찾아보고 내용을 종합해서 이해해본 결과 

엔티티매니저와 영속성컨텍스트에 관해서 제가 현재 이해하고 있는게 맞는지 확인 부탁드립니다 ..

 

엔티티 매니저

1. 언제 생성되나

엔티티 매니저의 빈 스코프는 request로 설정되어 있다.

스프링이 처음 의존성을 주입하는 단계에서 엔티티 매니저를 의존하는 다른 빈들은 실제 엔티티 매니저가 아닌 가짜 엔티티 매니저(프록시)를 주입 받는다.

 고객의 요청이 오고 엔티티 매니저가 관련 로직을 실행해야 하는 시점에 가짜 엔티티 매니저는 해당 트랜잭션과 관련된 실제 엔티티 매니저를 호출해준다. 

여러 빈들이 엔티티매니저에 의존하고 있을 때 같은 고객의 요청 안에서는 모두 같은 엔티티매니저를 반환받는다.

2. 몇 개가 생성되나

고객이 요청할 때마다 생성되고 요청이 끝나면 사라진다.
고객의 요청이 동시에 100명이 오면 100개 10000명이 오면 10000개가 생성된다.

3. 영속성 컨텍스트와의 관계

엔티티 매니저가 트랜잭션을 실행하면 영속성 컨텍스트가 생성되고 트랜잭션이 종료되면 영속성 컨텍스트가 사라진다.

4. 궁금한 점 

같은 트랜잭션이면 서비스, 리포지토리에서 사용하는 EntityManager가 모두 같은 영속성 컨텍스트에 접근하게 되기 때문에 스프링 환경에서는 엔티티매니저와 영속성 컨텍스트의 관계가 N:1이 될 수 있다고 설명해주셨는데요.
답변 링크

같은 트랜잭션이면 같은 고객의 요청 안에서 이루어지고 있고 그렇다면 서비스, 리포지토리에서 사용하는 엔티티매니저는 모두 동일한 엔티티매니저이기 때문에 1:1 관계가 아닌가요?

 

답변 1

2

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

2022. 01. 06. 23:15

안녕하세요. 손튤립님

1. 언제 생성되나

엔티티 매니저의 빈 스코프는 request로 설정되어 있다.

-> 정확한 정답은 X입니다. 트랜잭션 범위에 종속적입니다. 하나의 요청이어도 트랜잭션이 시작하고, 끝나고 시작하고 끝나고 2번 실행되면 엔티티 매니저의 영속성 컨텍스트도 2번 생성되고 종료됩니다.

그래서 3번에 적어주신 답이 맞습니다.

 

4번은 사실 생각하신 내용도 맞습니다.

이렇게 생각히면 됩니다. 서비스에서 사용하는 엔티티 매니저, 리포지토리에서 사용하는 엔티티 메니저는 눈으로 보기에는 2개(N개) 입니다. 그런데 실제로는 1개의 영속성 컨텍스트를 바라보고 있습니다. 따라서 N:1입니다.

감사합니다.

 

 

shef님의 프로필 이미지
shef
질문자

2022. 01. 07. 11:07

감사합니다 ^^

shef님의 프로필 이미지

작성한 질문수

질문하기