From 34b449f9f6aa6d24ed8f6bd9ed90c8d22d23d6b0 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Sun, 7 Dec 2025 16:47:55 +0900 Subject: [PATCH 01/17] =?UTF-8?q?docs:=20=EC=A7=88=EB=AC=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=ED=95=98=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 498506166..4371c7e59 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,18 @@ * 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다. ## 온라인 코드 리뷰 과정 -* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview) \ No newline at end of file +* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview) + +--- + +## 기능 목록 + +### 질문 삭제하기 + +- 질문자 = 로그인 사용자 아니면 삭제 불가 +- 답변 중 다른 사람이 쓴 답변이 있으면 삭제 불가 +- 답변이 없으면 삭제 가능 +- 질문자와 답변자가 모두 동일하면 삭제 가능 +- 삭제되면 질문 상태 변경 +- 삭제되면 모든 답변 상태 변경 +- 삭제 이력 생성됨 \ No newline at end of file From d52ed7e72ba94317beaf1a6a498e5098328b26a3 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Sun, 7 Dec 2025 17:48:26 +0900 Subject: [PATCH 02/17] =?UTF-8?q?feat:=20=EC=A7=88=EB=AC=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B6=8C=ED=95=9C=20=EC=B2=B4=ED=81=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EC=9D=84=20=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/qna/domain/Question.java | 10 +++++-- .../java/nextstep/qna/service/QnAService.java | 26 +++++++++++-------- .../nextstep/qna/domain/QuestionTest.java | 25 +++++++++++++++++- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index b623c52c7..ce04cd258 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -1,10 +1,10 @@ package nextstep.qna.domain; -import nextstep.users.domain.NsUser; - import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import nextstep.qna.CannotDeleteException; +import nextstep.users.domain.NsUser; public class Question { private Long id; @@ -85,6 +85,12 @@ public List getAnswers() { return answers; } + public void delete(NsUser user) throws CannotDeleteException { + if (!isOwner(user)) { + throw new CannotDeleteException("질문을 삭제할 권한이 없습니다."); + } + } + @Override public String toString() { return "Question [id=" + getId() + ", title=" + title + ", contents=" + contents + ", writer=" + writer + "]"; diff --git a/src/main/java/nextstep/qna/service/QnAService.java b/src/main/java/nextstep/qna/service/QnAService.java index 5741c84d6..0f4fbe83b 100644 --- a/src/main/java/nextstep/qna/service/QnAService.java +++ b/src/main/java/nextstep/qna/service/QnAService.java @@ -1,17 +1,21 @@ package nextstep.qna.service; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Resource; import nextstep.qna.CannotDeleteException; import nextstep.qna.NotFoundException; -import nextstep.qna.domain.*; +import nextstep.qna.domain.Answer; +import nextstep.qna.domain.AnswerRepository; +import nextstep.qna.domain.ContentType; +import nextstep.qna.domain.DeleteHistory; +import nextstep.qna.domain.Question; +import nextstep.qna.domain.QuestionRepository; import nextstep.users.domain.NsUser; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - @Service("qnaService") public class QnAService { @Resource(name = "questionRepository") @@ -26,9 +30,7 @@ public class QnAService { @Transactional public void deleteQuestion(NsUser loginUser, long questionId) throws CannotDeleteException { Question question = questionRepository.findById(questionId).orElseThrow(NotFoundException::new); - if (!question.isOwner(loginUser)) { - throw new CannotDeleteException("질문을 삭제할 권한이 없습니다."); - } + question.delete(loginUser); List answers = question.getAnswers(); for (Answer answer : answers) { @@ -39,10 +41,12 @@ public void deleteQuestion(NsUser loginUser, long questionId) throws CannotDelet List deleteHistories = new ArrayList<>(); question.setDeleted(true); - deleteHistories.add(new DeleteHistory(ContentType.QUESTION, questionId, question.getWriter(), LocalDateTime.now())); + deleteHistories.add( + new DeleteHistory(ContentType.QUESTION, questionId, question.getWriter(), LocalDateTime.now())); for (Answer answer : answers) { answer.setDeleted(true); - deleteHistories.add(new DeleteHistory(ContentType.ANSWER, answer.getId(), answer.getWriter(), LocalDateTime.now())); + deleteHistories.add( + new DeleteHistory(ContentType.ANSWER, answer.getId(), answer.getWriter(), LocalDateTime.now())); } deleteHistoryService.saveAll(deleteHistories); } diff --git a/src/test/java/nextstep/qna/domain/QuestionTest.java b/src/test/java/nextstep/qna/domain/QuestionTest.java index 3b8782396..281214f8c 100644 --- a/src/test/java/nextstep/qna/domain/QuestionTest.java +++ b/src/test/java/nextstep/qna/domain/QuestionTest.java @@ -1,8 +1,31 @@ package nextstep.qna.domain; +import static nextstep.users.domain.NsUserTest.SANJIGI; +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import nextstep.qna.CannotDeleteException; import nextstep.users.domain.NsUserTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; public class QuestionTest { public static final Question Q1 = new Question(NsUserTest.JAVAJIGI, "title1", "contents1"); - public static final Question Q2 = new Question(NsUserTest.SANJIGI, "title2", "contents2"); + public static final Question Q2 = new Question(SANJIGI, "title2", "contents2"); + + @DisplayName("질문 작성자는 자신의 질문을 삭제할 수 있다") + @Test + void shouldNotThrow_whenUserIsOwnerAndNoOtherAnswers() { + assertThatCode(() -> Q2.delete(SANJIGI)) + .doesNotThrowAnyException(); + } + + @DisplayName("질문자와 로그인 사용자가 다른 경우 삭제 불가하다") + @Test + void shouldThrow_whenUserAndWriterDifferent() { + assertThatThrownBy(() -> Q1.delete(SANJIGI)) + .isInstanceOf(CannotDeleteException.class) + .hasMessageContaining("질문을 삭제할 권한이 없습니다"); + } + } From 505ebb0b94009fe71a86c311fab65b3d6f51e53f Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Sun, 7 Dec 2025 20:10:02 +0900 Subject: [PATCH 03/17] =?UTF-8?q?feat:=20=EB=8B=B5=EB=B3=80=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B6=8C=ED=95=9C=20=EC=B2=B4=ED=81=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EC=9D=84=20=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/qna/domain/Answer.java | 14 +++++++---- .../java/nextstep/qna/service/QnAService.java | 4 +--- .../java/nextstep/qna/domain/AnswerTest.java | 24 +++++++++++++++++++ 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Answer.java b/src/main/java/nextstep/qna/domain/Answer.java index cf681811e..4bf211ae1 100644 --- a/src/main/java/nextstep/qna/domain/Answer.java +++ b/src/main/java/nextstep/qna/domain/Answer.java @@ -1,11 +1,11 @@ package nextstep.qna.domain; +import java.time.LocalDateTime; +import nextstep.qna.CannotDeleteException; import nextstep.qna.NotFoundException; import nextstep.qna.UnAuthorizedException; import nextstep.users.domain.NsUser; -import java.time.LocalDateTime; - public class Answer { private Long id; @@ -30,11 +30,11 @@ public Answer(NsUser writer, Question question, String contents) { public Answer(Long id, NsUser writer, Question question, String contents) { this.id = id; - if(writer == null) { + if (writer == null) { throw new UnAuthorizedException(); } - if(question == null) { + if (question == null) { throw new NotFoundException(); } @@ -72,6 +72,12 @@ public void toQuestion(Question question) { this.question = question; } + public void delete(NsUser user) throws CannotDeleteException { + if (!isOwner(user)) { + throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); + } + } + @Override public String toString() { return "Answer [id=" + getId() + ", writer=" + writer + ", contents=" + contents + "]"; diff --git a/src/main/java/nextstep/qna/service/QnAService.java b/src/main/java/nextstep/qna/service/QnAService.java index 0f4fbe83b..9ea6e68fd 100644 --- a/src/main/java/nextstep/qna/service/QnAService.java +++ b/src/main/java/nextstep/qna/service/QnAService.java @@ -34,9 +34,7 @@ public void deleteQuestion(NsUser loginUser, long questionId) throws CannotDelet List answers = question.getAnswers(); for (Answer answer : answers) { - if (!answer.isOwner(loginUser)) { - throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); - } + answer.delete(loginUser); } List deleteHistories = new ArrayList<>(); diff --git a/src/test/java/nextstep/qna/domain/AnswerTest.java b/src/test/java/nextstep/qna/domain/AnswerTest.java index 8e80ffb42..f23784f1e 100644 --- a/src/test/java/nextstep/qna/domain/AnswerTest.java +++ b/src/test/java/nextstep/qna/domain/AnswerTest.java @@ -1,8 +1,32 @@ package nextstep.qna.domain; +import static nextstep.users.domain.NsUserTest.JAVAJIGI; +import static nextstep.users.domain.NsUserTest.SANJIGI; +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import nextstep.qna.CannotDeleteException; import nextstep.users.domain.NsUserTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; public class AnswerTest { public static final Answer A1 = new Answer(NsUserTest.JAVAJIGI, QuestionTest.Q1, "Answers Contents1"); public static final Answer A2 = new Answer(NsUserTest.SANJIGI, QuestionTest.Q1, "Answers Contents2"); + + @DisplayName("답변 작성자가 로그인 사용자일 경우 삭제 가능하다") + @Test + void shouldNotThrow_whenUserIsOwner() { + assertThatCode(() -> A1.delete(JAVAJIGI)) + .doesNotThrowAnyException(); + } + + @DisplayName("답변 중 다른 사람이 쓴 답변이 있는 경우 삭제 불가하다") + @Test + void shouldThrow_whenUserAndWriterDifferent() { + assertThatThrownBy(() -> A1.delete(SANJIGI)) + .isInstanceOf(CannotDeleteException.class) + .hasMessageContaining("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); + } + } From 2a20b56f9a71af9948457763f05d25e99a29abc4 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Sun, 7 Dec 2025 20:29:01 +0900 Subject: [PATCH 04/17] =?UTF-8?q?refactor:=20=EC=A7=88=EB=AC=B8,=20?= =?UTF-8?q?=EB=8B=B5=EB=B3=80=20=EC=82=AD=EC=A0=9C=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=A1=9C=EC=A7=81=EC=9D=84=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/qna/domain/Answer.java | 1 + src/main/java/nextstep/qna/domain/Question.java | 4 ++++ src/main/java/nextstep/qna/service/QnAService.java | 5 ----- src/test/java/nextstep/qna/domain/AnswerTest.java | 8 ++++++++ src/test/java/nextstep/qna/domain/QuestionTest.java | 7 +++++++ 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Answer.java b/src/main/java/nextstep/qna/domain/Answer.java index 4bf211ae1..2bb6f99e8 100644 --- a/src/main/java/nextstep/qna/domain/Answer.java +++ b/src/main/java/nextstep/qna/domain/Answer.java @@ -76,6 +76,7 @@ public void delete(NsUser user) throws CannotDeleteException { if (!isOwner(user)) { throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); } + setDeleted(true); } @Override diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index ce04cd258..360b90507 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -89,6 +89,10 @@ public void delete(NsUser user) throws CannotDeleteException { if (!isOwner(user)) { throw new CannotDeleteException("질문을 삭제할 권한이 없습니다."); } + for (Answer answer : answers) { + answer.delete(user); + } + setDeleted(true); } @Override diff --git a/src/main/java/nextstep/qna/service/QnAService.java b/src/main/java/nextstep/qna/service/QnAService.java index 9ea6e68fd..b820d8843 100644 --- a/src/main/java/nextstep/qna/service/QnAService.java +++ b/src/main/java/nextstep/qna/service/QnAService.java @@ -33,16 +33,11 @@ public void deleteQuestion(NsUser loginUser, long questionId) throws CannotDelet question.delete(loginUser); List answers = question.getAnswers(); - for (Answer answer : answers) { - answer.delete(loginUser); - } List deleteHistories = new ArrayList<>(); - question.setDeleted(true); deleteHistories.add( new DeleteHistory(ContentType.QUESTION, questionId, question.getWriter(), LocalDateTime.now())); for (Answer answer : answers) { - answer.setDeleted(true); deleteHistories.add( new DeleteHistory(ContentType.ANSWER, answer.getId(), answer.getWriter(), LocalDateTime.now())); } diff --git a/src/test/java/nextstep/qna/domain/AnswerTest.java b/src/test/java/nextstep/qna/domain/AnswerTest.java index f23784f1e..8487bb412 100644 --- a/src/test/java/nextstep/qna/domain/AnswerTest.java +++ b/src/test/java/nextstep/qna/domain/AnswerTest.java @@ -2,6 +2,7 @@ import static nextstep.users.domain.NsUserTest.JAVAJIGI; import static nextstep.users.domain.NsUserTest.SANJIGI; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -29,4 +30,11 @@ void shouldThrow_whenUserAndWriterDifferent() { .hasMessageContaining("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); } + @DisplayName("답변 작성자가 삭제할 경우 상태가 변경된다") + @Test + void shouldChangeDeletedStatus_whenDeleteByOwner() throws CannotDeleteException { + A1.delete(JAVAJIGI); + assertThat(A1.isDeleted()).isTrue(); + } + } diff --git a/src/test/java/nextstep/qna/domain/QuestionTest.java b/src/test/java/nextstep/qna/domain/QuestionTest.java index 281214f8c..c45a0e60f 100644 --- a/src/test/java/nextstep/qna/domain/QuestionTest.java +++ b/src/test/java/nextstep/qna/domain/QuestionTest.java @@ -1,6 +1,7 @@ package nextstep.qna.domain; import static nextstep.users.domain.NsUserTest.SANJIGI; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -28,4 +29,10 @@ void shouldThrow_whenUserAndWriterDifferent() { .hasMessageContaining("질문을 삭제할 권한이 없습니다"); } + @DisplayName("삭제 가능한 경우 상태가 변경된다") + @Test + void shouldChangeDeletedStatus_whenDeleteByOwner() throws CannotDeleteException { + Q2.delete(SANJIGI); + assertThat(Q2.isDeleted()).isTrue(); + } } From 88922da0f30a45b6a52c63e9cc600c4d6e451348 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Sun, 7 Dec 2025 21:23:11 +0900 Subject: [PATCH 05/17] =?UTF-8?q?refactor:=20=EC=A7=88=EB=AC=B8,=20?= =?UTF-8?q?=EB=8B=B5=EB=B3=80=20=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=9D=B4=EB=A0=A5=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/qna/domain/Answer.java | 8 +++++++- src/main/java/nextstep/qna/domain/Question.java | 10 +++++++--- .../java/nextstep/qna/service/QnAService.java | 16 +--------------- .../java/nextstep/qna/domain/AnswerTest.java | 6 ++++++ .../java/nextstep/qna/domain/QuestionTest.java | 7 +++++++ 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Answer.java b/src/main/java/nextstep/qna/domain/Answer.java index 2bb6f99e8..52e92eddc 100644 --- a/src/main/java/nextstep/qna/domain/Answer.java +++ b/src/main/java/nextstep/qna/domain/Answer.java @@ -1,6 +1,8 @@ package nextstep.qna.domain; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; import nextstep.qna.CannotDeleteException; import nextstep.qna.NotFoundException; import nextstep.qna.UnAuthorizedException; @@ -72,11 +74,15 @@ public void toQuestion(Question question) { this.question = question; } - public void delete(NsUser user) throws CannotDeleteException { + public List delete(NsUser user) throws CannotDeleteException { if (!isOwner(user)) { throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); } setDeleted(true); + List deleteHistories = new ArrayList<>(); + deleteHistories.add( + new DeleteHistory(ContentType.ANSWER, id, writer, LocalDateTime.now())); + return deleteHistories; } @Override diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index 360b90507..d7c205446 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -85,14 +85,18 @@ public List getAnswers() { return answers; } - public void delete(NsUser user) throws CannotDeleteException { + public List delete(NsUser user) throws CannotDeleteException { if (!isOwner(user)) { throw new CannotDeleteException("질문을 삭제할 권한이 없습니다."); } + List deleteHistories = new ArrayList<>(); + setDeleted(true); + deleteHistories.add( + new DeleteHistory(ContentType.QUESTION, id, writer, LocalDateTime.now())); for (Answer answer : answers) { - answer.delete(user); + deleteHistories.addAll(answer.delete(user)); } - setDeleted(true); + return deleteHistories; } @Override diff --git a/src/main/java/nextstep/qna/service/QnAService.java b/src/main/java/nextstep/qna/service/QnAService.java index b820d8843..a0a78ec97 100644 --- a/src/main/java/nextstep/qna/service/QnAService.java +++ b/src/main/java/nextstep/qna/service/QnAService.java @@ -1,14 +1,10 @@ package nextstep.qna.service; -import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import nextstep.qna.CannotDeleteException; import nextstep.qna.NotFoundException; -import nextstep.qna.domain.Answer; import nextstep.qna.domain.AnswerRepository; -import nextstep.qna.domain.ContentType; import nextstep.qna.domain.DeleteHistory; import nextstep.qna.domain.Question; import nextstep.qna.domain.QuestionRepository; @@ -30,17 +26,7 @@ public class QnAService { @Transactional public void deleteQuestion(NsUser loginUser, long questionId) throws CannotDeleteException { Question question = questionRepository.findById(questionId).orElseThrow(NotFoundException::new); - question.delete(loginUser); - - List answers = question.getAnswers(); - - List deleteHistories = new ArrayList<>(); - deleteHistories.add( - new DeleteHistory(ContentType.QUESTION, questionId, question.getWriter(), LocalDateTime.now())); - for (Answer answer : answers) { - deleteHistories.add( - new DeleteHistory(ContentType.ANSWER, answer.getId(), answer.getWriter(), LocalDateTime.now())); - } + List deleteHistories = question.delete(loginUser); deleteHistoryService.saveAll(deleteHistories); } } diff --git a/src/test/java/nextstep/qna/domain/AnswerTest.java b/src/test/java/nextstep/qna/domain/AnswerTest.java index 8487bb412..0b6a848c6 100644 --- a/src/test/java/nextstep/qna/domain/AnswerTest.java +++ b/src/test/java/nextstep/qna/domain/AnswerTest.java @@ -37,4 +37,10 @@ void shouldChangeDeletedStatus_whenDeleteByOwner() throws CannotDeleteException assertThat(A1.isDeleted()).isTrue(); } + @DisplayName("삭제 시 삭제 이력을 반환한다") + @Test + void shouldReturnDeleteHistory_whenDeletePossible() throws CannotDeleteException { + assertThat(A1.delete(JAVAJIGI)).hasSize(1); + } + } diff --git a/src/test/java/nextstep/qna/domain/QuestionTest.java b/src/test/java/nextstep/qna/domain/QuestionTest.java index c45a0e60f..52ba308d7 100644 --- a/src/test/java/nextstep/qna/domain/QuestionTest.java +++ b/src/test/java/nextstep/qna/domain/QuestionTest.java @@ -1,5 +1,6 @@ package nextstep.qna.domain; +import static nextstep.users.domain.NsUserTest.JAVAJIGI; import static nextstep.users.domain.NsUserTest.SANJIGI; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; @@ -35,4 +36,10 @@ void shouldChangeDeletedStatus_whenDeleteByOwner() throws CannotDeleteException Q2.delete(SANJIGI); assertThat(Q2.isDeleted()).isTrue(); } + + @DisplayName("삭제 시 삭제 이력을 반환한다") + @Test + void shouldReturnDeleteHistory_whenDeletePossible() throws CannotDeleteException { + assertThat(Q1.delete(JAVAJIGI)).hasSize(1); + } } From 8109451ed6444c7283b15988f7b58cdc1447cece Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Mon, 8 Dec 2025 00:04:10 +0900 Subject: [PATCH 06/17] =?UTF-8?q?feat:=20Answers=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20deleteAll=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/qna/domain/Answers.java | 28 +++++++++++++++++++ .../java/nextstep/qna/domain/AnswerTest.java | 1 + .../java/nextstep/qna/domain/AnswersTest.java | 21 ++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 src/main/java/nextstep/qna/domain/Answers.java create mode 100644 src/test/java/nextstep/qna/domain/AnswersTest.java diff --git a/src/main/java/nextstep/qna/domain/Answers.java b/src/main/java/nextstep/qna/domain/Answers.java new file mode 100644 index 000000000..486995e4e --- /dev/null +++ b/src/main/java/nextstep/qna/domain/Answers.java @@ -0,0 +1,28 @@ +package nextstep.qna.domain; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import nextstep.qna.CannotDeleteException; +import nextstep.users.domain.NsUser; + +public class Answers { + + private final List answers; + + public Answers(Answer... answers) { + this(new ArrayList<>(Arrays.asList(answers))); + } + + public Answers(List answers) { + this.answers = answers; + } + + public List deleteAll(NsUser user) throws CannotDeleteException { + List deleteHistories = new ArrayList<>(); + for (Answer answer : answers) { + deleteHistories.addAll(answer.delete(user)); + } + return deleteHistories; + } +} diff --git a/src/test/java/nextstep/qna/domain/AnswerTest.java b/src/test/java/nextstep/qna/domain/AnswerTest.java index 0b6a848c6..a418c55d9 100644 --- a/src/test/java/nextstep/qna/domain/AnswerTest.java +++ b/src/test/java/nextstep/qna/domain/AnswerTest.java @@ -14,6 +14,7 @@ public class AnswerTest { public static final Answer A1 = new Answer(NsUserTest.JAVAJIGI, QuestionTest.Q1, "Answers Contents1"); public static final Answer A2 = new Answer(NsUserTest.SANJIGI, QuestionTest.Q1, "Answers Contents2"); + public static final Answer A3 = new Answer(NsUserTest.JAVAJIGI, QuestionTest.Q1, "Answers Contents3"); @DisplayName("답변 작성자가 로그인 사용자일 경우 삭제 가능하다") @Test diff --git a/src/test/java/nextstep/qna/domain/AnswersTest.java b/src/test/java/nextstep/qna/domain/AnswersTest.java new file mode 100644 index 000000000..473dd531b --- /dev/null +++ b/src/test/java/nextstep/qna/domain/AnswersTest.java @@ -0,0 +1,21 @@ +package nextstep.qna.domain; + +import static nextstep.qna.domain.AnswerTest.A1; +import static nextstep.qna.domain.AnswerTest.A3; +import static nextstep.users.domain.NsUserTest.JAVAJIGI; +import static org.assertj.core.api.Assertions.assertThat; + +import nextstep.qna.CannotDeleteException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class AnswersTest { + + @DisplayName("답변들을 삭제 시 삭제 이력을 반환한다") + @Test + void shouldReturnDeleteHistory_whenDeletePossible() throws CannotDeleteException { + Answers answers = new Answers(A1, A3); + assertThat(answers.deleteAll(JAVAJIGI)).hasSize(2); + } + +} \ No newline at end of file From 327afdbe439c94684d1227c32b7ebe6a3fb2594f Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Mon, 8 Dec 2025 00:16:58 +0900 Subject: [PATCH 07/17] =?UTF-8?q?refactor:=20Question=EC=9D=98=20Answer=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=EC=9D=84=20Answers=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=ED=95=98=EA=B3=A0=20add=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/qna/domain/Answers.java | 10 ++++++++++ src/main/java/nextstep/qna/domain/Question.java | 8 +++----- src/test/java/nextstep/qna/domain/AnswersTest.java | 8 ++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Answers.java b/src/main/java/nextstep/qna/domain/Answers.java index 486995e4e..15fb1d7bb 100644 --- a/src/main/java/nextstep/qna/domain/Answers.java +++ b/src/main/java/nextstep/qna/domain/Answers.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import nextstep.qna.CannotDeleteException; import nextstep.users.domain.NsUser; @@ -18,6 +19,14 @@ public Answers(List answers) { this.answers = answers; } + public List answers() { + return Collections.unmodifiableList(new ArrayList<>(answers)); + } + + public void add(Answer answer) { + answers.add(answer); + } + public List deleteAll(NsUser user) throws CannotDeleteException { List deleteHistories = new ArrayList<>(); for (Answer answer : answers) { @@ -25,4 +34,5 @@ public List deleteAll(NsUser user) throws CannotDeleteException { } return deleteHistories; } + } diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index d7c205446..f0beb33bb 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -15,7 +15,7 @@ public class Question { private NsUser writer; - private List answers = new ArrayList<>(); + private Answers answers = new Answers(); private boolean deleted = false; @@ -81,7 +81,7 @@ public boolean isDeleted() { return deleted; } - public List getAnswers() { + public Answers getAnswers() { return answers; } @@ -93,9 +93,7 @@ public List delete(NsUser user) throws CannotDeleteException { setDeleted(true); deleteHistories.add( new DeleteHistory(ContentType.QUESTION, id, writer, LocalDateTime.now())); - for (Answer answer : answers) { - deleteHistories.addAll(answer.delete(user)); - } + deleteHistories.addAll(answers.deleteAll(user)); return deleteHistories; } diff --git a/src/test/java/nextstep/qna/domain/AnswersTest.java b/src/test/java/nextstep/qna/domain/AnswersTest.java index 473dd531b..1bf4eae3e 100644 --- a/src/test/java/nextstep/qna/domain/AnswersTest.java +++ b/src/test/java/nextstep/qna/domain/AnswersTest.java @@ -18,4 +18,12 @@ void shouldReturnDeleteHistory_whenDeletePossible() throws CannotDeleteException assertThat(answers.deleteAll(JAVAJIGI)).hasSize(2); } + @DisplayName("Answers에 Answer를 추가할 수 있다") + @Test + void shouldAddAnswerToAnswers() { + Answers answers = new Answers(A1); + answers.add(A3); + assertThat(answers.answers()).hasSize(2); + } + } \ No newline at end of file From 80b02db03437dbce9561a2e530c5f32a6da74a67 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Mon, 8 Dec 2025 02:04:03 +0900 Subject: [PATCH 08/17] =?UTF-8?q?feat:=20QuestionContent=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/qna/domain/QuestionContent.java | 21 +++++++++++++++++++ .../qna/domain/QuestionContentTest.java | 19 +++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/nextstep/qna/domain/QuestionContent.java create mode 100644 src/test/java/nextstep/qna/domain/QuestionContentTest.java diff --git a/src/main/java/nextstep/qna/domain/QuestionContent.java b/src/main/java/nextstep/qna/domain/QuestionContent.java new file mode 100644 index 000000000..f574ebadd --- /dev/null +++ b/src/main/java/nextstep/qna/domain/QuestionContent.java @@ -0,0 +1,21 @@ +package nextstep.qna.domain; + +public class QuestionContent { + + private final String title; + + private final String contents; + + public QuestionContent(String title, String contents) { + this.title = title; + this.contents = contents; + } + + public String title() { + return title; + } + + public String contents() { + return contents; + } +} diff --git a/src/test/java/nextstep/qna/domain/QuestionContentTest.java b/src/test/java/nextstep/qna/domain/QuestionContentTest.java new file mode 100644 index 000000000..46b89b02b --- /dev/null +++ b/src/test/java/nextstep/qna/domain/QuestionContentTest.java @@ -0,0 +1,19 @@ +package nextstep.qna.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class QuestionContentTest { + public static final QuestionContent QC1 = new QuestionContent("title1", "contents1"); + public static final QuestionContent QC2 = new QuestionContent("title2", "contents2"); + + @DisplayName("QuestionContent 생성") + @Test + void createQuestionContent() { + assertThat(QC1.title()).isEqualTo("title1"); + assertThat(QC1.contents()).isEqualTo("contents1"); + } + +} \ No newline at end of file From d3f264ea7be4ab197ff5277a99d1a80c9104f45f Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Mon, 8 Dec 2025 02:17:11 +0900 Subject: [PATCH 09/17] =?UTF-8?q?refactor:=20Question=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20title/contents=20=ED=95=84=EB=93=9C=EB=A5=BC=20Ques?= =?UTF-8?q?tionContent=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/qna/domain/Question.java | 28 +++++------------- .../nextstep/qna/domain/QuestionContent.java | 7 +++++ .../nextstep/qna/domain/QuestionTest.java | 7 +++-- .../nextstep/qna/service/QnaServiceTest.java | 29 +++++++++++-------- 4 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index f0beb33bb..c121b8656 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -9,9 +9,7 @@ public class Question { private Long id; - private String title; - - private String contents; + private QuestionContent content; private NsUser writer; @@ -26,15 +24,14 @@ public class Question { public Question() { } - public Question(NsUser writer, String title, String contents) { - this(0L, writer, title, contents); + public Question(NsUser writer, QuestionContent content) { + this(0L, writer, content); } - public Question(Long id, NsUser writer, String title, String contents) { + public Question(Long id, NsUser writer, QuestionContent content) { this.id = id; this.writer = writer; - this.title = title; - this.contents = contents; + this.content = content; } public Long getId() { @@ -42,21 +39,12 @@ public Long getId() { } public String getTitle() { - return title; + return content.title(); } - public Question setTitle(String title) { - this.title = title; - return this; - } public String getContents() { - return contents; - } - - public Question setContents(String contents) { - this.contents = contents; - return this; + return content.contents(); } public NsUser getWriter() { @@ -99,6 +87,6 @@ public List delete(NsUser user) throws CannotDeleteException { @Override public String toString() { - return "Question [id=" + getId() + ", title=" + title + ", contents=" + contents + ", writer=" + writer + "]"; + return "Question [id=" + getId() + ", content=" + content + ", writer=" + writer + "]"; } } diff --git a/src/main/java/nextstep/qna/domain/QuestionContent.java b/src/main/java/nextstep/qna/domain/QuestionContent.java index f574ebadd..6a5d4c77e 100644 --- a/src/main/java/nextstep/qna/domain/QuestionContent.java +++ b/src/main/java/nextstep/qna/domain/QuestionContent.java @@ -18,4 +18,11 @@ public String title() { public String contents() { return contents; } + + @Override + public String toString() { + return "QuestionContent{" + + ", title=" + title + ", contents=" + contents + + '}'; + } } diff --git a/src/test/java/nextstep/qna/domain/QuestionTest.java b/src/test/java/nextstep/qna/domain/QuestionTest.java index 52ba308d7..704737e31 100644 --- a/src/test/java/nextstep/qna/domain/QuestionTest.java +++ b/src/test/java/nextstep/qna/domain/QuestionTest.java @@ -1,5 +1,7 @@ package nextstep.qna.domain; +import static nextstep.qna.domain.QuestionContentTest.QC1; +import static nextstep.qna.domain.QuestionContentTest.QC2; import static nextstep.users.domain.NsUserTest.JAVAJIGI; import static nextstep.users.domain.NsUserTest.SANJIGI; import static org.assertj.core.api.Assertions.assertThat; @@ -7,13 +9,12 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import nextstep.qna.CannotDeleteException; -import nextstep.users.domain.NsUserTest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; public class QuestionTest { - public static final Question Q1 = new Question(NsUserTest.JAVAJIGI, "title1", "contents1"); - public static final Question Q2 = new Question(SANJIGI, "title2", "contents2"); + public static final Question Q1 = new Question(JAVAJIGI, QC1); + public static final Question Q2 = new Question(SANJIGI, QC2); @DisplayName("질문 작성자는 자신의 질문을 삭제할 수 있다") @Test diff --git a/src/test/java/nextstep/qna/service/QnaServiceTest.java b/src/test/java/nextstep/qna/service/QnaServiceTest.java index e1e943c23..cb1da9f39 100644 --- a/src/test/java/nextstep/qna/service/QnaServiceTest.java +++ b/src/test/java/nextstep/qna/service/QnaServiceTest.java @@ -1,7 +1,22 @@ package nextstep.qna.service; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; import nextstep.qna.CannotDeleteException; -import nextstep.qna.domain.*; +import nextstep.qna.domain.Answer; +import nextstep.qna.domain.ContentType; +import nextstep.qna.domain.DeleteHistory; +import nextstep.qna.domain.Question; +import nextstep.qna.domain.QuestionContentTest; +import nextstep.qna.domain.QuestionRepository; +import nextstep.qna.domain.QuestionTest; import nextstep.users.domain.NsUserTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,16 +25,6 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - @ExtendWith(MockitoExtension.class) public class QnaServiceTest { @Mock @@ -36,7 +41,7 @@ public class QnaServiceTest { @BeforeEach public void setUp() throws Exception { - question = new Question(1L, NsUserTest.JAVAJIGI, "title1", "contents1"); + question = new Question(1L, NsUserTest.JAVAJIGI, QuestionContentTest.QC1); answer = new Answer(11L, NsUserTest.JAVAJIGI, QuestionTest.Q1, "Answers Contents1"); question.addAnswer(answer); } From 8643b28e492f11824646117bf999876d3eb6c610 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Mon, 8 Dec 2025 03:55:36 +0900 Subject: [PATCH 10/17] =?UTF-8?q?feat:=20BaseTimeEntity,=20BaseEntity=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/qna/domain/BaseEntity.java | 38 +++++++++++++++++++ .../nextstep/qna/domain/BaseTimeEntity.java | 11 ++++++ 2 files changed, 49 insertions(+) create mode 100644 src/main/java/nextstep/qna/domain/BaseEntity.java create mode 100644 src/main/java/nextstep/qna/domain/BaseTimeEntity.java diff --git a/src/main/java/nextstep/qna/domain/BaseEntity.java b/src/main/java/nextstep/qna/domain/BaseEntity.java new file mode 100644 index 000000000..0747983ba --- /dev/null +++ b/src/main/java/nextstep/qna/domain/BaseEntity.java @@ -0,0 +1,38 @@ +package nextstep.qna.domain; + +import nextstep.users.domain.NsUser; + +public abstract class BaseEntity extends BaseTimeEntity { + + private Long id; + + private NsUser writer; + + private boolean deleted = false; + + protected BaseEntity(Long id, NsUser writer) { + this.id = id; + this.writer = writer; + } + + public Long getId() { + return id; + } + + public NsUser getWriter() { + return writer; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public boolean isOwner(NsUser loginUser) { + return writer.equals(loginUser); + } + + public boolean isDeleted() { + return deleted; + } + +} diff --git a/src/main/java/nextstep/qna/domain/BaseTimeEntity.java b/src/main/java/nextstep/qna/domain/BaseTimeEntity.java new file mode 100644 index 000000000..69b4f1e94 --- /dev/null +++ b/src/main/java/nextstep/qna/domain/BaseTimeEntity.java @@ -0,0 +1,11 @@ +package nextstep.qna.domain; + +import java.time.LocalDateTime; + +public abstract class BaseTimeEntity { + + private LocalDateTime createdDate = LocalDateTime.now(); + + private LocalDateTime updatedDate; + +} From a686182e9a41fbbcc568156da3af8d97b6e7cefb Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Mon, 8 Dec 2025 03:55:58 +0900 Subject: [PATCH 11/17] =?UTF-8?q?refactor:=20Question=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20BaseTimeEntity/BaseEntity?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/qna/domain/Question.java | 44 ++----------------- 1 file changed, 4 insertions(+), 40 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index c121b8656..2d4562179 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -6,69 +6,33 @@ import nextstep.qna.CannotDeleteException; import nextstep.users.domain.NsUser; -public class Question { - private Long id; - +public class Question extends BaseEntity { private QuestionContent content; - private NsUser writer; - private Answers answers = new Answers(); - private boolean deleted = false; - - private LocalDateTime createdDate = LocalDateTime.now(); - - private LocalDateTime updatedDate; - - public Question() { - } - public Question(NsUser writer, QuestionContent content) { this(0L, writer, content); } public Question(Long id, NsUser writer, QuestionContent content) { - this.id = id; - this.writer = writer; + super(id, writer); this.content = content; } - public Long getId() { - return id; - } - public String getTitle() { return content.title(); } - public String getContents() { return content.contents(); } - public NsUser getWriter() { - return writer; - } - public void addAnswer(Answer answer) { answer.toQuestion(this); answers.add(answer); } - public boolean isOwner(NsUser loginUser) { - return writer.equals(loginUser); - } - - public Question setDeleted(boolean deleted) { - this.deleted = deleted; - return this; - } - - public boolean isDeleted() { - return deleted; - } - public Answers getAnswers() { return answers; } @@ -80,13 +44,13 @@ public List delete(NsUser user) throws CannotDeleteException { List deleteHistories = new ArrayList<>(); setDeleted(true); deleteHistories.add( - new DeleteHistory(ContentType.QUESTION, id, writer, LocalDateTime.now())); + new DeleteHistory(ContentType.QUESTION, getId(), getWriter(), LocalDateTime.now())); deleteHistories.addAll(answers.deleteAll(user)); return deleteHistories; } @Override public String toString() { - return "Question [id=" + getId() + ", content=" + content + ", writer=" + writer + "]"; + return "Question [id=" + getId() + ", content=" + content + ", writer=" + getWriter() + "]"; } } From 0d50ca610b3fdb4ac958d8100a749b84bdd182e7 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:02:57 +0900 Subject: [PATCH 12/17] =?UTF-8?q?refactor:=20Answer=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20BaseTimeEntity/BaseEntity=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/qna/domain/Answer.java | 50 ++++--------------- 1 file changed, 10 insertions(+), 40 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Answer.java b/src/main/java/nextstep/qna/domain/Answer.java index 52e92eddc..e7cd0b544 100644 --- a/src/main/java/nextstep/qna/domain/Answer.java +++ b/src/main/java/nextstep/qna/domain/Answer.java @@ -8,30 +8,23 @@ import nextstep.qna.UnAuthorizedException; import nextstep.users.domain.NsUser; -public class Answer { - private Long id; - - private NsUser writer; +public class Answer extends BaseEntity { private Question question; private String contents; - private boolean deleted = false; - - private LocalDateTime createdDate = LocalDateTime.now(); - - private LocalDateTime updatedDate; - - public Answer() { - } - public Answer(NsUser writer, Question question, String contents) { this(null, writer, question, contents); } public Answer(Long id, NsUser writer, Question question, String contents) { - this.id = id; + super(id, writer); + this.question = question; + this.contents = contents; + } + + public static Answer create(NsUser writer, Question question, String contents) { if (writer == null) { throw new UnAuthorizedException(); } @@ -40,30 +33,7 @@ public Answer(Long id, NsUser writer, Question question, String contents) { throw new NotFoundException(); } - this.writer = writer; - this.question = question; - this.contents = contents; - } - - public Long getId() { - return id; - } - - public Answer setDeleted(boolean deleted) { - this.deleted = deleted; - return this; - } - - public boolean isDeleted() { - return deleted; - } - - public boolean isOwner(NsUser writer) { - return this.writer.equals(writer); - } - - public NsUser getWriter() { - return writer; + return new Answer(null, writer, question, contents); } public String getContents() { @@ -81,12 +51,12 @@ public List delete(NsUser user) throws CannotDeleteException { setDeleted(true); List deleteHistories = new ArrayList<>(); deleteHistories.add( - new DeleteHistory(ContentType.ANSWER, id, writer, LocalDateTime.now())); + new DeleteHistory(ContentType.ANSWER, getId(), getWriter(), LocalDateTime.now())); return deleteHistories; } @Override public String toString() { - return "Answer [id=" + getId() + ", writer=" + writer + ", contents=" + contents + "]"; + return "Answer [id=" + getId() + ", writer=" + getWriter() + ", contents=" + contents + "]"; } } From 92536732b71ff97719f63ad81bc7165cfd1990d6 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:27:37 +0900 Subject: [PATCH 13/17] =?UTF-8?q?refactor:=20setDeleted=20=EB=A5=BC=20mark?= =?UTF-8?q?AsDeleted=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/qna/domain/Answer.java | 2 +- src/main/java/nextstep/qna/domain/BaseEntity.java | 4 ++-- src/main/java/nextstep/qna/domain/Question.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Answer.java b/src/main/java/nextstep/qna/domain/Answer.java index e7cd0b544..9bf98126e 100644 --- a/src/main/java/nextstep/qna/domain/Answer.java +++ b/src/main/java/nextstep/qna/domain/Answer.java @@ -48,7 +48,7 @@ public List delete(NsUser user) throws CannotDeleteException { if (!isOwner(user)) { throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); } - setDeleted(true); + markAsDeleted(); List deleteHistories = new ArrayList<>(); deleteHistories.add( new DeleteHistory(ContentType.ANSWER, getId(), getWriter(), LocalDateTime.now())); diff --git a/src/main/java/nextstep/qna/domain/BaseEntity.java b/src/main/java/nextstep/qna/domain/BaseEntity.java index 0747983ba..2786398dc 100644 --- a/src/main/java/nextstep/qna/domain/BaseEntity.java +++ b/src/main/java/nextstep/qna/domain/BaseEntity.java @@ -23,8 +23,8 @@ public NsUser getWriter() { return writer; } - public void setDeleted(boolean deleted) { - this.deleted = deleted; + public void markAsDeleted() { + this.deleted = true; } public boolean isOwner(NsUser loginUser) { diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index 2d4562179..cd05b9efc 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -42,7 +42,7 @@ public List delete(NsUser user) throws CannotDeleteException { throw new CannotDeleteException("질문을 삭제할 권한이 없습니다."); } List deleteHistories = new ArrayList<>(); - setDeleted(true); + markAsDeleted(); deleteHistories.add( new DeleteHistory(ContentType.QUESTION, getId(), getWriter(), LocalDateTime.now())); deleteHistories.addAll(answers.deleteAll(user)); From cd6320e87fe23bab64d79ae4d4230ab2e33a2e68 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:49:34 +0900 Subject: [PATCH 14/17] =?UTF-8?q?refactor:=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20deleteWithHistory=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=B1=85=EC=9E=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/qna/domain/Answer.java | 10 +++++++++- src/main/java/nextstep/qna/domain/Answers.java | 2 +- src/main/java/nextstep/qna/domain/Question.java | 15 ++++++++++++--- .../java/nextstep/qna/service/QnAService.java | 2 +- src/test/java/nextstep/qna/domain/AnswerTest.java | 8 ++++---- .../java/nextstep/qna/domain/QuestionTest.java | 8 ++++---- 6 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Answer.java b/src/main/java/nextstep/qna/domain/Answer.java index 9bf98126e..0f53825cc 100644 --- a/src/main/java/nextstep/qna/domain/Answer.java +++ b/src/main/java/nextstep/qna/domain/Answer.java @@ -44,11 +44,19 @@ public void toQuestion(Question question) { this.question = question; } - public List delete(NsUser user) throws CannotDeleteException { + public List deleteWithHistory(NsUser user) throws CannotDeleteException { + delete(user); + return createDeleteHistory(); + } + + private void delete(NsUser user) throws CannotDeleteException { if (!isOwner(user)) { throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); } markAsDeleted(); + } + + private List createDeleteHistory() { List deleteHistories = new ArrayList<>(); deleteHistories.add( new DeleteHistory(ContentType.ANSWER, getId(), getWriter(), LocalDateTime.now())); diff --git a/src/main/java/nextstep/qna/domain/Answers.java b/src/main/java/nextstep/qna/domain/Answers.java index 15fb1d7bb..0a95ee59a 100644 --- a/src/main/java/nextstep/qna/domain/Answers.java +++ b/src/main/java/nextstep/qna/domain/Answers.java @@ -30,7 +30,7 @@ public void add(Answer answer) { public List deleteAll(NsUser user) throws CannotDeleteException { List deleteHistories = new ArrayList<>(); for (Answer answer : answers) { - deleteHistories.addAll(answer.delete(user)); + deleteHistories.addAll(answer.deleteWithHistory(user)); } return deleteHistories; } diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index cd05b9efc..1ff4b7a30 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -37,15 +37,24 @@ public Answers getAnswers() { return answers; } - public List delete(NsUser user) throws CannotDeleteException { + public List deleteWithHistory(NsUser user) throws CannotDeleteException { + delete(user); + List histories = createDeleteHistory(user); + histories.addAll(answers.deleteAll(user)); + return histories; + } + + private void delete(NsUser user) throws CannotDeleteException { if (!isOwner(user)) { throw new CannotDeleteException("질문을 삭제할 권한이 없습니다."); } - List deleteHistories = new ArrayList<>(); markAsDeleted(); + } + + private List createDeleteHistory(NsUser user) throws CannotDeleteException { + List deleteHistories = new ArrayList<>(); deleteHistories.add( new DeleteHistory(ContentType.QUESTION, getId(), getWriter(), LocalDateTime.now())); - deleteHistories.addAll(answers.deleteAll(user)); return deleteHistories; } diff --git a/src/main/java/nextstep/qna/service/QnAService.java b/src/main/java/nextstep/qna/service/QnAService.java index a0a78ec97..6c14fff8c 100644 --- a/src/main/java/nextstep/qna/service/QnAService.java +++ b/src/main/java/nextstep/qna/service/QnAService.java @@ -26,7 +26,7 @@ public class QnAService { @Transactional public void deleteQuestion(NsUser loginUser, long questionId) throws CannotDeleteException { Question question = questionRepository.findById(questionId).orElseThrow(NotFoundException::new); - List deleteHistories = question.delete(loginUser); + List deleteHistories = question.deleteWithHistory(loginUser); deleteHistoryService.saveAll(deleteHistories); } } diff --git a/src/test/java/nextstep/qna/domain/AnswerTest.java b/src/test/java/nextstep/qna/domain/AnswerTest.java index a418c55d9..99bb2c0de 100644 --- a/src/test/java/nextstep/qna/domain/AnswerTest.java +++ b/src/test/java/nextstep/qna/domain/AnswerTest.java @@ -19,14 +19,14 @@ public class AnswerTest { @DisplayName("답변 작성자가 로그인 사용자일 경우 삭제 가능하다") @Test void shouldNotThrow_whenUserIsOwner() { - assertThatCode(() -> A1.delete(JAVAJIGI)) + assertThatCode(() -> A1.deleteWithHistory(JAVAJIGI)) .doesNotThrowAnyException(); } @DisplayName("답변 중 다른 사람이 쓴 답변이 있는 경우 삭제 불가하다") @Test void shouldThrow_whenUserAndWriterDifferent() { - assertThatThrownBy(() -> A1.delete(SANJIGI)) + assertThatThrownBy(() -> A1.deleteWithHistory(SANJIGI)) .isInstanceOf(CannotDeleteException.class) .hasMessageContaining("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); } @@ -34,14 +34,14 @@ void shouldThrow_whenUserAndWriterDifferent() { @DisplayName("답변 작성자가 삭제할 경우 상태가 변경된다") @Test void shouldChangeDeletedStatus_whenDeleteByOwner() throws CannotDeleteException { - A1.delete(JAVAJIGI); + A1.deleteWithHistory(JAVAJIGI); assertThat(A1.isDeleted()).isTrue(); } @DisplayName("삭제 시 삭제 이력을 반환한다") @Test void shouldReturnDeleteHistory_whenDeletePossible() throws CannotDeleteException { - assertThat(A1.delete(JAVAJIGI)).hasSize(1); + assertThat(A1.deleteWithHistory(JAVAJIGI)).hasSize(1); } } diff --git a/src/test/java/nextstep/qna/domain/QuestionTest.java b/src/test/java/nextstep/qna/domain/QuestionTest.java index 704737e31..1212913a6 100644 --- a/src/test/java/nextstep/qna/domain/QuestionTest.java +++ b/src/test/java/nextstep/qna/domain/QuestionTest.java @@ -19,14 +19,14 @@ public class QuestionTest { @DisplayName("질문 작성자는 자신의 질문을 삭제할 수 있다") @Test void shouldNotThrow_whenUserIsOwnerAndNoOtherAnswers() { - assertThatCode(() -> Q2.delete(SANJIGI)) + assertThatCode(() -> Q2.deleteWithHistory(SANJIGI)) .doesNotThrowAnyException(); } @DisplayName("질문자와 로그인 사용자가 다른 경우 삭제 불가하다") @Test void shouldThrow_whenUserAndWriterDifferent() { - assertThatThrownBy(() -> Q1.delete(SANJIGI)) + assertThatThrownBy(() -> Q1.deleteWithHistory(SANJIGI)) .isInstanceOf(CannotDeleteException.class) .hasMessageContaining("질문을 삭제할 권한이 없습니다"); } @@ -34,13 +34,13 @@ void shouldThrow_whenUserAndWriterDifferent() { @DisplayName("삭제 가능한 경우 상태가 변경된다") @Test void shouldChangeDeletedStatus_whenDeleteByOwner() throws CannotDeleteException { - Q2.delete(SANJIGI); + Q2.deleteWithHistory(SANJIGI); assertThat(Q2.isDeleted()).isTrue(); } @DisplayName("삭제 시 삭제 이력을 반환한다") @Test void shouldReturnDeleteHistory_whenDeletePossible() throws CannotDeleteException { - assertThat(Q1.delete(JAVAJIGI)).hasSize(1); + assertThat(Q1.deleteWithHistory(JAVAJIGI)).hasSize(1); } } From 9307cb13e3276c95da53432bca6431a9d2747a75 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Fri, 12 Dec 2025 05:40:21 +0900 Subject: [PATCH 15/17] =?UTF-8?q?refactor:=20BaseEntity=EB=A5=BC=20SoftDel?= =?UTF-8?q?etableBaseEntity=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/qna/domain/Answer.java | 2 +- src/main/java/nextstep/qna/domain/Question.java | 2 +- .../domain/{BaseEntity.java => SoftDeletableBaseEntity.java} | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/nextstep/qna/domain/{BaseEntity.java => SoftDeletableBaseEntity.java} (80%) diff --git a/src/main/java/nextstep/qna/domain/Answer.java b/src/main/java/nextstep/qna/domain/Answer.java index 0f53825cc..e120a1654 100644 --- a/src/main/java/nextstep/qna/domain/Answer.java +++ b/src/main/java/nextstep/qna/domain/Answer.java @@ -8,7 +8,7 @@ import nextstep.qna.UnAuthorizedException; import nextstep.users.domain.NsUser; -public class Answer extends BaseEntity { +public class Answer extends SoftDeletableBaseEntity { private Question question; diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index 1ff4b7a30..08bfad050 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -6,7 +6,7 @@ import nextstep.qna.CannotDeleteException; import nextstep.users.domain.NsUser; -public class Question extends BaseEntity { +public class Question extends SoftDeletableBaseEntity { private QuestionContent content; private Answers answers = new Answers(); diff --git a/src/main/java/nextstep/qna/domain/BaseEntity.java b/src/main/java/nextstep/qna/domain/SoftDeletableBaseEntity.java similarity index 80% rename from src/main/java/nextstep/qna/domain/BaseEntity.java rename to src/main/java/nextstep/qna/domain/SoftDeletableBaseEntity.java index 2786398dc..00ede7778 100644 --- a/src/main/java/nextstep/qna/domain/BaseEntity.java +++ b/src/main/java/nextstep/qna/domain/SoftDeletableBaseEntity.java @@ -2,7 +2,7 @@ import nextstep.users.domain.NsUser; -public abstract class BaseEntity extends BaseTimeEntity { +public abstract class SoftDeletableBaseEntity extends BaseTimeEntity { private Long id; @@ -10,7 +10,7 @@ public abstract class BaseEntity extends BaseTimeEntity { private boolean deleted = false; - protected BaseEntity(Long id, NsUser writer) { + protected SoftDeletableBaseEntity(Long id, NsUser writer) { this.id = id; this.writer = writer; } From d9aee8d8644a5119220324bcfd8863e3ec5234ba Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Fri, 12 Dec 2025 05:42:50 +0900 Subject: [PATCH 16/17] =?UTF-8?q?refactor:=20markAsDeleted=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=20=EC=A0=9C=EC=96=B4=EC=9E=90=EB=A5=BC=20protected?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/qna/domain/SoftDeletableBaseEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/nextstep/qna/domain/SoftDeletableBaseEntity.java b/src/main/java/nextstep/qna/domain/SoftDeletableBaseEntity.java index 00ede7778..9c0dd9a0c 100644 --- a/src/main/java/nextstep/qna/domain/SoftDeletableBaseEntity.java +++ b/src/main/java/nextstep/qna/domain/SoftDeletableBaseEntity.java @@ -23,7 +23,7 @@ public NsUser getWriter() { return writer; } - public void markAsDeleted() { + protected void markAsDeleted() { this.deleted = true; } From f9678441317aea97f72a733776302b9d966cef27 Mon Sep 17 00:00:00 2001 From: username0w <163955522+username0w@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:20:16 +0900 Subject: [PATCH 17/17] =?UTF-8?q?refactor:=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EB=B3=80=EA=B2=BD=EA=B3=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/qna/domain/Answer.java | 9 ++------- src/main/java/nextstep/qna/domain/Answers.java | 10 ++++++++-- src/main/java/nextstep/qna/domain/Question.java | 13 ++++--------- src/main/java/nextstep/qna/service/QnAService.java | 6 ++---- src/test/java/nextstep/qna/domain/AnswerTest.java | 12 ++++++------ src/test/java/nextstep/qna/domain/AnswersTest.java | 9 ++++----- src/test/java/nextstep/qna/domain/QuestionTest.java | 8 ++++---- 7 files changed, 30 insertions(+), 37 deletions(-) diff --git a/src/main/java/nextstep/qna/domain/Answer.java b/src/main/java/nextstep/qna/domain/Answer.java index e120a1654..e72f8f552 100644 --- a/src/main/java/nextstep/qna/domain/Answer.java +++ b/src/main/java/nextstep/qna/domain/Answer.java @@ -44,19 +44,14 @@ public void toQuestion(Question question) { this.question = question; } - public List deleteWithHistory(NsUser user) throws CannotDeleteException { - delete(user); - return createDeleteHistory(); - } - - private void delete(NsUser user) throws CannotDeleteException { + public void delete(NsUser user) throws CannotDeleteException { if (!isOwner(user)) { throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); } markAsDeleted(); } - private List createDeleteHistory() { + public List toDeleteHistories() { List deleteHistories = new ArrayList<>(); deleteHistories.add( new DeleteHistory(ContentType.ANSWER, getId(), getWriter(), LocalDateTime.now())); diff --git a/src/main/java/nextstep/qna/domain/Answers.java b/src/main/java/nextstep/qna/domain/Answers.java index 0a95ee59a..02db7eee4 100644 --- a/src/main/java/nextstep/qna/domain/Answers.java +++ b/src/main/java/nextstep/qna/domain/Answers.java @@ -27,10 +27,16 @@ public void add(Answer answer) { answers.add(answer); } - public List deleteAll(NsUser user) throws CannotDeleteException { + public void delete(NsUser user) throws CannotDeleteException { + for (Answer answer : answers) { + answer.delete(user); + } + } + + public List toDeleteHistories() throws CannotDeleteException { List deleteHistories = new ArrayList<>(); for (Answer answer : answers) { - deleteHistories.addAll(answer.deleteWithHistory(user)); + deleteHistories.addAll(answer.toDeleteHistories()); } return deleteHistories; } diff --git a/src/main/java/nextstep/qna/domain/Question.java b/src/main/java/nextstep/qna/domain/Question.java index 08bfad050..1ae59c08d 100644 --- a/src/main/java/nextstep/qna/domain/Question.java +++ b/src/main/java/nextstep/qna/domain/Question.java @@ -37,24 +37,19 @@ public Answers getAnswers() { return answers; } - public List deleteWithHistory(NsUser user) throws CannotDeleteException { - delete(user); - List histories = createDeleteHistory(user); - histories.addAll(answers.deleteAll(user)); - return histories; - } - - private void delete(NsUser user) throws CannotDeleteException { + public void delete(NsUser user) throws CannotDeleteException { if (!isOwner(user)) { throw new CannotDeleteException("질문을 삭제할 권한이 없습니다."); } markAsDeleted(); + answers.delete(user); } - private List createDeleteHistory(NsUser user) throws CannotDeleteException { + public List toDeleteHistories() throws CannotDeleteException { List deleteHistories = new ArrayList<>(); deleteHistories.add( new DeleteHistory(ContentType.QUESTION, getId(), getWriter(), LocalDateTime.now())); + deleteHistories.addAll(answers.toDeleteHistories()); return deleteHistories; } diff --git a/src/main/java/nextstep/qna/service/QnAService.java b/src/main/java/nextstep/qna/service/QnAService.java index 6c14fff8c..c591494ae 100644 --- a/src/main/java/nextstep/qna/service/QnAService.java +++ b/src/main/java/nextstep/qna/service/QnAService.java @@ -1,11 +1,9 @@ package nextstep.qna.service; -import java.util.List; import javax.annotation.Resource; import nextstep.qna.CannotDeleteException; import nextstep.qna.NotFoundException; import nextstep.qna.domain.AnswerRepository; -import nextstep.qna.domain.DeleteHistory; import nextstep.qna.domain.Question; import nextstep.qna.domain.QuestionRepository; import nextstep.users.domain.NsUser; @@ -26,7 +24,7 @@ public class QnAService { @Transactional public void deleteQuestion(NsUser loginUser, long questionId) throws CannotDeleteException { Question question = questionRepository.findById(questionId).orElseThrow(NotFoundException::new); - List deleteHistories = question.deleteWithHistory(loginUser); - deleteHistoryService.saveAll(deleteHistories); + question.delete(loginUser); + deleteHistoryService.saveAll(question.toDeleteHistories()); } } diff --git a/src/test/java/nextstep/qna/domain/AnswerTest.java b/src/test/java/nextstep/qna/domain/AnswerTest.java index 99bb2c0de..7e48e33b1 100644 --- a/src/test/java/nextstep/qna/domain/AnswerTest.java +++ b/src/test/java/nextstep/qna/domain/AnswerTest.java @@ -19,14 +19,14 @@ public class AnswerTest { @DisplayName("답변 작성자가 로그인 사용자일 경우 삭제 가능하다") @Test void shouldNotThrow_whenUserIsOwner() { - assertThatCode(() -> A1.deleteWithHistory(JAVAJIGI)) + assertThatCode(() -> A1.delete(JAVAJIGI)) .doesNotThrowAnyException(); } @DisplayName("답변 중 다른 사람이 쓴 답변이 있는 경우 삭제 불가하다") @Test void shouldThrow_whenUserAndWriterDifferent() { - assertThatThrownBy(() -> A1.deleteWithHistory(SANJIGI)) + assertThatThrownBy(() -> A1.delete(SANJIGI)) .isInstanceOf(CannotDeleteException.class) .hasMessageContaining("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); } @@ -34,14 +34,14 @@ void shouldThrow_whenUserAndWriterDifferent() { @DisplayName("답변 작성자가 삭제할 경우 상태가 변경된다") @Test void shouldChangeDeletedStatus_whenDeleteByOwner() throws CannotDeleteException { - A1.deleteWithHistory(JAVAJIGI); + A1.delete(JAVAJIGI); assertThat(A1.isDeleted()).isTrue(); } - @DisplayName("삭제 시 삭제 이력을 반환한다") + @DisplayName("삭제 이력을 반환한다") @Test - void shouldReturnDeleteHistory_whenDeletePossible() throws CannotDeleteException { - assertThat(A1.deleteWithHistory(JAVAJIGI)).hasSize(1); + void returnDeleteHistory() throws CannotDeleteException { + assertThat(A1.toDeleteHistories()).hasSize(1); } } diff --git a/src/test/java/nextstep/qna/domain/AnswersTest.java b/src/test/java/nextstep/qna/domain/AnswersTest.java index 1bf4eae3e..4aee60595 100644 --- a/src/test/java/nextstep/qna/domain/AnswersTest.java +++ b/src/test/java/nextstep/qna/domain/AnswersTest.java @@ -2,7 +2,6 @@ import static nextstep.qna.domain.AnswerTest.A1; import static nextstep.qna.domain.AnswerTest.A3; -import static nextstep.users.domain.NsUserTest.JAVAJIGI; import static org.assertj.core.api.Assertions.assertThat; import nextstep.qna.CannotDeleteException; @@ -11,16 +10,16 @@ class AnswersTest { - @DisplayName("답변들을 삭제 시 삭제 이력을 반환한다") + @DisplayName("삭제 이력을 반환한다") @Test - void shouldReturnDeleteHistory_whenDeletePossible() throws CannotDeleteException { + void returnDeleteHistory() throws CannotDeleteException { Answers answers = new Answers(A1, A3); - assertThat(answers.deleteAll(JAVAJIGI)).hasSize(2); + assertThat(answers.toDeleteHistories()).hasSize(2); } @DisplayName("Answers에 Answer를 추가할 수 있다") @Test - void shouldAddAnswerToAnswers() { + void addAnswerToAnswers() { Answers answers = new Answers(A1); answers.add(A3); assertThat(answers.answers()).hasSize(2); diff --git a/src/test/java/nextstep/qna/domain/QuestionTest.java b/src/test/java/nextstep/qna/domain/QuestionTest.java index 1212913a6..5353a3457 100644 --- a/src/test/java/nextstep/qna/domain/QuestionTest.java +++ b/src/test/java/nextstep/qna/domain/QuestionTest.java @@ -19,14 +19,14 @@ public class QuestionTest { @DisplayName("질문 작성자는 자신의 질문을 삭제할 수 있다") @Test void shouldNotThrow_whenUserIsOwnerAndNoOtherAnswers() { - assertThatCode(() -> Q2.deleteWithHistory(SANJIGI)) + assertThatCode(() -> Q2.delete(SANJIGI)) .doesNotThrowAnyException(); } @DisplayName("질문자와 로그인 사용자가 다른 경우 삭제 불가하다") @Test void shouldThrow_whenUserAndWriterDifferent() { - assertThatThrownBy(() -> Q1.deleteWithHistory(SANJIGI)) + assertThatThrownBy(() -> Q1.delete(SANJIGI)) .isInstanceOf(CannotDeleteException.class) .hasMessageContaining("질문을 삭제할 권한이 없습니다"); } @@ -34,13 +34,13 @@ void shouldThrow_whenUserAndWriterDifferent() { @DisplayName("삭제 가능한 경우 상태가 변경된다") @Test void shouldChangeDeletedStatus_whenDeleteByOwner() throws CannotDeleteException { - Q2.deleteWithHistory(SANJIGI); + Q2.delete(SANJIGI); assertThat(Q2.isDeleted()).isTrue(); } @DisplayName("삭제 시 삭제 이력을 반환한다") @Test void shouldReturnDeleteHistory_whenDeletePossible() throws CannotDeleteException { - assertThat(Q1.deleteWithHistory(JAVAJIGI)).hasSize(1); + assertThat(Q1.toDeleteHistories()).hasSize(1); } }