Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] refactor: 리뷰 상세 조회 dto 개선 #847

Open
wants to merge 61 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
30340cb
refactor: response 불필요한 뎁스 및 항목 제거
Kimprodp Oct 12, 2024
79e74d6
refactor: ReviewDetailMapper response 수정 사항 반영
Kimprodp Oct 12, 2024
2971e1c
test: 테스트에 수정 사항 반영
Kimprodp Oct 12, 2024
0d5b242
refactor: dto 필드명 변경
Kimprodp Oct 14, 2024
14f6846
docs: 리뷰 상세조회 api 문서 수정
Kimprodp Oct 14, 2024
64359f5
design: 아코디언 header의 모든 영역을 클릭 가능하도록 수정 (#939)
chysis Oct 25, 2024
6142cbd
[All] README 업데이트 (#927)
chysis Oct 25, 2024
afa104f
[BE] cd-fix: 배포 시 새로운 이미지를 pull하도록 수정 (#947)
nayonsoso Oct 25, 2024
253ec8a
chore: 도커 태그 지정 방식 변경 (#948)
nayonsoso Oct 25, 2024
af5c020
[BE] 예외의 잘못된 로그레벨 수정 및 사용하지 않는 예외 제거 (#951)
skylar1220 Oct 27, 2024
28ee86d
[BE] docs: 리드미에 인프라 구조 추가 (#952)
donghoony Oct 31, 2024
cfdaeac
[BE] Question 패키지를 Template 하위로 이동 (#956)
donghoony Nov 5, 2024
7cd031c
[All] fix: `[Release]` PR 머릿말 디스코드 알림 처리 (#940)
donghoony Nov 10, 2024
11a2b05
[BE] refactor: Config 패키지 분리, 스타일 적용 (#957)
donghoony Nov 10, 2024
55db0f6
[All] chore: add CODEOWNERS (#959)
donghoony Nov 12, 2024
8858e02
[BE] feat: 하이라이트 벌크 삽입 추가 (#961)
donghoony Nov 17, 2024
9b59f8d
[BE] refactor: 하이라이트 매핑 로직 간소화 (#962)
donghoony Nov 17, 2024
9e017a1
[BE] refactor/fix: 하이라이트 검증 객체 책임 이동, 하이라이트 삭제 로직 수정 (#966)
donghoony Nov 17, 2024
1b87993
[All] fix: Release PR 코드리뷰 시 디스코드 알림 (#969)
donghoony Nov 18, 2024
90646b6
[FE] fix : 리뷰 모아보기 쿼리 캐시로 인한 변경된 형광펜 데이터 반영 오류 수정 (#976)
BadaHertz52 Nov 19, 2024
418382c
[BE] refactor: 2차 정렬 기준 추가 (#972)
Kimprodp Nov 20, 2024
fa7d3d3
[BE] feat: Spring Cache 적용 (#792)
donghoony Nov 20, 2024
0522c5f
[BE] refactor: question 타입과 답변 내용 일치 검증 및 매핑 로직 개선 (#958)
nayonsoso Nov 22, 2024
1c99dd8
[BE] refactor: 요청 제한 관련 코드 제거 (#983)
nayonsoso Nov 28, 2024
c07afbb
[BE] fix: redis 의존성 제거 (#985)
donghoony Nov 29, 2024
8908069
cd: develop 오라클 인스턴스에서 실행하도록 수정 (#984)
donghoony Nov 30, 2024
6e7a72a
[BE] refactor: port config 파일 경로 이동
nayonsoso Dec 2, 2024
35d7530
chore: prod cd에 사용될 runner 변경 (#992)
nayonsoso Dec 4, 2024
b7b88ac
chore: release cd를 돌릴 수 있는 브랜치 한정 (#1004)
nayonsoso Dec 15, 2024
6b8d313
[BE] refactor: 테스트 환경에서 캐싱을 사용하도록 하여 환경 통일 (#1007)
donghoony Dec 17, 2024
1306c7b
refactor: review group에서 사용되는 예외 패키지 이동 (#999)
skylar1220 Dec 18, 2024
788dc65
[BE] fix: 잘못된 캐시 키 정정 (#1003)
nayonsoso Dec 18, 2024
69b507a
[BE] chore: H2를 테스트에서만 사용하도록 설정 (#1010)
donghoony Dec 18, 2024
77d0863
[BE] refactor: TemplateMapper와 ReviewGroup 결합 느슨하게 수정 (#1011)
donghoony Dec 28, 2024
e6292ec
[BE] refactor: DTO에서 Enum 사용하도록 수정 (#1012)
donghoony Dec 28, 2024
9ef8b71
chore: 타입, 인터페이스의 이름을 PascalCase로 강제하는 eslint 규칙 추가 (#1034)
ImxYJL Jan 4, 2025
4d0fe93
feat : ErrorSuspense에 fallback 수정 (#1027)
BadaHertz52 Jan 5, 2025
67c887c
[FE] feat : 받은, 작성한 리뷰 없을 때 보여주는 돋보기 컴포넌트 생성 (#1024)
BadaHertz52 Jan 5, 2025
8eca61a
[FE] feat : 회원/비회원 리뷰 링크 생성 폼 (#1031)
BadaHertz52 Jan 5, 2025
8107b1d
[FE] feat: 사용자 프로필 정보 및 프로필 탭 구현 (#1035)
chysis Jan 7, 2025
62fb095
[FE] refactor: ReviewCard에서 강점 키워드를 표시하는 ReviewKeyword 컴포넌트 분리 및 불필요한…
soosoo22 Jan 7, 2025
b033992
[FE] feat: 뒤로 가기 버튼 구현 (#1040)
chysis Jan 7, 2025
eaad162
[FE] feat: 소셜 연동 로그인 버튼 및 로그인 요청 모달 (#1022)
ImxYJL Jan 9, 2025
2f94d3e
[FE] feat: 리뷰 링크 관리 페이지와 라우터 설정 추가 (#1032)
soosoo22 Jan 10, 2025
08a5caf
[BE] docs: GitHub 연동, 자신이 만든 리뷰 그룹 목록 조회 API 문서 작성 (#1014)
donghoony Jan 12, 2025
29b65c9
[BE] docs: 작성한 리뷰 목록 조회, 회원용 리뷰 그룹 생성, 리뷰 그룹 정보, 리뷰 등록 API 문서를 작성한다. …
Kimprodp Jan 14, 2025
ca790e4
ci : 환경변수 추가, 프리플라이트 추가 (#1052)
BadaHertz52 Jan 15, 2025
9e09b04
[FE] 작성한 리뷰를 확인할 수 있는 반응형 레이아웃 (#1038)
ImxYJL Jan 15, 2025
7b0c865
[FE] feat: NavigationTab 컴포넌트 구현 (#1037)
soosoo22 Jan 15, 2025
4887154
[FE] feat : 이미지 스켈레톤 적용 (#1055)
BadaHertz52 Jan 16, 2025
64fbf28
[FE] refactor : 리뷰 링크 관련 컴포넌트,훅,유틸 위치 변경 (#1057)
BadaHertz52 Jan 18, 2025
1572492
[BE] chore: profile에 따라 다른 H2 의존성 옵션 추가 (#1047)
nayonsoso Jan 21, 2025
cc8557f
[BE] refactor: Template 연관관계 재설정 (#1042)
donghoony Jan 22, 2025
b1c9169
[BE] fix: Flyway 스크립트 DDL 오류 수정 (#1071)
donghoony Jan 22, 2025
d02e40d
refactor: response 불필요한 뎁스 및 항목 제거
Kimprodp Oct 12, 2024
2077d52
refactor: ReviewDetailMapper response 수정 사항 반영
Kimprodp Oct 12, 2024
2708cd0
test: 테스트에 수정 사항 반영
Kimprodp Oct 12, 2024
c07d2c7
refactor: dto 필드명 변경
Kimprodp Oct 14, 2024
ccd90bf
docs: 리뷰 상세조회 api 문서 수정
Kimprodp Oct 14, 2024
758e696
refactor: 변경 사항 미반영분 반영
Kimprodp Jan 24, 2025
b7dddae
Merge remote-tracking branch 'origin/be/refacotr/846-review-detail-re…
Kimprodp Jan 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

public record OptionItemAnswerResponse(
long optionId,
String content,
boolean isChecked
String content
) {
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package reviewme.review.service.dto.response.detail;

import jakarta.annotation.Nullable;
import java.util.List;
import reviewme.question.domain.QuestionType;

public record QuestionAnswerResponse(
long questionId,
boolean required,
QuestionType questionType,
String content,
@Nullable OptionGroupAnswerResponse optionGroup,
String questionContents,
@Nullable List<OptionItemAnswerResponse> options,
@Nullable String answer
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,6 @@
public record SectionAnswerResponse(
long sectionId,
String header,
List<QuestionAnswerResponse> questions
List<QuestionAnswerResponse> reviews
) {

public boolean hasAnsweredQuestion() {
return !questions.isEmpty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import reviewme.review.domain.CheckboxAnswerSelectedOption;
import reviewme.review.domain.Review;
import reviewme.review.domain.TextAnswer;
import reviewme.review.service.dto.response.detail.OptionGroupAnswerResponse;
import reviewme.review.service.dto.response.detail.OptionItemAnswerResponse;
import reviewme.review.service.dto.response.detail.QuestionAnswerResponse;
import reviewme.review.service.dto.response.detail.ReviewDetailResponse;
Expand Down Expand Up @@ -53,7 +52,7 @@ public ReviewDetailResponse mapToReviewDetailResponse(Review review, ReviewGroup
List<SectionAnswerResponse> sectionResponses = sections.stream()
.map(section -> mapToSectionResponse(review, section, questions,
optionGroupsByQuestion, optionItemsByOptionGroup))
.filter(sectionResponse -> !sectionResponse.questions().isEmpty())
.filter(sectionResponse -> !sectionResponse.reviews().isEmpty())
.toList();

return new ReviewDetailResponse(
Expand Down Expand Up @@ -107,22 +106,15 @@ private QuestionAnswerResponse mapToCheckboxQuestionResponse(Review review,

List<OptionItemAnswerResponse> optionItemResponse = optionItems.stream()
.filter(optionItem -> selectedOptionIds.contains(optionItem.getId()))
.map(optionItem -> new OptionItemAnswerResponse(optionItem.getId(), optionItem.getContent(), true))
.map(optionItem -> new OptionItemAnswerResponse(optionItem.getId(), optionItem.getContent()))
.toList();

OptionGroupAnswerResponse optionGroupAnswerResponse = new OptionGroupAnswerResponse(
optionGroup.getId(),
optionGroup.getMinSelectionCount(),
optionGroup.getMaxSelectionCount(),
optionItemResponse
);

return new QuestionAnswerResponse(
question.getId(),
question.isRequired(),
question.getQuestionType(),
question.getContent(),
optionGroupAnswerResponse,
optionItemResponse,
null
);
}
Expand Down
27 changes: 11 additions & 16 deletions backend/src/test/java/reviewme/api/ReviewApiTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -132,22 +132,17 @@ class ReviewApiTest extends ApiTest {
fieldWithPath("sections[].sectionId").description("섹션 ID"),
fieldWithPath("sections[].header").description("섹션 제목"),

fieldWithPath("sections[].questions[]").description("질문 목록"),
fieldWithPath("sections[].questions[].questionId").description("질문 ID"),
fieldWithPath("sections[].questions[].required").description("필수 여부"),
fieldWithPath("sections[].questions[].content").description("질문 내용"),
fieldWithPath("sections[].questions[].questionType").description("질문 타입"),

fieldWithPath("sections[].questions[].optionGroup").description("옵션 그룹").optional(),
fieldWithPath("sections[].questions[].optionGroup.optionGroupId").description("옵션 그룹 ID"),
fieldWithPath("sections[].questions[].optionGroup.minCount").description("최소 선택 개수"),
fieldWithPath("sections[].questions[].optionGroup.maxCount").description("최대 선택 개수"),

fieldWithPath("sections[].questions[].optionGroup.options[]").description("선택 항목 목록"),
fieldWithPath("sections[].questions[].optionGroup.options[].optionId").description("선택 항목 ID"),
fieldWithPath("sections[].questions[].optionGroup.options[].content").description("선택 항목 내용"),
fieldWithPath("sections[].questions[].optionGroup.options[].isChecked").description("선택 여부"),
fieldWithPath("sections[].questions[].answer").description("서술형 답변").optional(),
fieldWithPath("sections[].reviews[]").description("리뷰 목록"),
fieldWithPath("sections[].reviews[].questionId").description("질문 ID"),
fieldWithPath("sections[].reviews[].required").description("필수 여부"),
fieldWithPath("sections[].reviews[].questionContents").description("질문 내용"),
fieldWithPath("sections[].reviews[].questionType").description("질문 타입"),

fieldWithPath("sections[].reviews[].options").description("선택 항목 목록").optional(),
fieldWithPath("sections[].reviews[].options[]").description("선택 항목 목록"),
fieldWithPath("sections[].reviews[].options[].optionId").description("선택 항목 ID"),
fieldWithPath("sections[].reviews[].options[].content").description("선택 항목 내용"),
fieldWithPath("sections[].reviews[].answer").description("서술형 답변").optional(),
};

RestDocumentationResultHandler handler = document(
Expand Down
54 changes: 29 additions & 25 deletions backend/src/test/java/reviewme/api/TemplateFixture.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@
import java.time.LocalDate;
import java.util.List;
import reviewme.question.domain.QuestionType;
import reviewme.review.service.dto.response.detail.OptionGroupAnswerResponse;
import reviewme.review.service.dto.response.detail.OptionItemAnswerResponse;
import reviewme.review.service.dto.response.detail.QuestionAnswerResponse;
import reviewme.review.service.dto.response.detail.SectionAnswerResponse;
import reviewme.review.service.dto.response.detail.ReviewDetailResponse;
import reviewme.review.service.dto.response.detail.SectionAnswerResponse;
import reviewme.template.domain.VisibleType;
import reviewme.template.service.dto.response.OptionGroupResponse;
import reviewme.template.service.dto.response.OptionItemResponse;
Expand Down Expand Up @@ -74,36 +73,41 @@ public static TemplateResponse templateResponse() {

public static ReviewDetailResponse templateAnswerResponse() {
// Section 1
List<OptionItemAnswerResponse> firstOptionAnswers = List.of(
new OptionItemAnswerResponse(1, "커뮤니케이션, 협업 능력 (ex: 팀원간의 원활한 정보 공유, 명확한 의사소통)", true),
new OptionItemAnswerResponse(2, "문제 해결 능력 (ex: 프로젝트 중 만난 버그/오류를 분석하고 이를 해결하는 능력)", false),
new OptionItemAnswerResponse(3, "시간 관리 능력 (ex: 일정과 마감 기한 준수, 업무의 우선 순위 분배)", false)
List<OptionItemAnswerResponse> optionAnswer = List.of(
new OptionItemAnswerResponse(1, "커뮤니케이션, 협업 능력 (ex: 팀원간의 원활한 정보 공유, 명확한 의사소통)"),
new OptionItemAnswerResponse(2, "문제 해결 능력 (ex: 프로젝트 중 만난 버그/오류를 분석하고 이를 해결하는 능력)"),
new OptionItemAnswerResponse(3, "시간 관리 능력 (ex: 일정과 마감 기한 준수, 업무의 우선 순위 분배)")
);
OptionGroupAnswerResponse firstOptionGroupAnswer = new OptionGroupAnswerResponse(1, 1, 2, firstOptionAnswers);
QuestionAnswerResponse firstQuestionAnswer = new QuestionAnswerResponse(
1, true, QuestionType.CHECKBOX, "프로젝트 기간 동안, 아루의 강점이 드러났던 순간을 선택해주세요.", firstOptionGroupAnswer, null
);
SectionAnswerResponse firstSectionAnswer = new SectionAnswerResponse(
1, "프로젝트 기간 동안, 아루의 강점이 드러났던 순간을 선택해주세요.", List.of(firstQuestionAnswer)
1, true, QuestionType.CHECKBOX, "프로젝트 기간 동안, 아루의 강점이 드러났던 순간을 선택해주세요.", optionAnswer, null
);

// Section 2
List<OptionItemAnswerResponse> secondOptionAnswers = List.of(
new OptionItemAnswerResponse(4, "반대 의견을 내더라도 듣는 사람이 기분 나쁘지 않게 이야기해요.", true),
new OptionItemAnswerResponse(5, "팀원들의 의견을 잘 모아서 회의가 매끄럽게 진행되도록 해요.", false),
new OptionItemAnswerResponse(6, "팀의 분위기를 주도해요.", true)
);
OptionGroupAnswerResponse secondOptionGroupAnswer = new OptionGroupAnswerResponse(2, 1, 3, secondOptionAnswers);
QuestionAnswerResponse secondQuestionAnswer = new QuestionAnswerResponse(
2, true, QuestionType.CHECKBOX, "커뮤니케이션, 협업 능력에서 어떤 부분이 인상 깊었는지 선택해주세요.", secondOptionGroupAnswer,
null
);
SectionAnswerResponse secondSectionAnswer = new SectionAnswerResponse(
2, "커뮤니케이션, 협업 능력에서 어떤 부분이 인상 깊었는지 선택해주세요.", List.of(secondQuestionAnswer)
QuestionAnswerResponse secondQuestionAnswer = new QuestionAnswerResponse(2, true, QuestionType.TEXT, "위에서 선택한 사항에 대해 조금 더 자세히 설명해주세요.", null, "나산초의 답변");

SectionAnswerResponse sectionAnswer = new SectionAnswerResponse(
1, "프로젝트 기간 동안, 아루의 강점이 드러났던 순간을 선택해주세요.", List.of(firstQuestionAnswer, secondQuestionAnswer)
);

return new ReviewDetailResponse(
1, "아루", "리뷰미", LocalDate.of(2024, 8, 1), List.of(firstSectionAnswer, secondSectionAnswer)
1, "아루", "리뷰미", LocalDate.of(2024, 8, 1), List.of(sectionAnswer)
);

// Section 2
// List<OptionItemAnswerResponse> secondOptionAnswers = List.of(
// new OptionItemAnswerResponse(4, "반대 의견을 내더라도 듣는 사람이 기분 나쁘지 않게 이야기해요."),
// new OptionItemAnswerResponse(5, "팀원들의 의견을 잘 모아서 회의가 매끄럽게 진행되도록 해요."),
// new OptionItemAnswerResponse(6, "팀의 분위기를 주도해요.")
// );
// QuestionAnswerResponse secondQuestionAnswer = new QuestionAnswerResponse(
// 2, true, QuestionType.CHECKBOX, "커뮤니케이션, 협업 능력에서 어떤 부분이 인상 깊었는지 선택해주세요.", secondOptionAnswers,
// null
// );
// SectionAnswerResponse secondSectionAnswer = new SectionAnswerResponse(
// 2, "커뮤니케이션, 협업 능력에서 어떤 부분이 인상 깊었는지 선택해주세요.", List.of(secondQuestionAnswer)
// );

// return new ReviewDetailResponse(
// 1, "아루", "리뷰미", LocalDate.of(2024, 8, 1), List.of(sectionAnswer, secondSectionAnswer)
// );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ class NotAnsweredOptionalQuestion {
.extracting(SectionAnswerResponse::sectionId)
.containsExactly(section.getId()),
() -> assertThat(reviewDetail.sections())
.flatExtracting(SectionAnswerResponse::questions)
.flatExtracting(SectionAnswerResponse::reviews)
.extracting(QuestionAnswerResponse::questionId)
.containsExactly(question1.getId())
);
Expand Down