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

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

스프링 핵심 원리 - 기본편

스코프와 Provider

request scope bean 생성시점

작성

·

451

1

안녕하세요!

https://www.inflearn.com/questions/501975 비슷한 내용이 있지만 이해가 되지않아서 질문드립니다.

앞서 request빈은 http요청이 오는시점에 생성되는것으로 알고있었는데요.

그래서 " 코드에 Provider를 사용하게되면 DI가 일어나는 시점에 일단 의존관계주입으로 주입되는 구현체는 DependencyObjectProvider객체이다. Provider를 사용하게되면 http요청이 오는 시점에 스프링컨테이너에 MyLogger빈을 등록하고나서 나중에 getObject()로 request빈을 가져오는것이다. "

이렇게 되는건줄 알았는데,

강의에서는 ObjectProvider.getObject()를 호출하는 시점까지 request scope bean의 생성을 지연한다고 설명해주셨는데 그럼 Provider를 사용하면, http요청이 오는시점에 request scope bean이 생성되는것이 아니라, ObjectProvider.getObject()를 호출하는 시점에request scope bean이 스프링컨테이너에 생성되는건가요??

답변 1

4

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

네, 맞습니다. ObjectProvider의 getObject() 호출 시점에 request scope bean이 존재하지 않으면 생성하게 됩니다.

감사합니다.

오리쉐리님의 프로필 이미지
오리쉐리
질문자

코드를 보면 http요청이 있고나서 getObject()를 호출하는데, getObject는 단순히 스프링컨테이너에서 빈을 찾아서 가져오는 역할인거로알고있었는데 http요청할때 이미 생성된거 아닌가요?? getObject할때 생성하는건지 이미 생성되어져있는거를 가져오는건지 재질문드립니다..

ObjectProvider.getObject() 최초 호출시 내부에서 RequestScopeBean이 존재하는지 찾게 됩니다.

해당 빈이 없다면 생성 후 생성된 빈을 반환합니다.

이 부분을 자세히 알고 싶으시다면 getObect()부터 디버깅해보시는 것을 추천드립니다.

오리쉐리님의 프로필 이미지
오리쉐리
질문자

*ObjectProvider.getObject() 최초 호출시내부에서 RequestScopeBean이 존재하는지 찾고, 존재하면 빈을 반환

*ObjectProvider.getObject() 최초 호출시내부에서 RequestScopeBean이 존재하는지 찾고, 존재하지않으면 생성후 생성된 빈을 반환

*강의대로 실행하게되면 getObject()할때는 이미 http요청에의해 빈이 생성되어 있는것이므로, 스프링컨테이너에 존재하는 빈을 가져오는것이다.

 

이렇게 이해하면 될까요..?

getObject()할 때 request scope bean이 생성됩니다.

ObjectProvider를 사용하는 관점에서 http요청에 의해 빈이 생성된다는 말은 ObjectProvider.getObject()할 때 request scope bean이 생성된다는 말과 동일하다고 보시면 될 것 같습니다.

오리쉐리님의 프로필 이미지
오리쉐리
질문자

그럼 앞서 프로토타입빈 강의에서는 ObjectProvider를 사용해서 getObject()할때 이미 생성되어진 프로토타입빈을 가져오는거였는데, request scope bean의 경우에는 http요청이 오더라도 ObjectProvider.getObject()를 호출하기전까지는 request scope bean이 생성되지않나요? http요청이 일어나는 시점과 getObject()를 호출하는 시점이 다른데 왜 동일한지 질문드립니다...

프로토타입 빈에 대한 ObjectProvider도 Request Scope 빈에 대해 말씀드린 것과 동일하게 동작합니다.

빈 메타데이터와 빈 메타데이터로부터 생성된 빈 인스턴스를 구분하여서 생각하시면 이해에 도움이 될 것 같습니다.

싱글톤 스코프 빈의 경우 빈 컨테이너가 빈 인스턴스를 생성하여 보관하고 있습니다.

프로토타입 스코프 빈의 경우 컨테이너가 별도의 빈 인스턴스를 생성하지 않고 있다가 필요할 때 (예: 프로토타입 빈 의존관계 주입, ObjectProvider.getObject() 등) 생성하여 반환합니다.

리퀘스트 스코프 빈의 경우 요청이 들어왔을 때(request scope가 active된 상태) 해당 빈을 생성할 수 있습니다. 그런데 리퀘스트 스코프 빈을 다른 방법(예: ObjectProvider, Proxy 등)을 사용하지 않고 애플리케이션 실행 단계에서 빈 인스턴스 간 의존관계 주입으로 인해 리퀘스트 스코프 빈을 생성하려 한다면 오류가 발생합니다. 왜냐하면 요청이 들어와서 request scope가 active된 상태가 아닌데 리퀘스트 스코프 빈을 생성하려고 했기 때문입니다. 따라서 리퀘스트 스코프 빈을 사용하여야 하는데 애플리케이션 실행시점에서 발생하는 오류를 방지하기 위해 직접적으로 리퀘스트 스코프 빈을 주입받지 않고 ObjectProvider나 Proxy와 같은 방법을 사용하는 것입니다.

 

이 부분에 대해 더욱 자세히 알고 싶으시다면 번거로우시더라도 직접 getObject()를 디버깅 해보시는 것을 추천드립니다.

오리쉐리님의 프로필 이미지
오리쉐리
질문자

친절한 답변 감사드립니다..

그럼 결국엔 http요청이 들어왔을때 request bean이 생성되는게 아니라, 생성할수있는 상태가 되는것이고, 이 상태일때 ObjectProvider.getObject()를 하게되면 request bean을 생성한후 반환하는건가요?

네, 맞습니다:)

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

질문하기