컨트롤러는 MVC중 C에 해당하며 사용자의 입력을 받은 뒤 뷰에 보여주기 적당한 모델로 바꿔준다.

Spring은 다양한 컨트롤러들을 제공하는데 크게 폼 컨트롤러, 커맨드 기반 컨트롤러, 마법사 스타일의 컨트롤러로 나뉩니다.

Spring 컨트롤러의 가장 상위에 위치한 Controller 인터페이스는 다음과 같습니다.

public interface Controller {

    /**
     * Process the request and return a ModelAndView object which the DispatcherServlet
     * will render.
     */
    ModelAndView handleRequest(
        HttpServletRequest request,
        HttpServletResponse response) throws Exception;

}

모든 Controller 구현체들은 재사용 가능하며, Thread-safe 해야합니다.

Workflow
사용자 삽입 이미지Request 요청이 들어오면 DisptacherServlet에서 Locale, Theme 등등을 확인하고 HandlerMapping을 사용하여 요청을 담당할 컨트롤러를 물색합니다.

요청을 처리할 컨트롤러를 찾으면 그 컨트롤러의 handleRequest 메소드에게 HttpServletRequest와 HttpServletReponse 객체를 인자로 넘겨주며 호출합니다.

해당 컨트롤러는 요청을 처리하고 넘겨줄 ModelAndView 객체가 있다면 DispatcherServlet에게 해당 객체를 넘겨줍니다.

Notes on design and testing

Servlet API에 종속되어 기존 Servlet 의 기능을 모두 사용할 수 있습니다.

Servlet API에 의해 제공되는 HttpServletRequest 와 HttpServletResponse의 Mock 객체를 사용하여 handleRequest 메소드를 테스트 할 수 있습니다.