Spring MVC 요청 처리 흐름 이해하기

Spring MVC는 Java 기반 웹 애플리케이션 개발에서 가장 많이 사용되는 아키텍처 중 하나입니다. 그러나 단순히 @Controller나 @RestController를 사용하는 것에 그치지 않고, 실제로 HTTP 요청이 들어온 뒤 어떻게 처리되어 응답이 나가는지 그 흐름을 이해하는 것은 프레임워크에 대한 깊은 이해와 디버깅 능력을 향상시키는 데 도움이 됩니다.

 

1. DispatcherServlet이란?

Spring MVC의 핵심은 DispatcherServlet입니다. 모든 웹 요청은 가장 먼저 DispatcherServlet이 받습니다. 이는 일종의 중앙집중형 프론트 컨트롤러(Front Controller)입니다. web.xml이나 Spring Boot에서는 @SpringBootApplication 내부 설정으로 자동 등록됩니다.


// web.xml 방식 예시 (Spring Boot는 생략 가능)
<servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

2. 요청 처리 주요 흐름

  1. 클라이언트가 HTTP 요청 전송
  2. DispatcherServlet이 요청 수신
  3. HandlerMapping을 통해 어떤 컨트롤러가 요청을 처리할지 결정
  4. HandlerAdapter가 해당 컨트롤러를 실행
  5. Controller가 요청 처리 후 ModelAndView 반환
  6. ViewResolver가 View 이름을 기반으로 실제 View를 찾음
  7. View가 응답을 렌더링하고 DispatcherServlet이 응답 반환

 

3. 각 구성요소 설명

HandlerMapping

요청 URL에 따라 어떤 @Controller 메서드가 호출되어야 할지 결정합니다. Spring은 RequestMappingHandlerMapping 등을 통해 이 작업을 수행합니다.

HandlerAdapter

HandlerMapping이 반환한 Handler(대부분 컨트롤러의 메서드)를 실행하기 위한 어댑터입니다. 즉, 컨트롤러 호출 책임이 이쪽에 있습니다.

ViewResolver

Controller가 반환한 문자열 View 이름을 실제 JSP, Thymeleaf 등 View로 매핑해주는 컴포넌트입니다. 예를 들어 "home"이라는 뷰 이름이 /WEB-INF/views/home.jsp로 매핑됩니다.

 

 

4. 전체 흐름 예시


@GetMapping("/hello")
public String hello(Model model) {
    model.addAttribute("message", "Hello, Spring MVC");
    return "helloView";
}

위 메서드 실행 흐름 요약:

  1. /hello로 요청
  2. DispatcherServlet → HandlerMapping → 해당 Controller 메서드 매핑
  3. HandlerAdapter가 메서드 실행
  4. “helloView” 문자열 반환
  5. ViewResolver가 helloView.jsp로 매핑
  6. View 렌더링 → HTML 응답 생성

 

5. Spring Boot에서 자동 구성 요소

Spring Boot를 사용하면 위의 구성 요소 대부분이 자동으로 설정됩니다. 예를 들어, DispatcherServlet, RequestMappingHandlerMapping, InternalResourceViewResolver 등이 자동으로 빈으로 등록됩니다. 이 덕분에 개발자는 비즈니스 로직에 집중할 수 있습니다.

 

6. 실무 팁

  • 문제 발생 시 DispatcherServlet 로그 레벨을 DEBUG로 설정하면 많은 흐름을 확인할 수 있습니다.
  • @ControllerAdvice로 전역 예외 처리기를 만들어 응답 구조를 통일하세요.
  • ViewResolver 설정을 명시적으로 지정하여 예상치 못한 뷰 경로 오류를 방지할 수 있습니다.
  •  

결론

Spring MVC의 요청 처리 흐름을 명확히 이해하면, 애플리케이션에서 발생하는 여러 이슈를 빠르게 파악하고 해결할 수 있습니다. 또한, 컨트롤러 설계나 테스트, 로그 분석 시에도 더 깊이 있는 인사이트를 가질 수 있게 됩니다.