URI의 I는 identifier 즉 식별자입니다. 따라서 특정 리소스를 식별할 수 있는 Data를 모두 포합니다. 반면에 URL의 L은 locator입니다. 특정 리소스를 식별할 수 있는 주소라는 의미입니다. 따라서 URI 안에 URL이 포함된다고 생각하면 됩니다.(사실 대부분의 요청은 URL로 오기 때문에 URI를 URL로 알고 있어도 큰 문제는 없을 거 같긴 합니다..)
URI와 URL의 정의를 간단하게 알아보았으니, Spring에서 지원하는 URI Pattern Mapping 하는 방법에 대해 알아봅시다.
HTTP요청 처리하기 - ② URI Pattern Mapping
URI Pattern Mapping의 기본
Spring Framework에서 URI Pattern을 Mapping 하는 방법은 RequestMapping Annotation을 사용하는 것입니다. 가장 기본적으로 RequestMapping Annotation의 value값에 해당하는 URI를 정의해 주는 것입니다.
@Controller
@RequestMapping(method=RequestMethod.POST)
public class Sample {
@RequestMapping(value = "/hello")
public String hello(){
return "Hello Reqeust";
}
}
/hello라는 URI 요청이 오면 hello라는 메서드를 수행하게 되는 것입니다.
그런데, 같은 기능을 수행하는 여러 가지 URI 요청이 있을 때, 똑같은 메서드를 여러 번 정의해야 하는 문제가 발생합니다. 따라서 RequestMapping Annotation은 다양한 URI 표현 방식을 제공해 줍니다.
- ? : 특정문자 하나만 맵핑 (/sample/?)
- * : 여러 개의 문자열 맵핑 (/sample/*)
- ** : 여러 개의 path 맵핑 (/sample/**)
그럼 위와 같은 표현 방식을 어떻게 사용하는지 간단한 예제 소스로 알아보겠습니다.
@RequestMapping(method=RequestMethod.POST)
public class Sample{
@RequestMapping(value="/hello/?") // /hello/1, /hello/2, /hello/a 와 같은 패턴의 요청을 처리
public String helloOneChar(){
return "hello";
}
@RequestMapping(value="/hello/*") // /hello/world, /hello/world2, /hello/hi 와 같은 패턴의 요청을 처리
public String helloMultiChar(){
return "hello";
}
@RequestMapping(value="/hello/**") // /hello/world/hi, /hello/world2/me/too 와 같은 패턴의 요청을 처리
public String helloMultiplePath(){
return "hello";
}
}
RequestMapping Annotation은 class 레벨에도 사용할 수 있는데요. class 레벨에 URI Pattern 이 정의되어 있다면, 메서드에 붙은 URI Pattern은 class 레벨에 정의된 패턴 뒤에 이어서 조합이 됩니다.
또, 여러 가지 방식으로 URI 맵핑을 정의하다 보면, 같은 패턴이 여러 개의 메서드에 맵핑될 수 있습니다. 이 때는 가장 구체적으로 정의되어 있는 패턴으로 맵핑됩니다.
URI Pattern과 변수 처리
URI 요청을 처리할 때, URI에 포함되어 있는 특정한 값을 받아서 처리해야 할 수 있습니다. 그래서 Spring에서는 URI template Pattern을 URI String과 변수로 이루어져 있다고 정의합니다. 따라서 URI로 요청한 값을 변수로 받아서 처리할 수 있습니다. 예를 들어 URI패턴을 "/users/{userId}"라는 URI template 패턴은 userId라는 변수를 가지고 있고, @PathVariable이라는 Annotation으로 메서드의 파라미터로 받아서 처리할 수 있습니다.
@RequsetMapping(method=RequestMethod.POST)
public class Sample {
@RequestMapping(value="/users/{userId}")
public String helloUser(@PathVariable("userId")String userId){
//parameter명과 URI Pattern의 변수 명이 같다면 괄호 생략 가능
return "hello " + userId;
}
}
URI Template Pattern과 정규표현식
URI Template Pattern에 변수명에는 정규표현식을 사용할 수 있습니다. 사용방법은 아주 간단합니다. {varName : 정규표현식}입니다. "/spring-web/spring-web-3.0.5.jar" 이런 URI 요청을 "/spring-web" 경로에 "파일명-버전. 확장자"로 URI Pattern을 정의하고, 정규표현식으로 처리하면 다양한 방식의 요청처리를 하나의 메서드로 해결할 수 있습니다. (URI요청으로 확장자까지 요청하는 건 보안상의 이슈로 권장하지 않습니다. 스프링 부트에서는 기본적으로 확장자 요청을 사용할 수 없게 세팅해 줍니다.)
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String extension) {
// ...
}
}
이전 글: HTTP 요청 처리하기 - ① HTTP Method 맵핑
'코딩log > Spring Framework' 카테고리의 다른 글
[Spring Framework]HTTP요청 처리하기 - ① HTTP method 맵핑 (2) | 2023.07.29 |
---|---|
[Spring Framework]Spring Bean의 초기화와 종료 (1) | 2023.04.20 |
[Spring Framework]Autowired와 자동 의존관계 주입의 옵션들 (0) | 2023.04.17 |
[Spring Framework]ComponentScan과 자동 의존관계 주입 (1) | 2023.04.11 |
[Spring Framework]@Configuration과 Singleton (0) | 2023.03.19 |
댓글