강의 사이트를 개발하면서 맡은 기능 중 카테고리별 강의 목록을 조회하는 기능이 있었다. 조건은 아래와 같다.
카테고리
에 포함된 강의를 조회할 수 있습니다.강의명
, 가격
, 등록일
중 기준을 선택할 수 있습니다.이 조건들을 보고 @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를 이용해서 입력 받은 값을 저장해서 사용하면 간단하게 풀 수 있는 문제였다.