스프링/1. 스프링 핵심 원리

51강. request scope Provider 이용

sdafdq 2023. 7. 25. 23:11

간단. 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