URL 분배의 마법
"@GetMapping("/list") 한 줄만 썼는데 — 어떻게 브라우저 요청이 정확히 그 메서드로 도달하지?"
중간에 무언가가 「URL → 메서드」 매핑을 책임지고 있어야 합니다. 그게 DispatcherServlet.
큰 식당의 안내데스크처럼, 모든 손님(요청)을 한 곳에서 받아 적절한 종업원(Controller)에게 안내하는 부품.
👉 이 패턴을 「Front Controller」 라고 부릅니다.
<web-app>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern> <!-- 모든 URL -->
</servlet-mapping>
</web-app>
👉 url-pattern=/ = 「모든 URL 을 이 Servlet 으로 보내라」.
| 부품 | 역할 |
|---|---|
| HandlerMapping | URL → Controller 메서드 매칭 |
| HandlerAdapter | 실제로 메서드를 호출하는 부품 |
| ViewResolver | ViewName → 실제 View 파일 매핑 |
👉 우리가 직접 다루지 않음. Spring 이 자동으로 사용. 단 ViewResolver 만 설정에서 prefix/suffix 지정.
// Spring 이 시작될 때 모든 @Controller 를 스캔해서
// HandlerMapping 에 다음 같은 표를 만듦:
URL 패턴 메서드
─────────────────────────────────────────
GET /board/list BoardController.list
GET /board/view/{id} BoardController.view
POST /board/write BoardController.write
GET /api/boards BoardApiController.list
...
👉 요청이 오면 이 표에서 매칭되는 메서드를 찾아 호출.
<!-- servlet-context.xml -->
<bean id="viewResolver"
class="...InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
모든 요청이 하나의 진입점을 거치면 좋은 점:
👉 인터셉터가 끼어들 자리도 DispatcherServlet 이 만들어준 흐름의 일부.
<!-- log4j2.xml -->
<Logger name="org.springframework.web" level="DEBUG" />
<Logger name="org.springframework.web.servlet" level="TRACE" />
이렇게 하면 콘솔에 다음 같은 로그:
DispatcherServlet : GET "/board/view/3"
RequestMappingHandlerMapping : Mapped to BoardController#view(int, Model)
BoardController : view(3) called
View : Resolved to '/WEB-INF/views/board/view.jsp'
DispatcherServlet : Completed 200 OK
👉 매 요청의 9 단계 여정이 그대로 보임.
| 증상 | 의심할 곳 |
|---|---|
| 404 | HandlerMapping 에 등록 안 됨 — @Controller·component-scan 확인 |
| 405 Method Not Allowed | 매핑된 HTTP 메서드와 요청 메서드 불일치 |
| "Could not resolve view" | ViewResolver prefix/suffix 또는 JSP 파일 경로 |
| 정적 파일(CSS·JS·이미지) 안 보임 | servlet-context.xml 의 <mvc:resources> 매핑 |
Spring Boot 도 내부적으로 DispatcherServlet 을 사용 — 단지 자동 등록.
@SpringBootApplication 한 줄에 자동기본 동작은 동일. Legacy 에서 한 번 명시적으로 보면 — Boot 가 무엇을 자동화하는지 보임.
DispatcherServlet 의 이름은 알지만 무슨 일을 하는지 막연.
URL 매칭 → 메서드 호출 → ViewResolver 의 9 단계 여정을 그릴 수 있다.
다음: Controller 해부.