🔧 Controller Interface
Controller인터페이스를 직접 구현하면 핸들러(Controller)로 사용할 수 있음- 💡 Annotation 기반
@Controller와는 다른 별개의 동작 방식
🗒️ 예시 코드
package com.example.springbasicmvc.controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
// Spring Bean 이름을 URL로 설정
@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;
}
}
→ 📍 호출: http://localhost:8080/example-controller
🧱 Spring Boot의
Handler Mapping,Handler Adapter
HandlerMapping,HandlerAdapter모두 우선순위대로 조회
| 역할 | 동작 |
|---|---|
| HandlerMapping | Bean 이름 기반으로 ExampleController 탐색 |
| HandlerAdapter | Controller 인터페이스를 지원하는 SimpleControllerHandlerAdapter 선택 및 실행 |
🔄 Spring Boot 기본 제공 목록
📌 HandlerMapping 우선순위
1. 🥇 RequestMappingHandlerMapping → @RequestMapping 기반 컨트롤러 매핑
2. BeanNameUrlHandlerMapping → @Component("/경로") 기반 핸들러 매핑
📌 HandlerAdapter 우선순위
1. 🥇 RequestMappingHandlerAdapter → @RequestMapping 사용 시
2. HttpRequestHandlerAdapter → HttpRequestHandler 인터페이스용
3. SimpleControllerHandlerAdapter → Controller 인터페이스용
💡 @RequestMapping은
가장 높은 우선순위의 HandlerMapping인 RequestMappingHandlerMapping 과
가장 높은 우선순위의 HandlerAdapter인 RequestMappingHandlerAdapter
두 가지를 사용하며 현대에 사용하는 Annotation 기반의 컨트롤러를 지원함
🌐 HttpRequestHandler로 알아보는 Spring MVC 동작 순서
Servlet과 유사한 형태의 핸들러
🗒️ 예시 코드
@Component("/request-handler")
public class ExampleRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest req, HttpServletResponse res) {
System.out.println("request-handler Controller 호출");
}
}
→ 📍 호출: http://localhost:8080/request-handler
⚙️ 실행 순서 요약
1. HandlerMapping 탐색
BeanNameUrlHandlerMapping이 ExampleRequestHandler를 찾음
2. HandlerAdapter 선택
HttpRequestHandlerAdapter.supports()가 true 반환 → 사용 가능
3. 핸들러 실행
HttpRequestHandlerAdapter.handle() →
내부적으로 ExampleRequestHandler.handleRequest() 실행
📌 DispatcherServlet은 핸들러를 직접 실행하지 않고 어댑터를 통해 위임 처리