핸들러 매핑과 핸들러 어댑터가 어떤 것들이 어떻게 사용되는지 알아보았다.

지금은 전혀 사용하지 않지만, 과거에 주로 사용했던 스프링이 제공하는 간단한 컨트롤러로 핸들러 매핑과 어댑터를 이해해보았다.

 

Controller 인터페이스

과거 버전 스프링 컨트롤러

public interface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse
response) throws Exception;
}

스프링도 처음에는 이런 딱딱한 형식의 컨트롤러를 제공했다.

 

package hello.servlet.web.springmvc.old;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component("/springmvc/old-controller")
public class OldController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("OldController.handleRequest");
        return null;
    }
}

구형 버전의 컨트롤러를 구현해보았다.

@Component : 이 컨트롤러는 /springmvc/old-controller라는 이름의 스프링 빈으로 등록되었다.

빈의 이름으로 URL을 매핑할 것이라는 뜻이다.

 

이 컨트롤러는 어떻게 호출될까?

 

이 컨트롤러가 호출되려면 2가지가 필요하다.

- HandlerMapping

   핸들러 매핑에서 이 컨트롤러를 찾을 수 있어야한다.

   스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요하다.

- HandlerAdapter

   핸들러 매핑을 통해서 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요하다.

   Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야 한다.

 

1. 핸들러 매핑으로 핸들러 조회

  HandlerMapping을 순서대로 실행해서, 핸들러를 찾는다.

  이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는 

  BeanNameUrlHandlerMapping이 실행되고 OldController를 반환한다.

 

2. 핸들러 어댑터 조회

  HandlerAdapter의 supports() 를 순서대로 호출한다.

  SimpleControllerHandlerAdapter가 Controller 인터페이스를 지원하므로 대상이 된다.

 

3. 핸들러 어댑터 실행

  디스패처 서블릿이 조회한 SimpleControllerHandlerAdapter를 실행하면서 핸들러 정보도 함꼐 넘겨준다.

  SimpleControllerHandlerAdapter는 핸들러인 OldController를 내부에서 실행하고, 그 결과를 반환한다.

 

package hello.servlet.web.springmvc.old;

import org.springframework.stereotype.Component;
import org.springframework.web.HttpRequestHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component("/springmvc/request-handler")
public class MyHttpRequestHandler implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("MyHttpRequestHandler.handleRequest");
    }
}

1. 핸들러 매핑으로 핸들러 조회

  이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는

  BeanNameUrlHandlerMapping이 실행되고 핸들러인 MyHttpRequestHandler를 반환한다.

 

2. 핸들러 어댑터 조회

  HandlerAdapter의 supports()를 순서대로 호출한다.

  HttpRequestHandlerAdapter가 HttpRequestHandler 인터페이스를 지원하므로 대상이 된다.

 

3. 핸들러 어댑터 실행

  디스패처 서블릿이 조회한 HttpRequestHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨준다.

  HttpRequestHandlerAdapter는 핸들러인 MyHttpRequestHandler를 내부에서 실행하고, 그 결과를 반환한다.

 

'웹프로그래밍 > 스프링 MVC' 카테고리의 다른 글

34. 스프링 MVC - 시작하기  (0) 2022.04.01
33. 뷰 리졸버  (0) 2022.03.31
31. 스프링 MVC 전체 구조  (0) 2022.03.31
30. 유연한 컨트롤러2 - V5  (0) 2022.03.30
29. 유연한 컨트롤러1 - V5  (0) 2022.03.30

+ Recent posts