- 에러내용 :
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 |