From be8f2f18ed26ebbfbc1c5362503e28d97ef5b980 Mon Sep 17 00:00:00 2001 From: Yeongseo Na Date: Wed, 16 Oct 2024 10:59:59 +0900 Subject: [PATCH] =?UTF-8?q?[BE]=20fix:=20=EC=A7=88=EB=AC=B8=EC=9D=84=20pos?= =?UTF-8?q?ition=20=EC=88=9C=EC=84=9C=EB=8C=80=EB=A1=9C=20=EB=82=B4?= =?UTF-8?q?=EB=A0=A4=EC=A3=BC=EB=8F=84=EB=A1=9D=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#834)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 질문을 순서대로 내려주는 로직 수정 AS-IS: Question을 position으로 정렬한 값을 받아서 Map> 으로 만든 다음, mapper 에 전달했다. 이때, map 은 순서를 보장하지 않으므로 mapper 에서 position 순서대로 내려지지 않았다. TO-BE: 쿼리에서 정렬하지 않고, mapper에서 정렬하도록 바꿔주었다. * Revert "fix: 질문을 순서대로 내려주는 로직 수정" This reverts commit 4ff8cc37e079b5aaa2d038ffa884d94fbefecbdd. * fix: 질문을 순서대로 내려주는 로직 수정 AS-IS: Question을 position으로 정렬한 값을 받아서 Map> 으로 만든 다음, mapper 에 전달했다. 이때, map 은 순서를 보장하지 않으므로 mapper 에서 position 순서대로 내려지지 않았다. TO-BE: LinkedHashMap 을 사용해서 순서를 보장한다. * refactor: 가독성 개선 * refactor: 질문 순서 보장 로직 수정 - 반환값도 LinkedHashMap 이 되도록 * fix: 컴파일 에러 해결 --- .../service/ReviewGatheredLookupService.java | 23 +++++++-------- .../ReviewGatheredLookupServiceTest.java | 29 +++++++++++++++++-- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java b/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java index e8de2aee8..a03f2aca2 100644 --- a/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java +++ b/backend/src/main/java/reviewme/review/service/ReviewGatheredLookupService.java @@ -1,8 +1,8 @@ package reviewme.review.service; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.function.Function; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -44,21 +44,18 @@ private Section getSectionOrThrow(long sectionId, ReviewGroup reviewGroup) { } private Map> getQuestionAnswers(Section section, ReviewGroup reviewGroup) { - Map questionIdQuestion = questionRepository - .findAllBySectionIdOrderByPosition(section.getId()) - .stream() - .collect(Collectors.toMap(Question::getId, Function.identity())); + List questions = questionRepository.findAllBySectionIdOrderByPosition(section.getId()); + Map questionIdQuestion = new LinkedHashMap<>(); + questions.forEach(question -> questionIdQuestion.put(question.getId(), question)); - Map> questionIdAnswers = answerRepository - .findReceivedAnswersByQuestionIds(reviewGroup.getId(), questionIdQuestion.keySet(), - ANSWER_RESPONSE_LIMIT) + Map> questionIdAnswers = answerRepository.findReceivedAnswersByQuestionIds( + reviewGroup.getId(), questionIdQuestion.keySet(), ANSWER_RESPONSE_LIMIT) .stream() .collect(Collectors.groupingBy(Answer::getQuestionId)); - return questionIdQuestion.values().stream() - .collect(Collectors.toMap( - Function.identity(), - question -> questionIdAnswers.getOrDefault(question.getId(), List.of()) - )); + Map> questionAnswers = new LinkedHashMap<>(); + questionIdQuestion.values().forEach( + question -> questionAnswers.put(question, questionIdAnswers.getOrDefault(question.getId(), List.of()))); + return questionAnswers; } } diff --git a/backend/src/test/java/reviewme/review/service/ReviewGatheredLookupServiceTest.java b/backend/src/test/java/reviewme/review/service/ReviewGatheredLookupServiceTest.java index 409ac1210..141992950 100644 --- a/backend/src/test/java/reviewme/review/service/ReviewGatheredLookupServiceTest.java +++ b/backend/src/test/java/reviewme/review/service/ReviewGatheredLookupServiceTest.java @@ -22,6 +22,7 @@ import reviewme.question.domain.OptionItem; import reviewme.question.domain.OptionType; import reviewme.question.domain.Question; +import reviewme.question.domain.QuestionType; import reviewme.question.repository.OptionGroupRepository; import reviewme.question.repository.OptionItemRepository; import reviewme.question.repository.QuestionRepository; @@ -69,13 +70,11 @@ class ReviewGatheredLookupServiceTest { @Autowired private ReviewGatheredLookupService reviewLookupService; - private String reviewRequestCode; private ReviewGroup reviewGroup; @BeforeEach void saveReviewGroup() { - reviewRequestCode = "1111"; - reviewGroup = reviewGroupRepository.save(리뷰_그룹(reviewRequestCode, "2222")); + reviewGroup = reviewGroupRepository.save(리뷰_그룹("1111", "2222")); } @Nested @@ -401,4 +400,28 @@ class GatherOptionAnswerByQuestionTest { // then assertThat(actual.reviews()).hasSize(1); } + + @Test + void 질문을_position순서대로_반환한다() { + // given + Question question1 = questionRepository.save(new Question(false, QuestionType.TEXT, "질문1", null, 3)); + Question question2 = questionRepository.save(new Question(false, QuestionType.TEXT, "질문2", null, 4)); + Question question3 = questionRepository.save(new Question(false, QuestionType.TEXT, "질문3", null, 1)); + Question question4 = questionRepository.save(new Question(false, QuestionType.TEXT, "질문4", null, 2)); + + Section section1 = sectionRepository.save(항상_보이는_섹션( + List.of(question1.getId(), question2.getId(), question3.getId(), question4.getId()))); + Template template = templateRepository.save(템플릿(List.of(section1.getId()))); + + // when + ReviewsGatheredBySectionResponse actual = reviewLookupService.getReceivedReviewsBySectionId( + reviewGroup, section1.getId()); + + // then + assertThat(actual.reviews()) + .extracting(ReviewsGatheredByQuestionResponse::question) + .extracting(SimpleQuestionResponse::name) + .containsExactly(question3.getContent(), question4.getContent(), + question1.getContent(), question2.getContent()); + } }