🚀 DispatcherServlet 초기화 과정
1. ServletContainer가 DispatcherServlet을 로딩
Spring Boot 앱을 실행하면, 내장 톰캣이 뜨고 아래 과정이 시작돼요:
- Spring Boot가 자동으로
DispatcherServlet을 서블릿으로 등록함 (/매핑) DispatcherServlet은 사실HttpServlet을 상속받은 클래스- 이때 호출되는 메서드가 →
init()→ 그 안에서initServletBean()실행됨
2. WebApplicationContext 생성 및 초기화
DispatcherServlet은 자신의 Spring WebApplicationContext를 가지고 있음- 이 WebApplicationContext는
@Controller,@RestController,@Service,@Repository등이 등록된 공간
GenericWebApplicationContext
↑
AnnotationConfigWebApplicationContext
↑
WebApplicationContext ← DispatcherServlet이 사용
DispatcherServlet은 이 context를 통해 빈을 찾고, 라우팅을 수행함
3. 핵심 컴포넌트 초기화
DispatcherServlet 내부에서 아래와 같은 핵심 컴포넌트들이 초기화됨:
| 컴포넌트 | 역할 |
|---|---|
| HandlerMapping | URL → 어떤 Controller로 보낼지 결정 |
| HandlerAdapter | Controller 실행을 위한 어댑터 |
| HandlerExceptionResolver | 예외 발생 시 처리할 Resolver |
| ViewResolver | View 이름 → 실제 뷰 객체로 변환 |
| LocaleResolver | 요청의 언어/지역 설정 결정 |
| ThemeResolver | 테마 설정 |
| MultipartResolver | 파일 업로드 처리 |
이 컴포넌트들은 Spring MVC의 요청 흐름에 참여함
🧠 DispatcherServlet 내부 구조 (시퀀스 흐름)
클라이언트 요청이 DispatcherServlet에 들어오면 실행되는 핵심 메서드 흐름:
doDispatch() // DispatcherServlet의 핵심 로직
├── getHandler() // HandlerMapping으로 컨트롤러 찾기
├── getHandlerAdapter() // HandlerAdapter로 실행 방식 결정
├── applyPreHandle() // 인터셉터 preHandle 실행
├── handlerAdapter.handle() // 실제 컨트롤러 실행
├── applyPostHandle() // 인터셉터 postHandle 실행
├── processDispatchResult() // 뷰 리졸빙, 예외 처리 등
└── render() // ViewResolver 통해 뷰 렌더링
📦 구조 그림 요약 (텍스트 버전)
[Client 요청]
↓
[DispatcherServlet]
├─ HandlerMapping ← URL에 맞는 Controller 찾음
├─ HandlerAdapter ← 실행 방법 결정
├─ Controller ← 실제 로직 실행
├─ ViewResolver ← 뷰 이름 → JSP, HTML 등으로 변환
└─ View ← 결과 렌더링
↓
[응답 반환]
🔧 DispatcherServlet 설정 관련 팁
Spring Boot에서는 대부분 자동 설정되지만, 직접 설정도 가능해요:
@Bean
public DispatcherServlet dispatcherServlet() {
DispatcherServlet ds = new DispatcherServlet();
ds.setThrowExceptionIfNoHandlerFound(true); // 404 예외 발생
return ds;
}
✅ 요약
| 항목 | 설명 |
|---|---|
| DispatcherServlet 역할 | Spring MVC의 중앙 컨트롤러 (Front Controller) |
| 초기화 시점 | 톰캣이 시작되면서 자동 등록되고 init() 호출됨 |
| 내부 구조 | HandlerMapping, HandlerAdapter, ViewResolver 등 MVC 핵심 컴포넌트 포함 |
| 핵심 메서드 | doDispatch()가 요청 처리의 중심 |