From b7018538d6a15ee0810c27f0dfdb678860bb97c7 Mon Sep 17 00:00:00 2001 From: wooh Date: Sat, 18 Jul 2026 13:26:28 +0900 Subject: [PATCH] =?UTF-8?q?[Fix]=20=EC=9E=90=EC=86=8C=EC=84=9C=20=EB=8B=B5?= =?UTF-8?q?=EB=B3=80=20=EC=A0=80=EC=9E=A5=20=EC=8B=9C=20=EB=AC=B8=ED=95=AD?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 답변 저장 요청에 문항 내용 필드를 추가 - 저장된 문항의 내용과 답변을 함께 수정하도록 로직 변경 - 문항 답변 저장 API 설명을 현재 동작에 맞게 수정 - 문항 내용 수정 반영 여부를 검증하는 테스트 추가 --- .../controller/QuestionController.java | 2 +- .../request/QuestionAnswerSaveRequest.java | 4 ++++ .../domain/analysis/entity/Question.java | 5 +++++ .../analysis/service/QuestionService.java | 2 +- .../analysis/service/QuestionServiceTest.java | 21 ++++++++++++------- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/jobdri/jobdri_api/domain/analysis/controller/QuestionController.java b/src/main/java/com/jobdri/jobdri_api/domain/analysis/controller/QuestionController.java index 2dabba2..97320bb 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/analysis/controller/QuestionController.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/analysis/controller/QuestionController.java @@ -83,7 +83,7 @@ public ApiResponse saveSelectedQuestions( ); } - @Operation(summary = "자소서 답변 저장/수정", description = "저장된 문항의 답변 내용을 작성하거나 수정합니다. 문항 내용은 수정하지 않습니다.") + @Operation(summary = "자소서 문항 답변 저장/수정", description = "저장된 문항의 내용과 답변을 함께 작성하거나 수정합니다.") @PatchMapping("/answers") public ApiResponse saveAnswers( @AuthenticationPrincipal UserDetailsImpl userDetails, diff --git a/src/main/java/com/jobdri/jobdri_api/domain/analysis/dto/request/QuestionAnswerSaveRequest.java b/src/main/java/com/jobdri/jobdri_api/domain/analysis/dto/request/QuestionAnswerSaveRequest.java index 0643cf3..cd72556 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/analysis/dto/request/QuestionAnswerSaveRequest.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/analysis/dto/request/QuestionAnswerSaveRequest.java @@ -1,6 +1,7 @@ package com.jobdri.jobdri_api.domain.analysis.dto.request; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -15,6 +16,9 @@ public record AnswerItem( @NotNull(message = "문항 ID는 필수입니다.") Long questionId, + @NotBlank(message = "문항 내용은 필수입니다.") + String content, + @NotNull(message = "답변 내용은 필수입니다.") String answer ) { diff --git a/src/main/java/com/jobdri/jobdri_api/domain/analysis/entity/Question.java b/src/main/java/com/jobdri/jobdri_api/domain/analysis/entity/Question.java index a8760e5..afe027f 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/analysis/entity/Question.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/analysis/entity/Question.java @@ -49,4 +49,9 @@ public static Question create(MockApply mockApply, String content, int limit, St public void updateAnswer(String answer) { this.answer = answer; } + + public void updateContentAndAnswer(String content, String answer) { + this.content = content; + this.answer = answer; + } } diff --git a/src/main/java/com/jobdri/jobdri_api/domain/analysis/service/QuestionService.java b/src/main/java/com/jobdri/jobdri_api/domain/analysis/service/QuestionService.java index f72e28f..d351d08 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/analysis/service/QuestionService.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/analysis/service/QuestionService.java @@ -194,7 +194,7 @@ public QuestionAnswerResponse saveAnswers( "해당 지원서의 문항을 찾을 수 없습니다. questionId=" + item.questionId() ); } - question.updateAnswer(normalizeAnswer(item.answer())); + question.updateContentAndAnswer(item.content().trim(), normalizeAnswer(item.answer())); } return new QuestionAnswerResponse( diff --git a/src/test/java/com/jobdri/jobdri_api/domain/analysis/service/QuestionServiceTest.java b/src/test/java/com/jobdri/jobdri_api/domain/analysis/service/QuestionServiceTest.java index 6b75283..660e9e3 100644 --- a/src/test/java/com/jobdri/jobdri_api/domain/analysis/service/QuestionServiceTest.java +++ b/src/test/java/com/jobdri/jobdri_api/domain/analysis/service/QuestionServiceTest.java @@ -310,7 +310,7 @@ void saveSelectedQuestionsThrowsWhenUserDoesNotOwnMockApply() { } @Test - @DisplayName("저장된 문항의 답변만 작성하거나 수정한다") + @DisplayName("저장된 문항의 내용과 답변을 함께 작성하거나 수정한다") void saveAnswers() { User user = saveUser("answer-save@example.com"); MockApply mockApply = saveMockApply(user); @@ -320,15 +320,20 @@ void saveAnswers() { Long questionId = selected.questions().get(0).questionId(); QuestionAnswerResponse response = questionService.saveAnswers(user, mockApply.getId(), new QuestionAnswerSaveRequest(List.of( - new QuestionAnswerSaveRequest.AnswerItem(questionId, "저는 백엔드 개발 경험을 바탕으로 지원했습니다.") + new QuestionAnswerSaveRequest.AnswerItem( + questionId, + "지원 동기와 입사 후 목표를 작성해주세요.", + "저는 백엔드 개발 경험을 바탕으로 지원했습니다." + ) ))); assertThat(response.questions()).hasSize(1); assertThat(response.sequence()).isEqualTo(1); - assertThat(response.questions().get(0).content()).isEqualTo("지원 동기를 작성해주세요."); + assertThat(response.questions().get(0).content()).isEqualTo("지원 동기와 입사 후 목표를 작성해주세요."); assertThat(response.questions().get(0).answer()).isEqualTo("저는 백엔드 개발 경험을 바탕으로 지원했습니다."); - assertThat(questionRepository.findById(questionId).orElseThrow().getAnswer()) - .isEqualTo("저는 백엔드 개발 경험을 바탕으로 지원했습니다."); + Question savedQuestion = questionRepository.findById(questionId).orElseThrow(); + assertThat(savedQuestion.getContent()).isEqualTo("지원 동기와 입사 후 목표를 작성해주세요."); + assertThat(savedQuestion.getAnswer()).isEqualTo("저는 백엔드 개발 경험을 바탕으로 지원했습니다."); } @Test @@ -344,7 +349,7 @@ void saveAnswersReturnsSequence() { Long questionId = selected.questions().get(0).questionId(); QuestionAnswerResponse response = questionService.saveAnswers(user, secondMockApply.getId(), new QuestionAnswerSaveRequest(List.of( - new QuestionAnswerSaveRequest.AnswerItem(questionId, "두 번째 지원 답변입니다.") + new QuestionAnswerSaveRequest.AnswerItem(questionId, "재지원 답변 문항입니다.", "두 번째 지원 답변입니다.") ))); assertThat(response.mockApplyId()).isEqualTo(secondMockApply.getId()); @@ -363,7 +368,7 @@ void saveAnswersReturnsStoredSequence() { Long questionId = selected.questions().get(0).questionId(); QuestionAnswerResponse response = questionService.saveAnswers(user, mockApply.getId(), new QuestionAnswerSaveRequest(List.of( - new QuestionAnswerSaveRequest.AnswerItem(questionId, "네 번째 지원 답변입니다.") + new QuestionAnswerSaveRequest.AnswerItem(questionId, "재지원 저장 순번 문항입니다.", "네 번째 지원 답변입니다.") ))); assertThat(response.mockApplyId()).isEqualTo(mockApply.getId()); @@ -382,7 +387,7 @@ void saveAnswersThrowsWhenQuestionDoesNotBelongToMockApply() { Long otherQuestionId = otherSelected.questions().get(0).questionId(); assertThatThrownBy(() -> questionService.saveAnswers(user, mockApply.getId(), new QuestionAnswerSaveRequest(List.of( - new QuestionAnswerSaveRequest.AnswerItem(otherQuestionId, "답변") + new QuestionAnswerSaveRequest.AnswerItem(otherQuestionId, "다른 지원서 문항", "답변") )))) .isInstanceOf(GeneralException.class) .extracting("code")