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

YH님의 프로필 이미지
YH

작성한 질문수

스프링 핵심 원리 - 기본편

스코프와 Provider

ObjectProvider의 getObject()가 request빈을 찾는 방법

작성

·

202

1

안녕하세요! 강의를보다 궁금한점이 생겨서 질문드립니다!

https://www.inflearn.com/questions/368066

이 질문글을 읽어보았는데요,

ObjectProvider를 통해 Controller 와 Service 어디에서 빈을 생성해도 같은 요청에 대해서 같은 빈을 찾아 반환해 준다는 점이 매우 신기했습니다.

그런데 동시에 ObjectProvider는 어떻게 Controller 에서 받은 요청으로 인해 생긴 MyLogger 빈을 Service 에서 같은 요청의 빈을 찾을 수 있는것인가! 에 대한 궁금증이 생겼습니다.

만약 100개의 요청이 동시에 들어왔다 치면, LogDemoService의 logic 메소드가 Controller에서 어떠한 파라미터도 받지않고 나머지 99개의 request 빈들을 무시하고 자신의 빈을 찾을 수 있는지 말입니다. 

 

그래서 질문의 결론은 제목처럼,

ObjectProvider는  수많은 Request 빈으로 부터 어떻게 하나의  요청에 대한 빈을 찾을 수 있는가 입니다.

질문 읽어주셔서 감사합니다!!!

 

 

답변 1

2

안녕하세요. 이윤환님, 공식 서포터즈 David입니다.

.
처음 요청이 들어왔을 때, Request 스코프를 가진 빈(이하 R빈)을 찾으면 당연히 생성된 R빈이 없기 때문에 R빈을 생성합니다. 이렇게 생성된 R빈은 요청의 Attribute 저장공간에 이름을 key로하여 저장됩니다.

이후 해당 요청이 종료(응답될 때까지)되기 전까지 한 번 더 R빈을 호출하면 호출되는 빈의 스코프를 확인한 후 만약 Request 스코프면 요청의 Attribute 저장공간을 살펴보고 빈의 이름으로 저장된 빈이 있는지 확인합니다. 그리고 빈이 존재하면 그걸 반환합니다.

즉, 각 요청마다 Request 스코프로 생성된 빈을 들고 다닌다고 보시면 됩니다. 요청이 종료됨과 함께 사라지고요.

따라서 수많은 요청들 속에서 특정 빈을 찾아내는 것이 아니라, 현재 요청이 갖고 있는 attributes 속에서 특정 빈의 이름으로 빈을 가지고 있는지 확인하게 됩니다.

 

아래는 현재 요청의 Attributes 객체를 가져와서 저장된 Request 스코프를 가지는 빈이 있는지 찾는 로직입니다.

.
감사합니다.

YH님의 프로필 이미지
YH

작성한 질문수

질문하기