T_era

Spring MVC Controller 구현 및 동작 방식 본문

Programing/Spring

Spring MVC Controller 구현 및 동작 방식

블스뜸 2025. 5. 5. 16:38

클라이언트의 요청을 받아 적절한 서비스에 처리를 위임하고, 비즈니스 로직의 결과를 모델에 담아 뷰를 선택하여 클라이언트에게 응답을 반환하는 중간 다리 역할

Controller Interface

org.springframework.web.servlet.mvc.Controller 인터페이스를 구현함으로써 개발자는 원하는 형태의 Controller (Handler)를 정의하여 사용할 수 있다.

Java
 
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;
    }
}

@Component: 해당 클래스를 Spring Bean으로 등록하는 역할을 수행한다. Spring Bean은 애플리케이션의 구성 요소를 정의하는 객체로, Servlet이 Servlet Container에 등록되는 것과 유사하다.

Spring Boot의 Handler Mapping 및 Handler Adapter

Spring Boot 환경에서는 개발에 필요한 HandlerMapping과 HandlerAdapter들이 자동으로 등록된다.

Handler Mapping

  • BeanNameUrlHandlerMapping: Spring Bean의 이름으로 Handler를 매핑한다. 위 예시 코드의 ExampleController를 찾기 위해 사용된다.

Handler Adapter

  • SimpleControllerHandlerAdapter: Controller 인터페이스를 구현한 Handler를 실행할 수 있는 어댑터이다.

HandlerMapping 우선순위

  1. RequestMappingHandlerMapping: @RequestMapping 어노테이션 기반 Controller에 사용되며 우선순위가 가장 높다.
  2. BeanNameUrlHandlerMapping: Spring Bean의 이름으로 Handler를 매핑한다.
  3. 기타 HandlerMapping 구현체

HandlerAdapter 우선순위

  1. RequestMappingHandlerAdapter: @RequestMapping 어노테이션 기반 Controller에 사용된다.
  2. HttpRequestHandlerAdapter: HttpRequestHandler 인터페이스를 처리한다.
  3. SimpleControllerHandlerAdapter: Controller 인터페이스를 처리한다.

HttpRequestHandler를 통한 Spring MVC 동작 순서

Java
 
// 구현체
@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 호출");
		// 구현 로직
	}

}
  1. HandlerMapping으로 핸들러 조회: BeanNameUrlHandlerMapping이 실행되어 Bean 이름 /request-handler에 해당하는 ExampleRequestHandler를 반환한다.
  2. HandlerAdapter 조회: 등록된 HandlerAdapter들의 supports() 메서드가 우선순위 순서대로 호출된다. HttpRequestHandlerAdapter가 HttpRequestHandler 인터페이스를 지원하므로 선택된다.
  3. HandlerAdapter 실행: DispatcherServlet은 조회된 HttpRequestHandlerAdapter를 실행하면서 Handler 정보 (ExampleRequestHandler)를 함께 전달한다.
  4. HttpRequestHandlerAdapter는 내부적으로 ExampleRequestHandler의 handleRequest() 메서드를 실행하고 결과를 반환한다.