항해99 TIL 4주차 - 27

강민범·2023년 11월 18일
0

강의 사이트를 개발하면서 맡은 기능 중 카테고리별 강의 목록을 조회하는 기능이 있었다. 조건은 아래와 같다.

  • 선택한 카테고리에 포함된 강의를 조회할 수 있습니다.
    • 모든 사용자가 강의를 조회할 수 있습니다.
    • 강사의 정보는 제외됩니다.
  • 조회된 강의 목록은 선택한 기준에 의해 정렬됩니다.
    • 강의명, 가격, 등록일 중 기준을 선택할 수 있습니다.
    • 내림차순, 오름차순을 선택할 수 있습니다.

이 조건들을 보고 @RequestParam으로 3개의 파라미터를 받아야겠다 생각해서

    public ResponseEntity<List<LectureResponseDto>> getLectureByCategory(@RequestParam("category") LectureCategoryEnum category,
                                                                         @RequestParam("sort") String sort,
                                                                         @RequestParam("orderBy") String orderBy){
        return new ResponseEntity<>(lectureService.getLectureByCategory(category, sort, orderBy), HttpStatus.OK);
    }

Controller를 구현하고

 public List<LectureResponseDto> getLectureByCategory(LectureCategoryEnum category, String sort,
                                                         String orderBy) {
        List<Lecture> lectures = lectureRepository.findByCategory(category);
        if (Objects.equals(sort, "title") && Objects.equals(orderBy, "Desc")) {
            lectures = lectureRepository.findLectureByOrderByTitleDesc();
        } else if (Objects.equals(sort, "title") && Objects.equals(orderBy, "Asc")) {
            lectures = lectureRepository.findLectureByOrderByTitleAsc();
        } else if (Objects.equals(sort, "price") && Objects.equals(orderBy, "Desc")) {
            lectures = lectureRepository.findLectureByOrderByPriceDesc();
        } else if (Objects.equals(sort, "price") && Objects.equals(orderBy, "Asc")) {
            lectures = lectureRepository.findLectureByOrderByPriceAsc();
        } else if (Objects.equals(sort, "regDate") && Objects.equals(orderBy, "Desc")) {
            lectures = lectureRepository.findLectureByOrderByRegDateDesc();
        } else if (Objects.equals(sort, "regDate") && Objects.equals(orderBy, "Asc")) {
            lectures = lectureRepository.findLectureByOrderByRegDateAsc();
        }
        return lectures.stream().map(LectureResponseDto::new).collect(Collectors.toList());
    }

Service에서 이렇게 구현하였다.
내가 생각해도 너무 좋지 않은 코드이다. 분명히 이것보다 좋은 방법이 있을거라 생각이 들었지만 그 방법을 찾지못해 일단 과제를 완성해야하기때문에 이렇게 구현하였다.
그 후 나와 같은 기능을 구현한 사람들의 코드를 확인하였다.

    public List<LecturePureResponseDto> searchByCategory(
            @PathVariable LectureCategoryEnum category,
            @RequestParam("sortBy") String sortBy,
            @RequestParam("isAsc") boolean isAsc
    ) {
        return lectureService.searchByCategory(category, sortBy, isAsc);
    }

    @Transactional(readOnly = true)
    public List<LecturePureResponseDto> searchByCategory(LectureCategoryEnum category, String sortBy, boolean isAsc) {
        // 정렬
        Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
        Sort sort = Sort.by(direction, sortBy); // 방향, 속성(강의명, 가격, 등록일)

        List<Lecture> lectureList = lectureRepository.findByCategory(category, sort); 
        return lectureList.stream().map(LecturePureResponseDto::new).toList();
    }

위와 같이 Sort.Direction과 Sort를 이용해서 입력 받은 값을 저장해서 사용하면 간단하게 풀 수 있는 문제였다.

profile
개발자 성장일기

0개의 댓글