첫번째 해결방법 Provider
@Controller
@RequiredArgsConstructor
public class LogDemoController {
private final LogDemoService logDemoService;
private final ObjectProvider<MyLogger> myLoggerProvider;
@RequestMapping("log-demo")
@ResponseBody
public String logDemo(HttpServletRequest request){
MyLogger myLogger = myLoggerProvider.getObject();
String requestURL = request.getRequestURI().toString();
myLogger.setRequestURL(requestURL);
myLogger.log("controller test");
logDemoService.logic("testID");
return "OK";
}
}
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final ObjectProvider<MyLogger> myLoggeProvider;
public void logic(String id) {
MyLogger myLogger = myLoggeProvider.getObject();
myLogger.log("service id =" + id);
}
}
main()
메서드로 스프링을 실행하고, 웹 브라우저에 http://localhost:8080/log-demo
를 입력하자
잘 작동하는것을 확인할 수 있다.
ObjectProvider
덕분에 ObjectProvider.gerObject()
를 호출하는 시점까지 request scope 빈의 생성을 지연 할 수 있다.
ObjectProvider.getObject()
를 호출하는 시점에는 HTTP 요청이 진행중이므로 request scope 빈의 생성이 정상 처리된다.
ObjectProvider.getObject()
를 LogDemoController
, LogDemoService
에서 각각 한번씩 따로 호출해도 같은 HTTP 요청이면 같은 스프링 빈이 반환된다! -> 직접 구분하려면 어려움이 따른다!!
소중한 정보 감사드립니다!