PathPattern
✅ 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보다 월등히 우수합니다.