RFC 3986에서는 경로 세그먼트의 이름-값 쌍에 대해 설명합니다. Spring MVC에서는 Tim Berners-Lee의 "old post"을 기반으로 이를 "행렬 변수"라고 부르지만 URI 경로 매개변수라고도 할 수 있습니다.
매트릭스 변수는 모든 경로 세그먼트에 나타날 수 있으며 각 변수는 세미콜론으로 구분되고 여러 값은 쉼표로 구분됩니다(예: /cars;color=red,green;year=2012
). 반복되는 변수 이름을 통해 여러 값을 지정할 수도 있습니다(예: color=red;color=green;color=blue
).
URL에 행렬 변수가 포함될 것으로 예상되는 경우 컨트롤러 메서드에 대한 요청 매핑은 URI 변수를 사용하여 해당 변수 콘텐츠를 마스크하고 행렬 변수 순서 및 존재 여부와 관계없이 요청이 성공적으로 일치할 수 있는지 확인해야 합니다. 다음 예에서는 행렬 변수를 사용합니다.
// GET /pets/42;q=11;r=22
@GetMapping("/pets/{petId}")
public void findPet(@PathVariable String petId, @MatrixVariable int q) {
// petId == 42
// q == 11
}
모든 경로 세그먼트에 행렬 변수가 포함될 수 있다는 점을 고려하면 행렬 변수가 어떤 경로 변수에 포함될 것으로 예상되는지 명확하게 해야 하는 경우가 있습니다. 다음 예에서는 그렇게 하는 방법을 보여줍니다.
// GET /owners/42;q=11/pets/21;q=22
@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(
@MatrixVariable(name="q", pathVar="ownerId") int q1,
@MatrixVariable(name="q", pathVar="petId") int q2) {
// q1 == 11
// q2 == 22
}
다음 예에서 볼 수 있듯이 행렬 변수는 선택 사항으로 정의되고 기본값이 지정될 수 있습니다.
// GET /pets/42
@GetMapping("/pets/{petId}")
public void findPet(@MatrixVariable(required=false, defaultValue="1") int q) {
// q == 1
}
모든 행렬 변수를 얻으려면 다음 예제와 같이 MultiValueMap
을 사용할 수 있습니다.
// GET /owners/42;q=11;r=12/pets/21;q=22;s=23
@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(
@MatrixVariable MultiValueMap<String, String> matrixVars,
@MatrixVariable(pathVar="petId") MultiValueMap<String, String> petMatrixVars) {
// matrixVars: ["q" : [11,22], "r" : 12, "s" : 23]
// petMatrixVars: ["q" : 22, "s" : 23]
}
행렬 변수를 사용하도록 설정해야 합니다. MVC Java 구성에서는 경로 matching를 통해 removeSemicolonContent=false
로 UrlPathHelper
를 설정해야 합니다. MVC XML 네임스페이스에서 <mvc:annotation-driven 활성화-matrix-variables="true"/>
를 설정할 수 있습니다.