간단. Provider를 이용해서 request 순간에 빈으로부터 찾아오게끔 지연시키면 됨.
@Controller
@RequiredArgsConstructor
public class LogDemoController {
private final LogDemoService logDemoService;
private final ObjectProvider<MyLogger> myLoggerProvider;
@RequestMapping("log-demo")
@ResponseBody
public String logDemo(HttpServletRequest request){
String requstURL = request.getRequestURI();
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.setRequestURL(requstURL);
myLogger.log("controller test");
logDemoService.logic("testId");
return "OK";
}
}
request scope와 request를 연결시키기 위해서는, HttpServletRequest request를 인자로 받아야만 한다.
컨트롤러에서 HttpServletRequest request를 매개변수로 받으면 tomcat이 HttpServletRequest를 생성하고, 이걸 컨테이너 가 메서드에 주입시켜 준다.
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final ObjectProvider<MyLogger> myLoggerProvider;
public void logic(String id){
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.log("service id = " + id);
}
}
일단 기본적인 웹 요청에 따른 시나리오를 보자면,
http에서 요청이 들어오면 spring은 서블릿 컨테이너(tomcat)에서 먼저 수신하고 그 다음 spring에서 만든 DispatcherServlet 에 전달, 받은 요청을 컨트롤러에서 탐색한다. DispatcherServlet 는 전면 컨트롤러 역할을 한다. 위 경우 HttpServletRequest 가 인자로 있으므로 tomcat이 먼저 HttpServletRequest 객체를 생성한 다음,스프링 컨테이너가 logDemo 메서드에 종속성 주입시켜 줌.(따로 HttpServletRequest 가 컨테이너에 등록되어지는건 아님) 그 다음 요청 처리 중 request scope가 있으므로 이 때 이 빈을 생성하고 HttpServletRequest 개체와 연결함.
이 HttpServletRequest 로 각 요청을 구분함. http 수신 받을 때 마다 HttpServletRequest 를 생성해서 이걸로 구분하는거.
요청은 HttpServletRequest 말고도 종류 여러가지 있음.
HttpServletRequest 를 인자로 받은 메서드를 쭈-욱 이어가다가 끝나게 되면 그게 request 끝난거임.
'스프링 > 1. 스프링 핵심 원리' 카테고리의 다른 글
52강. 프록시 (0) | 2023.07.25 |
---|---|
50강. request 스코프 (0) | 2023.07.25 |
49강. 웹 스코프 (0) | 2023.07.24 |
48강. Provider (0) | 2023.07.24 |
47강. 프로토타입빈을 싱글톤 빈과 사용할 때 문제 (0) | 2023.07.24 |