들어가며
스프링 부트의 기본 의존성 중 하나인 `spring-boot-starter-web` 모듈을 사용하게 되면 기본적으로 내장 톰캣(Tomcat)을 사용하는 스프링 MVC 구조를 기반으로 동작하게 된다. 즉, 서버 실행 시 톰캣이 함께 구동되고, 모든 웹 요청은 DispatcherServlet을 거쳐 컨트롤러로 전달된다. 이번 포스트에서는 이 구조를 단계별로 다루어보려고 한다.
DispatcherServlet
Spring MVC의 핵심 서블릿으로, 모든 HTTP 요청을 받아서 알맞는 컨트롤러로 전달하고 처리 결과를 응답으로 만들어 반환하는 프론트 컨트롤러(front controller) 역할을 한다.
Tomcat은 Servlet Container (서블릿 컨테이너)이다. 서블릿을 생성/실행/수명주기를 관리하는 '집' 역할을 한다.
스프링 부트 동작 구조

1. 브라우저나 앱에서 HTTP 요청을 보내면, 내장 톰캣과 같은 서블릿 컨테이너가 이를 받고 서블릿 컨테이너는 요청 URL에 따라 해당 요청을 처리할 서블릿을 찾는다. 그리고 Spring Boot에서는 모든 요청이 DispatcherServlet으로 전달된다.
2. DispatcherServlet은 먼저 핸들러 매핑 (Handler Mapping)을 통해 이 요청을 처리할 컨트롤러를 찾는다.
- 예를 들어, `/hello` 라는 요청이라면 해당 URL을 처리하는 컨트롤러 메서드를 매핑 정보에서 검색을 하게 된다.
3. 찾은 컨트롤러를 실행하기 위해 핸들러 어댑터 (Handler Adapter)를 사용한다. 왜냐, 컨트롤러의 형태나 호출 방식이 다양하기 때문이다. 핸들러 어댑터가 컨트롤러 메서드를 호출하고, 처리 결과를 DispatcherServlet에 반환한다.
4. 컨트롤러가 반환한 뷰(View) 이름을 처리한다.
- `@Controller` 인 경우 : 컨트롤러는 주로 뷰 이름(String)을 반환한다.
- 예를 들어, `home` 이면 ViewResolver 가 `templates/home.html` 과 같은 실제 뷰 파일 경로를 찾는다.
- `@RestController` 인 경우 : JSON, XML과 같은 데이터를 직접 반환하므로 ViewResolver를 거치지 않고 바로 응답 본문을 생성한다.
5. 뷰 리졸버 (View Resolver) 동작
ViewResolver는 뷰 이름을 실제 뷰 객체로 변환한다. (Thymeleaf, JSP 등의 템플릿 엔진)
변환된 뷰 객체는 모델 데이터를 이용해 HTML로 랜더링한다.


+) HandlerMapping/HandlerAdapter 자동 등록
Spring Boot에서 `spring-boot-starter-web` 의존성을 추가하면, Spring MVC가 필요한 HandlerMapping과 HandlerAdapter 가 자동으로 빈(Bean)으로 등록된다. 덕분에 개발자가 직접 설정하지 않아도 `@Controller` , `@RestController` 메서드가 URL 요청과 자동 매핑된다.
'Spring' 카테고리의 다른 글
| [Spring] IoC(Inversion of Control)와 DI(Dependency Injection) (2) | 2025.08.08 |
|---|---|
| [Spring] 레이어드 아키텍처(Layered Architecture)와 Spring MVC (0) | 2025.08.05 |
| [Spring] Spring Security의 구조와 흐름 (0) | 2025.07.17 |
| [Spring] JWT 토큰 인증 & 쿠키, 세션, 토큰 (0) | 2025.07.16 |
| [Spring] 서블릿(Servlet)과 서블릿 컨테이너 (0) | 2025.07.16 |