1 분 소요

  • GET /articles?authorName=신주범
  • GET /articles?createdDate=2020-12-10

위 두 API의 엔드포인트는 쿼리 파라미터가 다를 뿐 /articles 로 동일합니다.

이렇게 같은 엔드포인트를 처리하는 방법은
쿼리 파라미터를 옵셔널하게 받아서 처리할 수 있는 방법도 있지만,
다른 방법을 소개해드리려고 합니다.

스프링의 @RequestMapping 어노테이션은 params 옵션을 지정할 수 있습니다.
(@GetMapping, @PostMapping, … 어노테이션은 @RequestMapping 의 속성을 오버라이드해서 사용해 동일합니다.)

image

어노테이션 옵션의 주석에 있는 것처럼 아래의 형태로 값을 지정할 수 있습니다.

  • 키와 값을 모두 지정할 때: myParam=myValue
  • 키의 값이 일치하지 않을 때: myParam!=myValue
  • 키만 지정할 때: myParam

이 글의 처음에서 든 예라면 컨트롤러의 메소드를 아래처럼 만들 수 있겠습니다.

@GetMapping(path="/articles", params="authorName")
// ...

@GetMapping(path="/articles", params="createdDate")
// ...

이렇게 사용하면 파라미터에 대한 분기없이 쿼리 파라미터에 따라 요청을 처리할 수 있습니다.

필수가 아닌 파라미터는 어떻게 해야할까?

사용하면서 주의해야할 점도 있습니다.

@GetMapping(path="/articles", params={"authorName", "page", "size"})
public Page<Article> findArticlesByAuthor(
    @RequestParam(required=true) String authorName,
    @RequestParam(required=false, defaultValue="0") Integer page,
    @RequestParam(required=false, defaultValue="15") Integer page,
) {
    // ...
}

위처럼 필수가 아닌 파라미터를 받는 메소드가 있을 수 있습니다.

위 API에 옵셔널한 pagesize 없이 authorName 만으로 요청한다면
UnsatisfiedServletRequestParameterException 이 발생하는데,
@GetMapping에 지정되어 있는 파라미터가 모두 전달되어 있지 않기 때문입니다.

이럴 때는 아래처럼 필수인 파라미터만 지정해서 해결할 수 있습니다.

@GetMapping(path="/articles", params="authorName")
public Page<Article> findArticlesByAuthor(
    @RequestParam(required=true) String authorName,
    @RequestParam(required=false, defaultValue="0") Integer page,
    @RequestParam(required=false, defaultValue="15") Integer page,
) {
    // ...
}

참고 자료

댓글남기기