2023. 6. 23. 07:02ㆍSpring Framework/Web on Servlet Stack
✅ 1.1 PathPattern이란?
PathPattern은 Spring 5.3부터 도입되고, Spring 6에서 정식 디폴트 경로 매핑 메커니즘으로 강화된 클래스입니다.
기존의 Ant-style 경로 패턴(/**, /*, ?, {variable} 등)을 보다 빠르고 정확하게 처리하기 위한 새로운 방식입니다.
✅ PathPattern과 URL Path 매칭
✔ 핵심 개념:
- PathPattern: 경로 매핑 패턴을 미리 파싱한 객체
- PathContainer: 클라이언트 요청 URL 경로(/posts/123/comments)를 **분절된 경로(path segment)**로 표현한 객체
이 둘을 비교하여 핸들러 매핑을 수행합니다.
✅ 기존 방식 vs PathPattern
항목 | AntPathMatcher (기존) | PathPattern (신버전) |
도입 시기 | 매우 오래됨 | Spring 5.3+ |
성능 | 동적 파싱 | 사전 파싱(Pre-parsed) |
인코딩 처리 | 제한적 | RFC 기반 UTF-8, PathVar 디코딩 분리 |
패턴 기능 | 유연하지만 느림 | 고성능, 제한적 |
사용법 | 기본값 (Spring 5 이전) | Spring 6부터 기본 설정 |
✅ PathPattern 동작 방식 요약
- @RequestMapping("/posts/{id}") 같은 경로는 앱 시작 시 PathPattern으로 사전 컴파일됨
- 클라이언트가 /posts/123으로 요청하면, PathContainer로 분할됨: ["posts", "123"]
- PathPattern.match(PathContainer) 메서드를 통해 빠르게 일치 여부를 확인
- 일치할 경우, {id} 변수값(123) 추출
✅ 왜 더 적합한가?
▶ URL 인코딩 처리
기존 AntPathMatcher는 %2F 같은 인코딩된 / 슬래시 처리에 미약함
→ PathPattern은 RFC 3986에 따라 경로 세그먼트를 정확하게 디코딩하여 일치 여부를 판단
▶ 퍼포먼스 개선
경로를 String으로 비교하지 않고, PathPattern 객체를 통해 세그먼트 단위로 비교
→ 빠른 핸들러 매핑 (JMH 벤치마크 기준 평균 20~30% 속도 개선)
✅ 예제
// Spring MVC Controller
@RequestMapping("/articles/{articleId}")
public String getArticle(@PathVariable String articleId) {
return "Reading article " + articleId;
}
// 요청: /articles/42
// PathContainer: ["articles", "42"]
// PathPattern: ["articles", "{articleId}"]
// 매핑 성공 → articleId = "42"
✅ Spring 구성 예시 (PathPatternParser를 강제로 활성화)
Spring Boot 2.x에서는 다음과 같이 명시적으로 구성 가능:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setPatternParser(new PathPatternParser());
}
}
Spring Boot 3.x / Spring 6.x 이상에서는 디폴트이므로 따로 구성할 필요 없음.
✅ 정리
PathPattern은 URL 경로 매칭을 위한 Spring 6의 고성능 디폴트 매커니즘입니다.
URL을 PathContainer로 나누고, 미리 파싱된 PathPattern과 비교하여 효율적인 요청 매핑을 수행합니다.
인코딩 처리, 성능, 유지보수 측면에서 기존 AntPathMatcher보다 월등히 우수합니다.
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
@RequestHeader (0) | 2024.10.09 |
---|---|
Annotated Controllers[1] (1) | 2024.10.06 |
HandlerAdapter의 추상화 작업 (0) | 2023.06.23 |
contextPath와 servletPath (0) | 2023.06.23 |
requestURI (0) | 2023.06.23 |