헬로우월드 2023. 6. 23. 07:02

 

✅ 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 동작 방식 요약

  1. @RequestMapping("/posts/{id}") 같은 경로는 앱 시작 시 PathPattern으로 사전 컴파일
  2. 클라이언트가 /posts/123으로 요청하면, PathContainer로 분할됨: ["posts", "123"]
  3. PathPattern.match(PathContainer) 메서드를 통해 빠르게 일치 여부를 확인
  4. 일치할 경우, {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보다 월등히 우수합니다.