쿼리 스트링 선택적으로 받기 (issue-tracker 프로젝트)

yeon·2021년 8월 24일
0

issue-tracker 쿼리스트링 줄이기

조건에 맞게 필터링해서 결과를 리스트로 반환해주는 것을 구현하는 상황이다.
항상 모든 조건의 파라미터에 값을 줄 필요가 없어서 파라미터를 선택적으로 받는 방법을 찾아보았다.

@RequestParam 의 속성에서 required=false로 해주면 선택적으로 파라미터를 받을 수 있다. 그런데 나는 여전히 org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Parameter conditions "is_open, filter, assignee, label, milestone, writer" not met for actual request parameters 에러가 발생한다.

// IssueController  @RequestMappint("/api/issues")

@GetMapping
public ApiResult<List<IssueResponse>> showAllIssues() {
    return ApiResult.success(issueService.getAllIssueResponses());
}

@LoginRequired
@GetMapping(params = {"is_open", "filter", "assignee", "label", "milestone", "writer"})
public ApiResult<List<IssueResponse>> searchIssues(@UserId Long userId,
                                                   @RequestParam(value = "is_open", required = false) Boolean isOpen,
                                                   @RequestParam(required = false) String filter,
                                                   @RequestParam(value = "assignee", required = false) Long assigneeId,
                                                   @RequestParam(value = "label", required = false) Long labelId,
                                                   @RequestParam(value = "milestone", required = false) Long milestoneId,
                                                   @RequestParam(value = "writer", required = false) Long writerId) {

    List<IssueResponse> issueResponses = issueService.getFilteredIssues(userId, isOpen, filter, assigneeId, labelId, milestoneId, writerId);
    return ApiResult.success(issueResponses);
}

찾아보니 저 searchIssues 메서드에서 GetMapping 어노테이션 속성에 params가 원인인 듯 하다.

params 속성으로 파라미터들을 지정한 이유는 이슈 전체 조회하는 기능과 필터링 조회 하는 기능의 url 경로가 동일하고 둘 다 GET으로 매핑되어 있어서이다. (params 속성을 주지 않으면 에러가 발생한 상황)
하지만 지금 쿼리 파라미터를 선택적으로 받아야하므로 url 경로를 다르게 해주고 searchIssues 메서드의 @GetMapping의 params 속성도 없어주고 다시 시도해보니 쿼리 스트링을 {{url}}/api/issues/is_open=true 이런식으로 일부만 받아도 잘 동작한다.


@GetMapping
public ApiResult<List<IssueResponse>> showAllIssues() {
		return ApiResult.success(issueService.getAllIssueResponses());
}

@LoginRequired
@GetMapping("/filtered")
public ApiResult<List<IssueResponse>> searchIssues(@UserId Long userId,
                                                   @RequestParam(value = "is_open", required = false) Boolean isOpen,
                                                   @RequestParam(required = false) String filter,
                                                   @RequestParam(value = "assignee", required = false) Long assigneeId,
                                                   @RequestParam(value = "label", required = false) Long labelId,
                                                   @RequestParam(value = "milestone", required = false) Long milestoneId,
                                                   @RequestParam(value = "writer", required = false) Long writerId) {

    List<IssueResponse> issueResponses = issueService.getFilteredIssues(userId, isOpen, filter, assigneeId, labelId, milestoneId, writerId);
    return ApiResult.success(issueResponses);
}

참고: https://devbox.tistory.com/entry/Spring-컨트롤러-메서드의-파라미터-타입

https://bum752.github.io/posts/스프링에서-같은-엔드포인트에-쿼리-파라미터가-다른-컨트롤러-메소드-구성하기/

0개의 댓글