본문 바로가기
Spring

[Spring] 서블릿 매핑(*.do)과 @RequestMapping 경로 불일치, 왜 작동할까?

by 상후 2025. 7. 6.
728x90
반응형

 

web.xml에서 DispatcherServlet이 *.do로 매핑되어 있다고 가정해 보자.
Controller엔 /apple 이라는 GET API만 존재한다고 가정한다.

예를 들어, 클라이언트가 /apple.do로 요청을 보내면, 이 요청은 DispatcherServlet으로 전달된다. DispatcherServlet은 내부적으로 어떤 Controller가 이 요청을 처리할지 결정한다.

 

/apple.do로 정확히 매핑된 @RequestMapping이 존재하지 않기 때문에, 당연히 매핑 오류가 발생할 줄 알았다.
그런데 예상과 달리, /apple로 선언된 메서드가 이 요청을 정상 처리한다.

왜 그럴까?

 

이유는⁠ RequestMappingHandlerMapping  클래스의 useSuffixPatternMatch 기본 설정값이 원인이다.
 
간단하게 위 컴포넌트와 해당 설정의 개념에 대해 정리해보자.

 

✔️ ⁠RequestMappingHandlerMapping 
Spring MVC에서 @RequestMapping을 해석하고 매핑하는 핵심 컴포넌트
 
✔️⁠useSuffixPatternMatch 
URL에 붙은 확장자(suffix)를 포함해 매핑할지를 결정하는 옵션

 

✔️⁠RequestMappingHandlerMapping 은 일반적으로 <mvc:annotation-driven /> 설정으로 자동으로 주입받아 사용한다.
 

 

정리하자면, 필자가 사용하는 Spring 버전은 4.x 이하였다.
이 버전에서는 useSuffixPatternMatch 기본값이 true이다.
그래서 .do 확장자가 붙은 URL 요청도 /apple로 선언된 컨트롤러 메서드에 정상적으로 매핑될 수 있었던 것이다.
 
기존에 알고있던 개념은 Spring 5+ 에서 적용되는 개념이였던 것이다. ( useSuffixPatternMatch 기본값이 false)
스프링 5 버전 이후에서 해당 옵션을 끈 이유는 최근에는 RESTful 스타일에 맞춰 API URL을 설계하여 쓰고, *.do와 같은 URL 확장자는 사용하지 않기 때문인 것으로 생각한다. (추측임)
 
이렇게 Spring이 자동으로 처리해주는 부분이 많다는 점에 다시 한 번 감탄하게 된다.
개발자가 모든 것을 알지 못해도 생산성이 높게 유지될 수 있는 프레임워크 환경에서 개발하고 있다는 사실이 참 감사하다.
이런 설정의 차이를 인지하고 프로젝트를 분석하면, 디버깅이나 유지보수에도 큰 도움이 될 거라고 생각한다.

 

[스프링 4.x 이하에서의 Spring MVC URL 매핑 흐름 리마인드]

 

[ 클라이언트 요청: /abc.do ]
  │
  ▼
[ web.xml ]
└── DispatcherServlet 매핑: *.do
  │
  ▼
[ DispatcherServlet ]
└── 등록된 HandlerMapping을 통해 @RequestMapping 찾기
  │
  ▼
[ RequestMappingHandlerMapping ]
├── 등록됨: <mvc:annotation-driven /> 설정에 의해 자동 주입
├── 내부 설정: setUseSuffixPatternMatch(true) ← Spring 4.x 이하 기본값
└── @RequestMapping("/abc") 에 대해 확장자 있는 요청도 매핑 허용
  │
  ▼
[ LoginController 클래스 등에서 @RequestMapping("/abc") 메서드 실행 ]
  │
  ▼
[ ViewResolver 또는 JSON 응답 처리 ]
  │
  ▼
[ 클라이언트에게 응답 반환 ]

 

 

출처 : https://docs.spring.io/spring-framework/docs/3.1.3.RELEASE_to_3.2.0.RELEASE/Spring%20Framework%203.2.0.RELEASE/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.html?utm_source=chatgpt.com

 

RequestMappingHandlerMapping

Whether to use suffix pattern match for registered file extensions only when matching patterns to requests. If enabled, a controller method mapped to "/users" also matches to "/users.json" assuming ".json" is a file extension registered with the provided c

docs.spring.io

 

728x90
반응형

댓글