diff --git a/backend/src/main/java/corea/exception/ExceptionType.java b/backend/src/main/java/corea/exception/ExceptionType.java index d61877058..172d5aeb0 100644 --- a/backend/src/main/java/corea/exception/ExceptionType.java +++ b/backend/src/main/java/corea/exception/ExceptionType.java @@ -40,6 +40,7 @@ public enum ExceptionType { AUTOMATIC_UPDATE_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 방에 예약된 자동 업데이트 정보를 찾을 수 없습니다."), SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버에 문제가 발생했습니다."), + GITHUB_SERVER_ERROR(HttpStatus.SERVICE_UNAVAILABLE, "깃허브 서버가 원활하게 작동하지 않습니다."), GITHUB_AUTHORIZATION_ERROR(HttpStatus.SERVICE_UNAVAILABLE, "깃허브 인증 서버가 원활하게 작동하지 않습니다."), ; diff --git a/backend/src/main/java/corea/global/util/FutureUtil.java b/backend/src/main/java/corea/global/util/FutureUtil.java new file mode 100644 index 000000000..4b638c20e --- /dev/null +++ b/backend/src/main/java/corea/global/util/FutureUtil.java @@ -0,0 +1,11 @@ +package corea.global.util; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +public class FutureUtil { + + public static CompletableFuture supplyAsync(Supplier supplier) { + return CompletableFuture.supplyAsync(supplier); + } +} diff --git a/backend/src/main/java/corea/review/infrastructure/GithubReviewProvider.java b/backend/src/main/java/corea/review/infrastructure/GithubReviewProvider.java index 623b97522..d61922349 100644 --- a/backend/src/main/java/corea/review/infrastructure/GithubReviewProvider.java +++ b/backend/src/main/java/corea/review/infrastructure/GithubReviewProvider.java @@ -9,10 +9,13 @@ import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import static corea.global.util.FutureUtil.supplyAsync; + @Component @RequiredArgsConstructor public class GithubReviewProvider { @@ -35,27 +38,26 @@ public GithubPullRequestReviewInfo provideReviewInfo(String prLink) { } private GithubPullRequestReviewInfo getGithubPullRequestReviewInfo(String prLink) { - List reviews = getAllPullRequestReviews(prLink); - Map result = collectByGithubUserId(reviews); - - return new GithubPullRequestReviewInfo(result); + CompletableFuture> reviewFuture = supplyAsync(() -> reviewClient.getPullRequestReviews(prLink)); + CompletableFuture> commentFuture = supplyAsync(() -> commentClient.getPullRequestReviews(prLink)); + + return reviewFuture + .thenCombine(commentFuture, this::collectPullRequestReviews) + .exceptionally(e -> {throw new CoreaException(ExceptionType.GITHUB_SERVER_ERROR);}) + .thenApply(GithubPullRequestReviewInfo::new) + .join(); } - private List getAllPullRequestReviews(String prLink) { - List reviews = reviewClient.getPullRequestReviews(prLink); - List comments = commentClient.getPullRequestReviews(prLink); - - return Stream.concat(reviews.stream(), comments.stream()) - .toList(); + private Map collectPullRequestReviews(List reviews, List comments) { + return collectByGithubUserId(Stream.concat(reviews.stream(), comments.stream())); } - private Map collectByGithubUserId(List reviews) { - return reviews.stream() - .collect(Collectors.toMap( - GithubPullRequestReview::getGithubUserId, - Function.identity(), - (x, y) -> x - )); + private Map collectByGithubUserId(Stream reviews) { + return reviews.collect(Collectors.toMap( + GithubPullRequestReview::getGithubUserId, + Function.identity(), + (x, y) -> x + )); } private void validatePrLink(String prUrl) { @@ -75,7 +77,9 @@ private List extractPrLinkParts(String prUrl) { private boolean isInvalidGithubPrUrl(List prLinkParts) { return prLinkParts.size() != VALID_URL_SPLIT_COUNT || - !prLinkParts.get(DOMAIN_PREFIX_INDEX).contains(GITHUB_PREFIX) || - !prLinkParts.get(GITHUB_PULL_REQUEST_URL_INDEX).equals(GITHUB_PULL_REQUEST_DOMAIN); + !prLinkParts.get(DOMAIN_PREFIX_INDEX) + .contains(GITHUB_PREFIX) || + !prLinkParts.get(GITHUB_PULL_REQUEST_URL_INDEX) + .equals(GITHUB_PULL_REQUEST_DOMAIN); } }