Programming/Spring Boot

@RequestMapping 정규식, PathPattern 활용하기

Jan92 2023. 10. 7. 13:04

@RequestMapping 정규식, PathPattern 활용하기

@RequestMapping

'@RequestMapping'에는 정규식과 PathPattern을 적용할 수 있는데요.

이런 기능이 있는 줄 모르고 있었는데, 간단하고 또 활용성 있는 기능인 것 같아서 정리하게 되었습니다.

 


@RequestMapping 정규식 사용 방법

@RequestMapping(value = "{변수명:정규식}")
public void request(@PathVariable String 변수명) {
    ...
}

@RequestMapping에서는 다음과 같이 '{변수명:정규식}' 형식을 통해 정규식을 적용할 수 있는데요.

 

//영문 대소문자 
//http://localhost:8080/request/TestValue
@RequestMapping("/request/{value:[a-zA-Z]*}")
public void request1(@PathVariable String value) {
    System.out.println("request1 value: " + value);
    //request1 value: TestValue
}


//숫자 
//http://localhost:8080/request/12345
@RequestMapping("/request/{value:[0-9]*}")
public void request2(@PathVariable String value) {
    System.out.println("request2 value: " + value);
    //request2 value: 12345
}

간단한 사용 예시로는 위 코드와 같이 영문 대소문자, 숫자 등을 지정할 수 있으며, Controller 단에서 다음 두 가지 @RequestMapping이 모두 있을 때, 요청되는 value 값에 따라 매핑되는 메서드가 달라집니다.

 

요청되는 value 값이 적용된 정규식에 해당하지 않는 경우 404 'Not Found'가 발생하며, 아래와 같이 소문자, 대문자, 숫자를 각 1개 이상 포함하고 최소 자리가 3개 이상 같은 복잡한 정규식도 적용할 수 있습니다.

 

@RequestMapping("/request/{value:(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{3,}}")
public void request(@PathVariable String value) {
    ...
}

 

(각 예시의 '/request/' 경로는 단순 예시를 위해 사용한 것입니다.)

 

 

***

추가적으로 dot(.)을 포함한 문자열이 요청되었을 때 dot(.) 이후의 문자열이 사라지는 문제의 경우는 스프링 5.3 버전 이후로 해결되었으며, 자세한 내용은 아래 spring 공식 문서에서 확인할 수 있습니다.

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-requestmapping.html#mvc-ann-requestmapping-suffix-pattern-match

 

 


@RequestMapping PathPattern 사용 방법

// '?'를 사용한 한 문자 일치
@RequestMapping("/request/ab?de")
public void request() {
    // '/request/abcde', '/request/abTde', '/request/ab1de' 등 요청 시 매핑되어 동작
}


// '*' 경로 안의 모든 문자 일치
@RequestMapping("/request/*/example")
public void request() {
    // '*' 위치에 어떤 값이 들어와도 매핑되어 동작
    // '/*.html/'과 같은 방식으로도 사용 가능
}


// '**' 하위 경로 모든 문자 일치
@RequestMapping("/request/**")
public void request() {
    // '/request/a/b', '/request/a/b/c' 등 요청 시 매핑되어 동작
}


// '*value' 하위 경로 끝까지 @PathVariable을 통한 변수로 받음
//http://localhost:8080/request/a/b/c
@RequestMapping("/request/{*value}")
public void request(@PathVariable String value) {
    System.out.println("request value: " + value);
    //request value: /a/b/c (맨 앞에 '/'가 포함됩니다.)
}

이어서 PathPattern에 대한 사용 방법 및 예시 코드입니다.

 

(정규식의 예시와 마찬가지로 각 예시의 '/request/' 경로는 단순 예시를 위해 사용한 것입니다.)

 

 

 

< 참고 자료 >

https://docs.spring.io/spring-framework/docs/3.2.16.RELEASE/spring-framework-reference/html/mvc.html