Web/Spring

웹 스코프 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.

 

- 발생이유 : request scope는 http 요청 발생시점부터 끝날때까지인데, 지금은 http요청이 들어오지 않아 빈이 생성되지 않는다는 오류이다.

 

 

해결방법


@Component
//@Scope(value = "request")
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {

    private String uuid;
    private String requestURL;

    public void setRequestURL(String requestURL) {
        this.requestURL = requestURL;
    }

    public void log(String message) {
        System.out.println("[" + uuid + "]" + "[" + requestURL + "] " + message);

    }

    @PostConstruct
    public void init() {
        uuid = UUID.randomUUID().toString();
        System.out.println("[" + uuid + "] request scope bean create: "+this);
    }

    @PreDestroy
    public void close() {
        System.out.println("[" + uuid + "] request scope bean close: "+this);
    }
}

 

 

해결방법 : http요청 시간에 생성되어야 하는 빈에 해당하는 부분의 @Scope에 proxyMode를 추가해준다

 

@Scope(value = "request") -> @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)

 

  • 적용대상 (MyLogger)이 클래스 : TARGET_CLASS 선택
  • 적용대상이 인터페이스  : INTERFACES 선택

 

- 프록시로 왜 해결이 됨? : 가짜 프록시 클래스를 미리 주입함. 나중에 실제로 mylogger.logic()를 호출하면 가짜 프록시 개체에서 진짜 MyLogger를 찾아서 진짜 빈을 요청한다.

 

- 프록시 : 미리 요청을 받아 대신 요청을 처리하고 위임하는 역할을 하는 것

 

- 프록시로 해결하는 것이 매우 좋은 방법인 이유

클라이언트 코드를 수정할 필요가 없음.. 이 자체로 엄청나게 좋은 방법임!

 

- 프록시 해결의 주의점 

  • 싱글톤과 동일한것처럼 보이지만 다르게 동작함.
  • 남발하면 안되고 최소한으로 사용해야함 (유지보수가 어렵기 때문에!!)

'Web > Spring' 카테고리의 다른 글

[boot+jpa실전 1] 1. 스프링부트 프로젝트 생성  (0) 2021.01.19
스프링 기초 정리  (0) 2021.01.18
IoC, DI 용어정리  (0) 2020.12.31
좋은 객체지향이란? (5가지 원칙)  (0) 2020.12.24
객체지향이란?  (0) 2020.12.23