본문 바로가기
Develop/Spring

[Spring Web MVC] Request Mapping - URI patterns

by 준팍(junpak) 2023. 4. 17.

URI patterns

  • @RequestMapping 메서드는 URL 패턴을 사용하여 웹 요청을 컨트롤러 메서드에 매핑 가능하다.
  1. PathPattern
    • URL 경로와 미리 분석된 PathContainer에 대해 미리 파싱된 패턴을 매칭한다.
    • 웹 사용에 최적화되어 인코딩 및 경로 매개변수 처리에 더 효과적이고 효율적이다.
    • Spring WebFlux에서 사용되는 유일한 방식이다.
    • 버전 5.3부터 Spring MVC에 적용되었으며, 버전 6.0부터 기본 설정으로 활성화되었다.
  2. AntPathMatcher
    • 문자열 패턴을 문자열 경로와 매칭한다.
    • 스프링 구성에서 클래스 경로, 파일 시스템 및 기타 위치에 있는 리소스를 선택하는 데 사용된다.
    • 문자열 경로 입력은 인코딩 및 URL 관련 문제를 처리하는 데 덜 효과적이며 효율성이 떨어진다.
  • 두 방식 모두 AntPathMatcher와 동일한 패턴 구문을 사용
  • PathPattern
    • 경로 끝에서 0개 이상의 경로 세그먼트를 매칭하기 위한 캡처 패턴 지원 (2번째 패턴 예시)
    • 여러 경로 세그먼트와 매치하는 것으로 제한하기 위해, ** 사용을 패턴 끝에서만 허용 (모호성 제거)

 

패턴 예시:

  • "/resources/ima?e.png" - 경로 세그먼트에서 한 문자와 매칭
  • "/resources/*.png" - 경로 세그먼트에서 0개 이상의 문자와 매칭
  • "/resources/**" - 여러 경로 세그먼트와 매칭
  • "/projects/{project}/versions" - 경로 세그먼트와 매칭하고 변수로 캡처
  • "/projects/{project:[a-z]+}/versions" - 정규식을 사용하여 변수를 매칭하고 캡처
// @PathVariable을 사용하여, 캡처된 URI 변수 액세스

@GetMapping("/owners/{ownerId}/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
    // ...
}
// 클래스 및 메서드 수준에서의 URI 변수 선언

@Controller
@RequestMapping("/owners/{ownerId}")
public class OwnerController {

    @GetMapping("/pets/{petId}")
    public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
        // ...
    }
}

 

URI 변수

  • 적절한 데이터 타입으로 자동 변환되거나 TypeMismatchException을 발생시킨다.
  • 간단한 데이터 타입은(int, long, Date 등)을 기본적으로 지원하며, 다른 데이터 유형도 지원 등록 가능
  • 명시적으로 이름 지정 가능 (예: @PathVariable("customId")),
  • 이름이 동일하고 코드가 -parameters 컴파일러 플래그를 사용하여 컴파일되는 경우, 해당 세부 정보 생략 가능
  • {varName:regex} 구문 : 정규 표현식을 사용하여 URI 변수를 선언
// URL "/spring-web-3.0.5.jar"가 주어지는 경우
// 다음 메서드로 이름, 버전 및 파일 확장자 추출 가능

@GetMapping("/{name:[a-z-]+}-{version:\\\\d\\\\.\\\\d\\\\.\\\\d}{ext:\\\\.[a-z]+}")
public void handle(@PathVariable String name, @PathVariable String version, @PathVariable String ext) {
    // ...
}

URI path patterns

  • 임베디드된 ${...} 플레이스홀더를 가질 수 있다.
  • ${...} 플레이스홀더는 시스템 시작 시,PropertySourcesPlaceholderConfigurer를 사용하여 로컬, 시스템, 환경 및 기타 속성 소스로부터 값을 가져와 해결된다.
  • 이 기능을 통해 기본 URL을 일부 외부 설정에 따라 매개변수화 가능하다.