스프링에서 같은 엔드포인트에 쿼리 파라미터가 다른 컨트롤러 메소드 구성하기
GET /articles?authorName=신주범
GET /articles?createdDate=2020-12-10
위 두 API의 엔드포인트는 쿼리 파라미터가 다를 뿐 /articles
로 동일합니다.
이렇게 같은 엔드포인트를 처리하는 방법은
쿼리 파라미터를 옵셔널하게 받아서 처리할 수 있는 방법도 있지만,
다른 방법을 소개해드리려고 합니다.
스프링의 @RequestMapping
어노테이션은 params
옵션을 지정할 수 있습니다.
(@GetMapping
, @PostMapping
, … 어노테이션은 @RequestMapping
의 속성을 오버라이드해서 사용해 동일합니다.)
어노테이션 옵션의 주석에 있는 것처럼 아래의 형태로 값을 지정할 수 있습니다.
- 키와 값을 모두 지정할 때:
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에 옵셔널한 page
와 size
없이 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,
) {
// ...
}
댓글남기기