From c0624d046e8b44962d9ab8badde7bb82e04f4811 Mon Sep 17 00:00:00 2001 From: syyling Date: Tue, 12 Mar 2024 20:38:30 +0900 Subject: [PATCH] =?UTF-8?q?[feat]=20=EC=98=81=ED=99=94=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=ED=9B=84=20=EC=83=81=EC=84=B8=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/MovieResponse.java | 7 +- .../movie/application/mapper/MovieMapper.java | 2 + .../application/service/MovieGetService.java | 116 ++---------------- .../domain/repository/MovieRepository.java | 2 + .../domain/service/MovieQueryService.java | 4 + .../movie/infra/MovieSearchService.java | 110 +++++++++++++++++ .../movie/infra/TmdbComponent.java | 16 +++ .../movie/presentation/MovieController.java | 6 +- 8 files changed, 150 insertions(+), 113 deletions(-) create mode 100644 src/main/java/com/mookive/mookive_backend/movie/infra/MovieSearchService.java create mode 100644 src/main/java/com/mookive/mookive_backend/movie/infra/TmdbComponent.java diff --git a/src/main/java/com/mookive/mookive_backend/movie/application/dto/response/MovieResponse.java b/src/main/java/com/mookive/mookive_backend/movie/application/dto/response/MovieResponse.java index a0c58a4..3b88d8e 100644 --- a/src/main/java/com/mookive/mookive_backend/movie/application/dto/response/MovieResponse.java +++ b/src/main/java/com/mookive/mookive_backend/movie/application/dto/response/MovieResponse.java @@ -9,19 +9,24 @@ public class MovieResponse { @Getter @NoArgsConstructor public static class MovieDetailResponse { + private String title; private String director; private String genre; private String year; private String plot; + private String poster; + private String nation; @Builder - public MovieDetailResponse(String title, String director, String genre, String year, String plot) { + public MovieDetailResponse(String title, String director, String genre, String year, String plot, String poster, String nation) { this.title = title; this.director = director; this.genre = genre; this.year = year; this.plot = plot; + this.poster = poster; + this.nation = nation; } } } diff --git a/src/main/java/com/mookive/mookive_backend/movie/application/mapper/MovieMapper.java b/src/main/java/com/mookive/mookive_backend/movie/application/mapper/MovieMapper.java index 3b0674a..9c8b45b 100644 --- a/src/main/java/com/mookive/mookive_backend/movie/application/mapper/MovieMapper.java +++ b/src/main/java/com/mookive/mookive_backend/movie/application/mapper/MovieMapper.java @@ -12,6 +12,8 @@ public static MovieResponse.MovieDetailResponse mapToMovieDetailResponse(Movie m .genre(movie.getGenre()) .year(movie.getYear()) .plot(movie.getPlot()) + .nation(movie.getNation()) + .poster(movie.getPoster()) .build(); } } diff --git a/src/main/java/com/mookive/mookive_backend/movie/application/service/MovieGetService.java b/src/main/java/com/mookive/mookive_backend/movie/application/service/MovieGetService.java index b08b816..0a04f63 100644 --- a/src/main/java/com/mookive/mookive_backend/movie/application/service/MovieGetService.java +++ b/src/main/java/com/mookive/mookive_backend/movie/application/service/MovieGetService.java @@ -1,18 +1,14 @@ package com.mookive.mookive_backend.movie.application.service; import com.mookive.mookive_backend.movie.application.dto.response.MovieResponse; -import com.mookive.mookive_backend.movie.application.infra.KmdbComponent; -import com.mookive.mookive_backend.movie.application.infra.KoficComponent; import com.mookive.mookive_backend.movie.application.mapper.MovieMapper; import com.mookive.mookive_backend.movie.domain.entity.Movie; import com.mookive.mookive_backend.movie.domain.service.MovieQueryService; import com.mookive.mookive_backend.movie.domain.service.MovieSaveService; -import lombok.*; +import com.mookive.mookive_backend.movie.infra.MovieSearchService; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.json.JSONArray; import org.json.JSONException; -import org.json.JSONObject; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service @@ -21,113 +17,15 @@ public class MovieGetService { private final MovieQueryService movieQueryService; + private final MovieSearchService movieSearchService; private final MovieSaveService movieSaveService; - private final KmdbComponent kmdbComponent; - private final KoficComponent koficComponent; - @Value("${kmdb.service-key}") - private String kmdbServiceKey; - - @Value("${kmdb.collection}") - private String collection; - - @Value("${kofic.service-key}") - private String koficKey; - - /** - TODO: 예외처리 - */ - public MovieResponse.MovieDetailResponse getMovieInfo(String title) throws JSONException { - Movie movie = movieQueryService.findByTitle(title); + public MovieResponse.MovieDetailResponse getMovieDetail(String tmdbId) throws JSONException { + Movie movie = movieQueryService.findByTmdbId(tmdbId); if(movie == null) { - KmdbResponse kmdbResponse = getKmdbResponse(title); - KoficResponse koficResponse = getKoficResponse(title); - movie = Movie.builder() - .title(koficResponse.getTitle()) - .director(kmdbResponse.getDirector()) - .genre(kmdbResponse.getGenre()) - .plot(kmdbResponse.getPlot()) - .year(koficResponse.getYear()) - .build(); - movieSaveService.saveMovie(movie); + movie = movieSearchService.searchMovie(tmdbId); + movieSaveService.save(movie); } return MovieMapper.mapToMovieDetailResponse(movie); } - - private JSONObject getDataResponse(String title) { - JSONObject json = new JSONObject(kmdbComponent.findMovieByTitle(collection, kmdbServiceKey, title, "N")); - JSONArray dataArray = (JSONArray) json.get("Data"); - JSONObject dataObject = (JSONObject) dataArray.get(0); - JSONArray dataResult = (JSONArray) dataObject.get("Result"); - return (JSONObject) dataResult.get(0); - } - - private KmdbResponse getKmdbResponse(String title) { - JSONObject dataObject = getDataResponse(title); - System.out.println(dataObject.toString()); - Object genre = dataObject.get("genre"); - Object director = getDirector(dataObject); - Object plot = getPlotText(dataObject); - return KmdbResponse.builder() - .director((String) director) - .genre((String) genre) - .plot((String) plot) - .build(); - } - - private static Object getPlotText(JSONObject dataObject) { - JSONObject plotObject = (JSONObject) dataObject.get("plots"); - JSONArray plotArray = (JSONArray) plotObject.get("plot"); - JSONObject plotData = (JSONObject) plotArray.get(0); - return plotData.get("plotText"); - } - - private static Object getDirector(JSONObject dataObject) { - JSONObject directorObject = (JSONObject) dataObject.get("directors"); - JSONArray directorArray = (JSONArray) directorObject.get("director"); - JSONObject directorData = (JSONObject) directorArray.get(0); - return directorData.get("directorNm"); - } - - private KoficResponse getKoficResponse(String movieTitle) { - JSONObject json = new JSONObject(koficComponent.findMovieByTitle(koficKey, movieTitle)); - JSONObject jsonObject = (JSONObject) json.get("movieListResult"); - JSONArray dataResult = (JSONArray) jsonObject.get("movieList"); - JSONObject movie = (JSONObject) dataResult.get(0); //결과값이 여러개일 때 문제 - String title = movie.get("movieNm").toString(); - System.out.println(title); - String year = movie.get("openDt").toString().substring(0, 4); - return KoficResponse.builder() - .title(title) - .year(year) - .build(); - } - - @Getter - @NoArgsConstructor(access = AccessLevel.PROTECTED) - private static class KmdbResponse { - private String director; - private String genre; - private String plot; - - @Builder - public KmdbResponse(String director, String genre, String plot) { - this.director = director; - this.genre = genre; - this.plot = plot; - } - } - - @Getter - @NoArgsConstructor(access = AccessLevel.PROTECTED) - private static class KoficResponse { - private String title; - private String year; - - @Builder - public KoficResponse(String title, String year) { - this.title = title; - this.year = year; - } - } } diff --git a/src/main/java/com/mookive/mookive_backend/movie/domain/repository/MovieRepository.java b/src/main/java/com/mookive/mookive_backend/movie/domain/repository/MovieRepository.java index f9972b3..b7ca148 100644 --- a/src/main/java/com/mookive/mookive_backend/movie/domain/repository/MovieRepository.java +++ b/src/main/java/com/mookive/mookive_backend/movie/domain/repository/MovieRepository.java @@ -6,4 +6,6 @@ public interface MovieRepository extends JpaRepository { Movie findByTitle(String title); + + Movie findByTmdbId(String tmdbId); } diff --git a/src/main/java/com/mookive/mookive_backend/movie/domain/service/MovieQueryService.java b/src/main/java/com/mookive/mookive_backend/movie/domain/service/MovieQueryService.java index f5920fc..2560212 100644 --- a/src/main/java/com/mookive/mookive_backend/movie/domain/service/MovieQueryService.java +++ b/src/main/java/com/mookive/mookive_backend/movie/domain/service/MovieQueryService.java @@ -19,4 +19,8 @@ public Movie findById(Long id) { return movieRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("Movie not found")); } + + public Movie findByTmdbId(String tmdbId) { + return movieRepository.findByTmdbId(tmdbId); + } } diff --git a/src/main/java/com/mookive/mookive_backend/movie/infra/MovieSearchService.java b/src/main/java/com/mookive/mookive_backend/movie/infra/MovieSearchService.java new file mode 100644 index 0000000..ad17214 --- /dev/null +++ b/src/main/java/com/mookive/mookive_backend/movie/infra/MovieSearchService.java @@ -0,0 +1,110 @@ +package com.mookive.mookive_backend.movie.infra; + +import com.mookive.mookive_backend.movie.domain.entity.Movie; +import lombok.*; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MovieSearchService { + + private final KoficComponent koficComponent; + private final TmdbComponent tmdbComponent; + + + @Value("${kofic.service-key}") + private String koficKey; + + public Movie searchMovie(String tmdbId) { + TmdbResponse tmdbResponse = getTmdbResponse(tmdbId); + KoficResponse koficResponse = getKoficResponse(tmdbResponse.getTitle(), tmdbResponse.getYear()); + return Movie.builder() + .tmdbId(tmdbId) + .title(tmdbResponse.getTitle()) + .year(tmdbResponse.getYear()) + .genre(tmdbResponse.getGenre()) + .plot(tmdbResponse.getPlot()) + .poster(tmdbResponse.getPoster()) + .nation(koficResponse.getNation()) + .director(koficResponse.getDirector()) + .build(); + } + + private TmdbResponse getTmdbResponse(String tmdbMovieId) { + JSONObject jsonObject = new JSONObject(tmdbComponent.findMovieById(tmdbMovieId, "ko")); + Object title = jsonObject.get("title"); + JSONArray genres = (JSONArray) jsonObject.get("genres"); + StringBuilder genre = new StringBuilder(); + for(int i=0; i<2; i++) { + JSONObject genreObject = (JSONObject) genres.get(i); + genre.append(genreObject.get("name")); + if(i==0) genre.append(","); + } + Object plot = jsonObject.get("overview"); + Object poster = "https://image.tmdb.org/t/p/original" + jsonObject.get("poster_path"); + Object year = jsonObject.get("release_date").toString().substring(0, 4); + + return TmdbResponse.builder() + .title(title.toString()) + .year(year.toString()) + .genre(genre.toString()) + .plot(plot.toString()) + .poster(poster.toString()) + .build(); + } + + private KoficResponse getKoficResponse(String title, String year) { + JSONObject apiResponse = new JSONObject(koficComponent.findMovieByTitleAndYear(koficKey, title, year)); + JSONObject jsonObject = (JSONObject) apiResponse.get("movieListResult"); + JSONArray dataResult = (JSONArray) jsonObject.get("movieList"); + JSONObject movie = (JSONObject) dataResult.get(0); + String nation = movie.get("nationAlt").toString(); + JSONArray directors = (JSONArray) movie.get("directors"); + StringBuilder director = new StringBuilder(); + for(int i=0; i