☞ 인터페이스를 직접 구현하면 Spring MVC의 기능을 확장할 수 있음
☞ Spring MVC는 웹 애플리케이션 개발의 효율성과 확장성을 극대화함
Controller Interface를 구현하면 개발자가 원하는 Controller(Handler)를 직접 사용할 수 있음@Controller와 역할이 유사하지만 별개 개념@Component("/example-controller")
public class ExampleController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("example-controller가 호출되었습니다.");
return null;
}
}
@Component("/example-controller") → Spring Bean으로 등록하여 URL 매핑http://localhost:8080/example-controller 요청 시 호출됨☞ Spring MVC 구조에서 배운 Handler Mapping, Handler Adapter가 컨트롤러 실행을 지원
HandlerMapping과 HandlerAdapter를 등록하여 사용 가능@RequestMapping Annotation 기반@RequestMapping 지원HttpRequestHandler 처리Controller Interface 처리☞ 현대 Spring Boot에서는 @RequestMapping이 가장 높은 우선순위로 사용됨
@Component("/request-handler")
public class ExampleRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("request-handler Controller 호출");
}
}
HttpRequestHandler를 구현하여 직접 요청 처리 가능BeanNameUrlHandlerMapping이 ExampleRequestHandler 조회HttpRequestHandlerAdapter가 HttpRequestHandler를 지원HttpRequestHandlerAdapter.handle() 내부에서 ExampleRequestHandler 실행☞ DispatcherServlet이 Handler Adapter를 통해 적절한 핸들러를 실행하는 방식
☞ Spring Boot를 사용하면 대부분 자동 설정되며, 직접 구현할 필요 없음
ModelAndView 객체를 받아 알맞은 View를 찾도록 도와주는 역할@Component("/view-controller")
public class ViewController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("view-controller가 호출되었습니다.");
return new ModelAndView("test"); // 논리적 View Name
}
}
return new ModelAndView("test") → "test"는 논리적인 View 이름이며, ViewResolver가 물리적인 View로 변환해야 함application.properties 설정을 기반으로 InternalResourceViewResolver가 생성됨spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
/WEB-INF/views/test.jsp로 변환하여 View를 찾음@Component("/error-controller")
public class WhitelabelErrorController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("error-controller가 호출되었습니다.");
return new ModelAndView("sparta"); // 존재하지 않는 View
}
}
@Bean
InternalResourceViewResolver internalResourceViewResolver() {
return new InternalResourceViewResolver("/WEB-INF/views", ".jsp");
}
"test" 논리 View Name 획득"test" View를 찾기 위해 ViewResolver 조회BeanNameViewResolver는 View를 찾지 못함InternalResourceViewResolver가 View를 찾음RequestDispatcher.forward()를 통해 View를 렌더링protected void renderMergedOutputModel(...) {
// Model 데이터를 Request로 변환
exposeModelAsRequestAttributes(model, request);
// RequestDispatcher를 통해 JSP로 forward
request.getRequestDispatcher(url).forward(request, response);
}
return "viewName"; 만으로 View가 렌더링됨☞ Spring Boot의 ViewResolver를 활용하면 View 처리를 간편하게 할 수 있음