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인 @PathVariable1id에 매핑해준다. (얼마나 직관적이고 편리한가! 갓갓 스프링)

참고로 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



© 2022. by minkuk

Powered by minkuk