PathPattern이란, 스프링 부트에서 @RequestMapping
시에 사용되는 문자 패턴이다.
공식 문서에 따르면, 특정성을 위해 패턴을 비교할 때, 모호성을 제거하기 위해 사용한다고 되어있다.
…라고는 되어있지만 잘 모르겠다. 일단 이렇게 써야한다고 하니 알아보자.
?
: 한 문자 일치/pages/t?st.html
/pages/test.html
, /pages/tXst.html
/pages/toast.html
*
: 경로(/
) 안의 모든 문자 일치/resources/*.png
/resources/photo.png
/resources/favority.ico
**
: 하위 경로 모든 문자 일치/resources/**
/resources/image.png
, /resources/css/spring.css
{spring}
: spring 이라는 변수로 캡처/resources/{path}
/resources/robot.txt
-> path
변수에 "robot.txt" 할당@PathVariable("path")
로 접근 가능{*spring}
: 하위 경로 끝까지 spring
변수에 캡쳐/items/{*path}
/items/1/add
-> path
변수에 "/1/add" 할당{spring:[a-z]+}
: 정규식 이용/items/{path:[a-z]+}
/items/robots
/items/123
{*spring}
@GetMapping("/hello/{*name}")
@ResponseBody
public String handleTest(
@PathVariable String name
) {
log.info("name = {}", name);
return name;
}
[REQUEST]
GET http://localhost:8080/hello/path-test
[LOG]
name = /path-test
[RESPONSE]
/path-test
[REQUEST]
GET http://localhost:8080/hello/path-test/other
[LOG]
name = /path-test/other
[RESPONSE]
/path-test/other
@GetMapping("/static/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
@ResponseBody
public String handle(
@PathVariable String name,
@PathVariable String version,
@PathVariable String ext
) {
log.info("name = {}", name);
log.info("version = {}", version);
log.info("ext = {}", ext);
return "/" + name + "-" + version + "." + ext;
}
[REQUEST]
GET http://localhost:8080/pathtest-1.0.0.jar
[LOG]
name = pathtest
version = 1.0.0
ext = .jar
[RESPONSE]
/pathtest-1.0.0.jar
@GetMapping("/static/{*fullpath}{name}")
@ResponseBody
public String runtimeError(
@PathVariable String fullpath,
@PathVariable String name
) {
log.info("fullpath = {}", fullpath);
log.info("name = {}", name);
return name;
}
Description:
Invalid mapping pattern detected: /static/{*fullpath}{name}
^
No more pattern data allowed after {*...} or ** pattern element
{*...}
또는**
패턴 요소 다음에는 다른 패턴 데이터를 사용할 수 없다.