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

스물다섯컷의흑백필름님의 프로필 이미지
스물다섯컷의흑백필름

작성한 질문수

스프링 핵심 원리 - 기본편

스코프와 Provider

request scope 관련 질문

작성

·

394

·

수정됨

0

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================

[질문 내용]
request scope 관련해서 실행 과정에서 궁금한게 생겨서 질문드립니다. 제가 이해한 과정이 맞을까요?


1. 먼저 CoreApplication을 실행시키면 스프링 컨테이너가 생성이 되고, MyLogger라는 빈을 스프링 컨테이너에 등록시킨다

  1. MyLogger라는 빈은 scope이 request 이기때문에


    http 요청이 오기전까지, 빈 인스턴스를 생성하지 않아서 @PostConstruct가 붙은 초기화 메서드 init()이 실행되지 않는다

  2. 따라서 uuid를 생성해서 저장하지 못 하기 때문에 "Scope 'request' is not active ... " 와 같은 오류가 발생한다

    위 과정이 맞다면, 고객의 요청이 오기전까지 Mylogger 빈 인스턴스가 생성되지 않은 상태일텐데 provider가 어떻게 빈을 찾아서 가져오고 @PostContsruct가 실행되는지 궁금합니다. 또한 myLogger.setRequestURL() 메서드가 어느 시점에 실행되는지 궁금합니다.. (빈 생성 전인지 후 인지)

    그리고 "빈 등록" 과 "빈 생성"은 다른 개념인건가요? 조금 혼동되네요

 

 

답변 2

1

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

Provider는 컨테이너에 MyLogger 빈이 있는지 묻습니다. 없으면 컨테이너는 빈을 생성한 뒤 Provider에게 전달하게 되고, getObject의 반환 값으로 MyLogger 빈이 반환될 것 입니다.

빈을 생성한 뒤, PostConstruct 과정이 수행됩니다. 본 강의 빈 생명주기 콜백 섹션 내 PostConstruct와 관련된 편을 참고해 주세요.

스프링 빈은 빈 메타데이터(빈을 생성하기 위해 필요한 정보, 빈과 관련된 정보 등)로 불리는 BeanDefinition을 통해 생성되어 컨테이너에 등록됩니다.

주로, 빈 메타데이터로 존재할 때(빈이 생성&등록 되지 않음)와 빈 메타데이터에서 생성&등록되는 과정을 혼동하시는 것 같습니다.

감사합니다🙂

답변 감사합니다.
그러면 provider를 안쓰는 버전에서 오류가 발생하는 이유는,
스프링 컨테이너가 뜨고 의존관계를 주입할려는 과정에서 MyLogger라는 빈은 사용자의 request가 있어야만 생성되는 빈인데, 애플리케이션을 실행하는 시점에서는 사용자의 요청이 없기 때문에 MyLogger라는 request scope 빈이 not active되어서 오류가 발생하는 것이고

provider를 쓸때는 MyLogger라는 빈을 찾는 ObjectProvider라는 빈을 우선 의존관계를 주입 받은 다음("MyLogger"가 아닌 , "MyLogger를 찾는 provider"를 의존관계 주입 받는 것이 맞는지?), 사용자의 request가 있고나서 getObject()하는 시점에 MyLogger라는 빈을 생성해서 리턴해주는 것으로 이해하면 될까요?

네, 맞습니다:)

0

안녕하세요, 인프런 AI 인턴입니다.

request scope에 대한 이해와 실행 과정에 대해 궁금증을 가지고 계신 이민혁님, 관련 내용을 찾아보니 이주의 내용이 도움이 될 것 같습니다.

위 링크에서 강사님의 답변을 확인하시면 MyLogger의 request scope 빈이 생성되는 시점과 provider를 통한 동작, 그리고 setRequestURL() 메서드의 실행 시점에 대한 이해를 도울 것입니다.

감사합니다.

스물다섯컷의흑백필름님의 프로필 이미지
스물다섯컷의흑백필름

작성한 질문수

질문하기