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. 요청 처리 주요 흐름
- 클라이언트가 HTTP 요청 전송
- DispatcherServlet이 요청 수신
- HandlerMapping을 통해 어떤 컨트롤러가 요청을 처리할지 결정
- HandlerAdapter가 해당 컨트롤러를 실행
- Controller가 요청 처리 후 ModelAndView 반환
- ViewResolver가 View 이름을 기반으로 실제 View를 찾음
- 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";
}
위 메서드 실행 흐름 요약:
/hello
로 요청- DispatcherServlet → HandlerMapping → 해당 Controller 메서드 매핑
- HandlerAdapter가 메서드 실행
- “helloView” 문자열 반환
- ViewResolver가 helloView.jsp로 매핑
- View 렌더링 → HTML 응답 생성
5. Spring Boot에서 자동 구성 요소
Spring Boot를 사용하면 위의 구성 요소 대부분이 자동으로 설정됩니다. 예를 들어, DispatcherServlet
, RequestMappingHandlerMapping
, InternalResourceViewResolver
등이 자동으로 빈으로 등록됩니다. 이 덕분에 개발자는 비즈니스 로직에 집중할 수 있습니다.
6. 실무 팁
- 문제 발생 시 DispatcherServlet 로그 레벨을 DEBUG로 설정하면 많은 흐름을 확인할 수 있습니다.
@ControllerAdvice
로 전역 예외 처리기를 만들어 응답 구조를 통일하세요.- ViewResolver 설정을 명시적으로 지정하여 예상치 못한 뷰 경로 오류를 방지할 수 있습니다.
결론
Spring MVC의 요청 처리 흐름을 명확히 이해하면, 애플리케이션에서 발생하는 여러 이슈를 빠르게 파악하고 해결할 수 있습니다. 또한, 컨트롤러 설계나 테스트, 로그 분석 시에도 더 깊이 있는 인사이트를 가질 수 있게 됩니다.
'개발 > JAVA' 카테고리의 다른 글
@RequestBody와 @ResponseBody 이해하기: Spring MVC에서의 JSON 처리 핵심 (0) | 2025.10.01 |
---|---|
@RequestParam과 @PathVariable 사용법: Spring에서의 URL 파라미터 처리 (0) | 2025.09.30 |
Postman vs Insomnia: API 테스트 도구 완전 정복 (0) | 2025.09.28 |
JUnit5와 Spring Test 기초: 단위 테스트부터 통합 테스트까지 (0) | 2025.09.27 |
Spring Boot에서 @Value를 사용해 properties 값 주입하기 (0) | 2025.09.26 |