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로 선언된 컨트롤러 메서드에 정상적으로 매핑될 수 있었던 것이다.
그래서 .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 응답 처리 ]
│
▼
[ 클라이언트에게 응답 반환 ]
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
반응형
'Spring' 카테고리의 다른 글
| [Spring] OutOfMemoryError - GC overhead limit exceeded 원인 분석 및 해결 (1) | 2024.11.20 |
|---|---|
| [Spring/Mybatis] 마이바티스 조회 시 NULL 반환 이슈(returnInstanceForEmptyRow) (0) | 2024.06.24 |
| [Test] ConnectionTimeout / ReadTimeout 테스트 하기 (0) | 2024.04.09 |
| [SpringBoot] H2 데이터베이스 PostgreSQL 모드로 변경하기 (0) | 2024.03.13 |
| [Springboot] 외부에서 로컬 서버 접속하기 (0) | 2024.03.12 |
댓글