Search
Duplicate

1. [클린 코드 with Java] 1단계 - Step1 레거시 코드 리팩터링

링크
점수
⭐️⭐️⭐️⭐️
완료일
2023/06/18
상태
완료
유형
인강

질문 삭제하기 요구사항

질문 데이터를 완전히 삭제하는 것이 아니라 데이터의 상태를 삭제 상태(deleted - boolean type)로 변경한다.
로그인 사용자와 질문한 사람이 같은 경우 삭제 가능하다.
답변이 없는 경우 삭제가 가능하다.
질문자와답변글의모든답변자같은경우삭제가가능하다.
질문을 삭제할 때 답변 또한 삭제해야 하며, 답변의 삭제 또한 삭제 상태(deleted)를 변경한다.
질문자와답변자가다른경우답변을삭제할수없다.
질문과 답변 삭제 이력에 대한 정보를 DeleteHistory를 활용해 남긴다.

리팩터링 요구사항

nextstep.qna.service.QnaService의 deleteQuestion()는 앞의 질문 삭제 기능을 구현한 코드이다. 이 메소드는 단위 테스트하기 어려운 코드와 단위 테스트 가능한 코드가 섞여 있다.
QnaService의 deleteQuestion() 메서드에 단위 테스트 가능한 코드(핵심 비지니스 로직)를 도메인 모델 객체에 구현한다.
QnaService의 비지니스 로직을 도메인 모델로 이동하는 리팩터링을 진행할 때 TDD로 구현한다.
QnaService의 deleteQuestion() 메서드에 대한 단위 테스트는 src/test/java 폴더 nextstep.qna.service.QnaServiceTest이다. 도메인 모델로 로직을 이동한 후에도 QnaServiceTest의 모든 테스트는 통과해야 한다.
public class QnAService { public void deleteQuestion(NsUser loginUser, long questionId) throws CannotDeleteException { Question question = questionRepository.findById(questionId).orElseThrow(NotFoundException::new); if (!question.isOwner(loginUser)) { throw new CannotDeleteException("질문을 삭제할 권한이 없습니다."); } List<Answer> answers = question.getAnswers(); for (Answer answer : answers) { if (!answer.isOwner(loginUser)) { throw new CannotDeleteException("다른 사람이 쓴 답변이 있어 삭제할 수 없습니다."); } } List<DeleteHistory> 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())); } deleteHistoryService.saveAll(deleteHistories); } }
Java
복사

피드백

리부어 : Service Layer 로직을 도메인 객체로 이동 너무 잘 했네요.  특별히 피드백할 부분이 보이지 않네요. 빠른 미션 진행을 위해 제가 대신 리뷰 진행했어요. 내일 강의 마지막 날이지만 2단계까지 한번 도전해 보시죠.
깃허브 링크 :
154
pull
출처