Spring MVC 핸들러 메소드 URI 패턴
Spring Web MVC
백기선님의 강의인 Spring Web MVC 강의를 듣고 공부한 내용을 정리한 글
@PathVariable
@Controller
public class SampleController {
@GetMapping("/events/{id}")
@ResponseBody
public Event getEvent(@PathVariable Integer id) {
Event event = new Event();
event.setId(id);
return event;
}
}
클라이언트가 /events/1
요청을 서버에 보낸다고 가정해보자.
서버는 응답 본문에 HttpMessageConverter(Jackson2HttpConverter)를 사용하여 Event 클래스를 Json 타입으로 변환하여 내려줄 것이다.
@PathVariable의 역할은 사용자가 1
이라는 요청을 URI에 넣어서 보내는 것을 처리하는 역할을 담당한다.
핸들러 Argument인 @PathVariable은 1
을 id
에 매핑해준다. (얼마나 직관적이고 편리한가! 갓갓 스프링)
참고로 Node.js의 경우 Request,Response를 그대로 받아서 파싱해야하기 때문에 좀 번거로운데 스프링은 이를 매우 편리하게 처리할 수 있다.
만약 @GetMapping에 명시한 URI 이름과 @PathVariable의 변수 이름이 다른 경우 반드시 @PathVariable에 명시를 해주어야 한다.
@Controller
public class SampleController {
@GetMapping("/events/{id}")
@ResponseBody
public Event getEvent(@PathVariable("id") Integer idValue) {
Event event = new Event();
event.setId(idValue);
return event;
}
}
@MatrixVariable
만약 클라이언트가 요청에 id:1, name:harry와 같이 key,value 쌍으로 요청을 보내고 싶다면 어떻게 해야할까?
/events/id/1/name/harry
이런 식의 요청을 받아서 처리할 수도 있을 것이다.
그러나 이는 URI가 굉장히 지저분해진다.
RFC3986 스펙에서 key,value 쌍을 URI에 정의하는 것에 관해 설명하고 있다.
스프링 또한 이러한 기능을 제공하기 위해 @MatrixVariable을 만들었다.
@MatrixVariable을 사용하면 위의 요청을 다음과 같이 표현할 수 있다.
요청 : /events/1/name=harry
@Controller
public class SampleController {
@GetMapping("/events/{id}")
@ResponseBody
public Event getEvent(@PathVariable Integer id,@MatrixVariable String name) {
Event event = new Event();
event.setId(id);
event.setName(name);
return event;
}
}
문제는 이렇게 하면 @MatrixVariable 애노테이션을 찾을 수 없다는 에러가 나온다.
왜냐하면 기본적으로 @MatrixVariable을 스프링 MVC에서 지원해주지 않기 떄문인데, 별도의 설정을 필요로 한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
이 설정을 설정 후 다시 실행해보면 정상적으로 @MatrixVariable을 사용할 수 있는 것을 볼 수 있다.
Reference
인프런 백기선님의 스프링 Web MVC