[Spring] Spring MVC (2)

이연우·2025년 7월 22일

TIL

목록 보기
23/100

🔧 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 모두 우선순위대로 조회
역할동작
HandlerMappingBean 이름 기반으로 ExampleController 탐색
HandlerAdapterController 인터페이스를 지원하는 SimpleControllerHandlerAdapter 선택 및 실행
  • Spring Boot에서는 위 두 요소가 자동 등록됨,
    따라서 직접 구현할 필요 거의 없음

🔄 Spring Boot 기본 제공 목록

  • 📌 HandlerMapping 우선순위
    1. 🥇 RequestMappingHandlerMapping@RequestMapping 기반 컨트롤러 매핑
    2. BeanNameUrlHandlerMapping@Component("/경로") 기반 핸들러 매핑

  • 📌 HandlerAdapter 우선순위
    1. 🥇 RequestMappingHandlerAdapter@RequestMapping 사용 시
    2. HttpRequestHandlerAdapterHttpRequestHandler 인터페이스용
    3. SimpleControllerHandlerAdapterController 인터페이스용

  • 💡 @RequestMapping
    가장 높은 우선순위의 HandlerMappingRequestMappingHandlerMapping
    가장 높은 우선순위의 HandlerAdapterRequestMappingHandlerAdapter
    두 가지를 사용하며 현대에 사용하는 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 탐색
BeanNameUrlHandlerMappingExampleRequestHandler를 찾음

2. HandlerAdapter 선택
HttpRequestHandlerAdapter.supports()true 반환 → 사용 가능

3. 핸들러 실행
HttpRequestHandlerAdapter.handle()
내부적으로 ExampleRequestHandler.handleRequest() 실행

📌 DispatcherServlet은 핸들러를 직접 실행하지 않고 어댑터를 통해 위임 처리

0개의 댓글