작성
·
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
이 부분은 Lombok의 @ToString 동작으로 인해 실제 객체가 호출되어 발생하는 문제입니다.
현재 컨트롤러에서 @ToString에 의해 toString() 호출시, myLogger.toString()도 호출하게 됩니다.
아직 요청이 들어오지 않았는데, @PostConstruct에 의해 객체가 생성된 뒤 init 메서드가 실행되며 myLogger.toString()을 호출하게 되니 request 스코프가 활성화 되지 않았다고 오류를 발생시키는 것입니다.
아 혹시 MyLogger 프록시를 사용하면 LogDemoController 의 myLogger 로 MyLogger 프록시가 들어가는게 아닌가요? @RequiredArgConstructor 때문에 빈 등록할 때 의존성 주입이 일어나서 프록시가 들어갈꺼라 생각했습니다! 그래서 myLogger.toString() 을 호출하면 프록시가 출력될거라 생각했는데 오류가 발생했네요..
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.
라는 오류 문구가 발생했습니다!