본문 바로가기
오류 해결 내용

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 messag..

by 임동무 2023. 1. 19.

Spring Application 을 실행할 때,

Scope value 가 request 인 bean 을 그대로 의존관계를 형성하게 되면

Request 가 발생하지 않아서 bean 이 생성되지 않았지만, 스프링 컨테이너에서는 초기에 의존 관계를 전부 주입해주기 때문에

request bean 을 주입해주지 못해서 발생하는 오류이다.

 

해결방법에는

1. ObjectProvider<> 를 사용하는 방법

2. 프록시 객체를 사용하는 방법

이 있다.

 

 

 

1. ObjectProvider<> 를 사용하는 방법

해당 bean 의 의존성 주입을 ObjectProvider 를 이용해 주입하게 되면

호출될 때까지 의존성 주입을 미루고 호출이 되면 ObjectProvider.getObject() 를 통해

bean 을 생성할 수 있다.


 

2. 프록시 객체를 사용하는 방법

해당 bean 이 Class 일 경우 TARGET_CLASS,

interface 일 경우 ScopedProxyMode.INTERFACES 옵션을 추가해주면 된다.

 

프록시모드를 설정해주면 스프링 컨테이너에서 의존성 주입시에 가짜 객체가 등록되며

실제 로직이 필요할 떄, 가짜 객체인 프록시 객체가 진짜 객체의 메서드를 호출하는 방식으로 작동한다.

 

이 방법을 활용하면 기존 의존성 문제가 발생하던 부분의 코드를 건드리지 않고

해당 bean의 Scope 옵션만 추가해주면서 문제를 해결할 수 있다.

댓글