• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

프록시 객체 조회하기

23.05.13 10:09 작성 조회수 485

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

David님의 프로필

David

2023.05.13

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

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

감사합니다.

newh08님의 프로필

newh08

질문자

2023.05.13

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

질문자

2023.05.13

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

David님의 프로필

David

2023.05.13

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

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

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

newh08님의 프로필

newh08

질문자

2023.05.13

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