이번에는 영화 데이터의 조회 기능 API들을 개발해보았다.
전체 조회(페이지네이션을 이용한), 장르별 조회, 상세조회(단건 조회)
세가지 조회 api로 나누어서 개발을 하게 되었다.
페이지네이션 조회
장르별 조회
상세 조회
페이지네이션 조회
장르별 조회
상세 조회
I. 페이지네이션 조회
@GetMapping("/api/movie/getAllMovieInfo")
public ResponseEntity<ApiResponse<?>> getAllMovieInfo(@RequestParam(required = false, defaultValue = "0", value = "page") int pageNum,
@RequestParam(required = false, defaultValue = "5", value = "pageSize") int pageSize,
@RequestParam(required = false, defaultValue = "createdAt", value = "criteria") String criteria){
try {
List<Movie> movies = movieService.getMovies(pageNum, pageSize, criteria);
return ResponseEntity.ok(new ApiResponse<>(1, "영화 목록 조회 성공", movies));
}catch (RuntimeException e){
return ResponseEntity.ok(new ApiResponse<>(1, "영화 정보 조회 실패", null));
}
}
몇번째 페이지인지, 페이지당 데이터의 개수, 정렬기준 세가지 파라미터를 넘겨받아 영화들이 있다면 영화들의 리스트를 반환하고 없다면 실패 메세지를 반환하도록 구현하였다.
II. 장르별 조회
@GetMapping("/api/movie/getMovieInfoByGenre")
public ResponseEntity<ApiResponse<?>> getMovieInfoByGenre(@RequestParam String genre){
try {
List<Movie> movies = movieService.getMoviesByGenre(genre);
return ResponseEntity.ok(new ApiResponse<>(1, "영화 장르별 조회 성공", movies));
} catch (NoSuchElementException e){
return ResponseEntity.ok(new ApiResponse<>(0, "영화 조회 실패", genre));
}
}
III. 상세 조회
@GetMapping("/api/movie/getDetailMovieInfo/{movieId}")
public ResponseEntity<ApiResponse<?>> getDetailMovieInfo(@PathVariable Long movieId){
try {
Movie movie = movieService.getMovie(movieId);
return ResponseEntity.ok(new ApiResponse<>(1, "영화 상세정보 조회 성공", movie));
}catch (NoSuchElementException e){
return ResponseEntity.ok(new ApiResponse<>(0, "영화 상세정보 조회 실패", movieId));
}
}
public List<Movie> getMovies(int pageNum, int pageSize, String criteria) {
Pageable pageable = PageRequest.of(pageNum, pageSize, Sort.by(Sort.Direction.DESC, criteria));
Page<Movie> page = movieRepository.findAll(pageable);
return page.getContent();
}
public Movie getMovie(Long movieId) throws NoSuchElementException{
Optional<Movie> optionalMovie = movieRepository.findById(movieId);
return optionalMovie.orElseThrow(NoSuchElementException::new);
}
public List<Movie> getMoviesByGenre(String genre) {
List<Movie> movies = movieRepository.findByGenreContaining(genre);
if (movies.isEmpty()) {
throw new NoSuchElementException();
}
return movies;
}
@Repository
public interface MovieRepository extends JpaRepository<Movie, Long> {
Page<Movie> findAll(Pageable pageable);
List<Movie> findByGenreContaining(String genre);
}
단순 get, read들이라 대부분 구현에는 어려움이 없었다
단지 서비스 레이어에서 if문을 통해서 에러를 검출하는게 맞는지 고민이 되는 상황이다.
팀원분과 약속한 완료 날짜를 지키기 위해서 일단은 위의 구현대로 적용을 하고
후에 리팩토링 기간에 서로 코드리뷰를 하며 코드를 수정하기로 했다.