Troubleshooting
Controller - 같은 엔드포인트를 파라미터에 따라 나눠쓰기
DuL2
2022. 8. 15. 15:16
Controller - 같은 엔드포인트를 파라미터에 따라 나눠쓰기
해결하고 싶었던 상황
위와 같은 조건으로 API를 작성하고 싶었기에 같은 엔드포인트인 `/api/posts`를 쓰지만 파라미터에 따라서 로직 처리를 분리하고 싶었다.
해결 및 시도 방법
1. 처음에는 Controller에서 같은 메소드로 받아 내부에서 genre 값이 null일 경우 Repository 메소드를 findAll로 처리하게끔 로직을 구성하려 했으나 같은 엔드포인트지만 용도가 다르므로 나누는 것이 좋다고 판단했다. 따라서 구글링을 시작했다.
public List<PostResponseDto> getPostListByGenre(Post.Genre genre) {
// 포스트 장르로 조회.
List<PostResponseDto> postResponseDtoList = null;
if (genre == null) {
postResponseDtoList = postRepository.findAll(Sort.by(Sort.Direction.DESC,"postId"))
.stream().map(post -> PostResponseDto.builder().post(post).build()).collect(Collectors.toList());
} else {
postResponseDtoList = postRepository.findAllByGenreOrderByPostIdDesc(genre).orElseThrow(() -> new InvalidValueException(ErrorCode.POST_NOT_FOUND))
.stream().map(post -> PostResponseDto.builder().post(post).build()).collect(Collectors.toList());
}
return postResponseDtoList;
2. 구글링 결과 GetMapping 옵션에 params 를 사용하여 들어오는 파라미터에 따라 분기가 가능했다.
@GetMapping
public ResponseEntity<ResponseDto> getPostList() {
return new ResponseEntity<>(
ResponseDto.success(postService.getPostList()), HttpStatus.valueOf(HttpStatus.OK.value()));
}
@GetMapping(params = "genre")
public ResponseEntity<ResponseDto> getPostListByGenre(@RequestParam Post.Genre genre) {
return new ResponseEntity<>(
ResponseDto.success(postService.getPostListByGenre(genre)), HttpStatus.valueOf(HttpStatus.OK.value()));
}
회고
어려운 문제 해결은 아니었지만 params에 대한 옵션을 잊지 않고 기억하기 위해서 글 작성을 하였다.
기능의 목적이 다르기 때문에 메소드를 분리하는 것이 맞다고 판단하였지만 이런식으로 분리하게 되면 너무 많은 메소드가 생기지는 않을까 걱정이 된다.