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

newh08님의 프로필 이미지
newh08

작성한 질문수

스프링 핵심 원리 - 기본편

스코프와 프록시

프록시 객체 조회하기

작성

·

590

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 네
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네

[질문 내용]
request 스콥인 객체를 DI 할 때, 프록시를 만들어 가짜 객체를 주입하는것으로 이해했습니다.

예제에서 LogDemoController에서 위 방법을 사용했으므로, LogDemoController 빈을 컨테이너에 저장할 때 DI 가 진행되어 필드값인 myLogger 에 myLogger의 프록시 객체가 저장되었다 생각했습니다.

이후 @PostConstruct 를 통해 해당 필드값을 조회하면(롬복을 적용해 toString 을 사용했습니다) 오류가 발생합니다. 오류메세지에서 myLogger 가 request 스콥이고 아직 request가 없다고 했는데, myLogger에는 프록시 객체가 이미 저장되어있어서 조회가 될 거라 생각했는데 왜 조회가 안될까요?

@Controller
@RequiredArgsConstructor
@ToString
public class LogDemoController {

    private final LogDemoService logDemoService;
    private final MyLogger myLogger;

    @PostConstruct
    public void init() {
        System.out.println(this.toString());
    }
}

답변 1

0

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

오류가 발생하여 질문하실 경우, 발생한 오류 메시지 전문을 첨부해 주시면 답변에 큰 도움이 됩니다:)

감사합니다.

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

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'logDemoController': Invocation of init method failed; nested exception is org.springframework.beans.factory.support.ScopeNotActiveException: Error creating bean with name 'scopedTarget.myLogger': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

 

라는 오류 문구가 발생했습니다!

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

init() 함수를 주석처리하면 따로 오류가 발생하진 않습니다..!

이 부분은 Lombok의 @ToString 동작으로 인해 실제 객체가 호출되어 발생하는 문제입니다.

현재 컨트롤러에서 @ToString에 의해 toString() 호출시, myLogger.toString()도 호출하게 됩니다.

아직 요청이 들어오지 않았는데, @PostConstruct에 의해 객체가 생성된 뒤 init 메서드가 실행되며 myLogger.toString()을 호출하게 되니 request 스코프가 활성화 되지 않았다고 오류를 발생시키는 것입니다.

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

아 혹시 MyLogger 프록시를 사용하면 LogDemoController 의 myLogger 로 MyLogger 프록시가 들어가는게 아닌가요? @RequiredArgConstructor 때문에 빈 등록할 때 의존성 주입이 일어나서 프록시가 들어갈꺼라 생각했습니다! 그래서 myLogger.toString() 을 호출하면 프록시가 출력될거라 생각했는데 오류가 발생했네요..

newh08님의 프로필 이미지
newh08

작성한 질문수

질문하기