ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -1,22 +1,36 @@
 package codesquad;
 
-import codesquad.repository.ArrayUserRepository;
+import codesquad.repository.QuestionRepositoryImpl;
+import codesquad.repository.UserRepositoryImpl;
+import codesquad.repository.QuestionRepository;
 import codesquad.repository.UserRepository;
+import codesquad.service.QuestionService;
+import codesquad.service.QuestionServiceImpl;
 import codesquad.service.UserService;
 import codesquad.service.UserServiceImpl;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration
 public class AppConfig {
-
+    
     @Bean
     public UserService userService() {
         return new UserServiceImpl(userRepository());
     }
 
     @Bean
     public UserRepository userRepository() {
-        return new ArrayUserRepository();
+        return new UserRepositoryImpl();
+    }
+
+    @Bean
+    public QuestionService questionService() {
+        return new QuestionServiceImpl(questionRepository());
+    }
+
+    @Bean
+    public QuestionRepository questionRepository() {
+        return new QuestionRepositoryImpl();
     }
 }

리뷰: 제어의 역전(IoC)가 무엇인지도 한 번 알아보시면 좋을 것 같습니다!
@@ -0,0 +1,30 @@
+package codesquad.service;
+
+import codesquad.entity.QuestionEntity;
+import codesquad.repository.QuestionRepository;
+
+import java.util.List;
+
+public class QuestionServiceImpl implements QuestionService {
+    private final QuestionRepository questionRepository;
+
+    public QuestionServiceImpl(QuestionRepository questionRepository) {
+        this.questionRepository = questionRepository;
+    }
+
+    @Override
+    public void postQuestion(QuestionEntity questionEntity) {
+        questionRepository.post(questionEntity);
+        questionRepository.setBaseTime(questionEntity);
+    }
+
+    @Override
+    public List<QuestionEntity> findQuestions() {
+        return questionRepository.findAll();
+    }
+
+    @Override
+    public QuestionEntity findQuestion(String id) {
+        return questionRepository.findAll().get(Integer.parseInt(id) - 1);
+    }
+}

리뷰: > > 엔티티를 이용해 데이터를 주고 받으면 어떤 문제가 있을지 고민해보시면 좋을 것 같습니다!
> 
> 네! 한번 고민해보겠습니다~ 혹시 상엽님이 말씀하신 데이터를 주고 받는 부분은 view(controller)와 주고받는다는 말씀이실까요?

컨트롤러 뿐 아니라 레이어드 아키텍쳐에서 각 계층간에 데이터를 주고 받는 것을 의미합니다!
@@ -7,6 +7,8 @@
 public interface UserRepository {
     void register(UserEntity userEntity);
 
+    void update(String userId, UserEntity userEntity);
+
     UserEntity findById(String userId);
 
     List<UserEntity> findAll();

리뷰: > dto <-> entity 사이의 맵핑을 어디서 해야할지 고민을 했는데요. DTO는 컨트롤러 레이어에 종속되어야 한다고 생각해 맵핑에 관련된 것은 모두 컨트롤러에서 두려고 하였습니다.
> 
> update()에 대한 부분은 피드백을 보고 다시 보니, 새로운 userEntity를 생성하는 register와 다르게 기존에 있는 userEntity를 수정하는 것이다보니 값을 update하는 방향에 집중했습니다. 그러다보니 DTO -> Entity도 새롭게 객체를 만든다는 생각에 거치지 않았네요.😅
> 
> 다시보니 register() 처럼 controller에서 entity로 바꿔서 넘겨지고 entity에 있는 값들을 repository에서 꺼내어 업데이트하는 방식으로 수정하고 싶은데 @saint6839 님의 생각은 어떠세요?
> 
> +) dto <-> entity는 어디에에 관한 부분은... 이전 리뷰에서도 질문드리기도 했고, 다양한 [토론글 1](https://okky.kr/articles/708060), [토론글 2](https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/) 등을 찾아보기도 했는데요~ 스스로 내린 작업 방향성은 **repository까지 들어가지 말 것, 프로젝트 내에 일관성을 유지할 것, (무엇보다) 같이 하는 사람이랑 맞출 것** 입니다.🙂 이 부분에 대해 상엽님의 생각도 들어보고 싶네요~

개인적으로는 Entity <-> Dto 변환 책임을 서비스 계층에 부여하는것을 선호하는 편입니다. 컨트롤러 계층의 메서드 네이밍은 비즈니스 용어를, 서비스 계층의 메서드 네이밍은 개발 용어를 사용한다는 영상을 본 적이 있습니다(아마도 김영한님). 

그만큼 컨트롤러 계층은 개발적인 요소보다는 사용자로부터 들어온 요청을 처리하는데 책임이 집중되어야 하는 계층이라고 생각합니다. 이러한 이유 때문에 저는 서비스 계층에서 Entity와 Dto 변환을 다루는 것을 선호하는 편입니다. 

정답은 없는 것 같지만 본인이 선호하는 방법이 있다면, 그 근거에 대해서 생각해보시면 좋을 것 같아요(단순히 대부분 사람들이 그렇다고 해서가 아닌..)
@@ -7,6 +7,8 @@
 public interface UserRepository {
     void register(UserEntity userEntity);
 
+    void update(String userId, UserEntity userEntity);
+
     UserEntity findById(String userId);
 
     List<UserEntity> findAll();

리뷰: @saint6839 
저는 service(application or usecase), domain 은 외부의 것으로부터 독립적이고 최대한 순수한 응답을 보내야 사용성이 좋아진다고 생각합니다.
따라서 service 레이어에서는 외부 요구사항에 해당하는 데이터 구조인 dto 변환을 지양하도록 개발하는 편입니다. 실제 서비스에서 개발하다보면 1controller - 1service 가 아니라 n개의 controller 케이스에서 서로 다른 목적으로 1service 를 호출하는 케이스도 있으니 각자가 필요한 데이터가 다를 경우, dto 가 공통으로 사용되어서 뚱뚱해지고 무엇이 어떤 케이스에 꼭 필요한 데이터인지 구분하기도 어려워집니다. 그리고 서로의 변경에 영향도 많이 받구요. 
그렇다고 entity 를 순수하게 그대로 반환하게 되면 OSIV 고민에 빠지게 됩니다. 그래서 좀 복잡한 코드에서는 Service layer DTO 를 따로 정의해서 그것으로 변환하여 공통적으로 반환해주고, controller 에서는 service dto 를 받아서 필요한 부분들을 다시 controller layer dto 로 변환해서 사용하기도 합니다. 너무 클래스가 많아지고 오히려 복잡해진다는 경향이 있어서 이런 토이플젝에서는 추천하지 않지만 이런 부분도 있구나 하고 넘기셔도 좋을 것 같아서 공유드립니다 ~ 
이 케이스에서는 작은 규모이니 그냥 service layer 에서 dto 변환을 하는 것을 추천합니다 ~
@@ -0,0 +1,30 @@
+package codesquad.service;
+
+import codesquad.entity.QuestionEntity;
+import codesquad.repository.QuestionRepository;
+
+import java.util.List;
+
+public class QuestionServiceImpl implements QuestionService {
+    private final QuestionRepository questionRepository;
+
+    public QuestionServiceImpl(QuestionRepository questionRepository) {
+        this.questionRepository = questionRepository;
+    }
+
+    @Override
+    public void postQuestion(QuestionEntity questionEntity) {
+        questionRepository.post(questionEntity);
+        questionRepository.setBaseTime(questionEntity);
+    }
+
+    @Override
+    public List<QuestionEntity> findQuestions() {
+        return questionRepository.findAll();
+    }
+
+    @Override
+    public QuestionEntity findQuestion(String id) {
+        return questionRepository.findAll().get(Integer.parseInt(id) - 1);
+    }
+}

리뷰: 아직 1단계라서 이런 부분에 대한 코멘트는 좀 더 친절히 설명해주어도 좋을 것 같습니다.
@@ -0,0 +1,24 @@
+package codesquad.entity;
+
+import lombok.*;
+
+@Setter
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class QuestionEntity extends BaseTimeEntity {
+
+    private String writer;
+    private String title;
+    private String contents;
+
+    @Override
+    public String toString() {
+        return "QuestionEntity{" +
+                "writer='" + writer + '\'' +
+                ", title='" + title + '\'' +
+                ", contents='" + contents + '\'' +
+                '}';
+    }
+}

리뷰: @hyukjin-lee class명 말씀하실까요??
@@ -0,0 +1,45 @@
+package codesquad.mapper;
+
+import codesquad.dto.question.QuestionRequestDto;
+import codesquad.dto.question.QuestionResponseDto;
+import codesquad.entity.QuestionEntity;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class QuestionMapper {
+
+    public static QuestionEntity dtoToEntity(QuestionRequestDto questionRequestDto) {
+        if (questionRequestDto == null){
+            return null;
+        }
+
+        QuestionEntity.QuestionEntityBuilder questionEntity = QuestionEntity.builder();
+
+        questionEntity.writer(questionRequestDto.getWriter());
+        questionEntity.title(questionRequestDto.getTitle());
+        questionEntity.contents(questionRequestDto.getContents());
+
+        return questionEntity.build();
+    }
+
+    public static QuestionResponseDto entityToDto(QuestionEntity questionEntity) {
+        if (questionEntity == null) {
+            return null;
+        }
+
+        QuestionResponseDto.QuestionResponseDtoBuilder questionResponseDto = QuestionResponseDto.builder();
+
+        questionResponseDto.writer(questionEntity.getWriter());
+        questionResponseDto.title(questionEntity.getTitle());
+        questionResponseDto.contents(questionEntity.getContents());
+        questionResponseDto.date(localTimeToString(questionEntity.getCreatedDate()));
+
+        return questionResponseDto.build();
+    }
+
+    public static String localTimeToString(LocalDateTime localDateTime) {
+        String stringLocalTime = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
+        return stringLocalTime;
+    }
+}

리뷰: @hyukjin-lee 넵!!! 기억하겠습니다. 이번에는 변경 가능성을 열어두는 setter 사용을 지양하고, 필요한 데이터만 설정하고 싶어 Builder 패턴을 사용해보았습니다~
@@ -1,10 +1,15 @@
 package codesquad.user;
 
 
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
 import javax.persistence.*;
 import java.util.Objects;
 
 @Entity
+@NoArgsConstructor
+@Getter
 public class User {
 
     @Id
@@ -20,43 +25,14 @@ public class User {
 
     private String email;
 
-    public String getUserId() {
-        return userId;
-    }
-
-    public void setUserId(String userId) {
-        this.userId = userId;
-    }
-
-    public String getPassword() {
-        return password;
+    User(SignUpUserDto signUpUserDto) {
+        userId = signUpUserDto.getUserId();
+        password = signUpUserDto.getPassword();
+        name = signUpUserDto.getName();
+        email = signUpUserDto.getEmail();
     }
 
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getEmail() {
-        return email;
-    }
-
-    public void setEmail(String email) {
-        this.email = email;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void update(User user) {
+    public void update(SignUpUserDto user) {
         if (equalsPassword(user.getPassword())) {
             name = user.getName();
             email = user.getEmail();
@@ -67,6 +43,10 @@ public boolean equalsPassword(String password) {
         return this.password.equals(password);
     }
 
+    public boolean equalsPassword(LoginUserDto loginUserDto) {
+        return password.equals(loginUserDto.getPassword());
+    }
+
     public boolean equalsId(Long id) {
         return this.id.equals(id);
     }
@@ -76,15 +56,11 @@ public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         User user = (User) o;
-        return Objects.equals(getId(), user.getId()) &&
-                Objects.equals(getUserId(), user.getUserId()) &&
-                Objects.equals(getPassword(), user.getPassword()) &&
-                Objects.equals(getName(), user.getName()) &&
-                Objects.equals(getEmail(), user.getEmail());
+        return Objects.equals(getId(), user.getId());
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(getId(), getUserId(), getPassword(), getName(), getEmail());
+        return Objects.hash(getId());
     }
 }

리뷰: 저번에 말씀해주신 equals에 대한 리뷰 생각해봤습니다

말씀대로 관계형 DB에서는 "식별자(id)" 가 고유한 값으로, 해당 식별자가 동일하다면 같은 데이터라고 인식하는데 equals를 overriding한다면 모든 필드의 값이 동일해야 같은 객체라고 판단합니다

equals를 굳이 overriding할 필요없는 상황에서 overriding을 한다면 HashSet이나 HashMap에 영향을 주어 예상치 못한 상황이 발생할 수도 있습니다

따라서 User를 식별하기 위해서는 "id"로 충분하기 때문에 equals를 overriding하지 않아도된다 라는 생각입니다
@@ -0,0 +1,62 @@
+package codesquad.answer;
+
+import codesquad.qua.Question;
+import codesquad.qua.QuestionRepository;
+import codesquad.response.Result;
+import codesquad.user.User;
+import codesquad.utils.SessionUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpSession;
+import java.util.NoSuchElementException;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class AnswerService {
+
+    private final AnswerRepository answerRepository;
+    private final QuestionRepository questionRepository;
+
+    public Result<ResponseAnswerDto> create(long questionId, RequestAnswerDto requestAnswerDto, HttpSession session) {
+        log.info("comment = {}", requestAnswerDto.getComment());
+
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Question question = questionRepository.findById(questionId)
+                .orElseThrow(NoSuchElementException::new);
+
+        Answer answer = new Answer(question, user, requestAnswerDto.getComment());
+        answer.addQuestion(question);
+        answerRepository.save(answer);
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+
+    @Transactional
+    public Result<ResponseAnswerDto> remove(long questionId, long answerId, HttpSession session) {
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Answer answer = answerRepository.findQuestionFetchJoinById(answerId)
+                .orElseThrow(NoSuchElementException::new);
+
+        if (!answer.equalsWriter(user)) {
+            return Result.fail("다른 사람 답글은 삭제 못해요");
+        }
+
+        answer.changeDeletedFlag();
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+}
\ No newline at end of file

리뷰: Answer의 비즈니스 로직을 담당하는 AnswerService에서 Question관련 데이터가 필요할 때 QuestionRepository를 직접 참조하는 방법도 있지만, QuestionService를 통해 참조하도록 할 수도 있을 거 같은데 어떤 차이가 있을까요?
@@ -0,0 +1,62 @@
+package codesquad.answer;
+
+import codesquad.qua.Question;
+import codesquad.qua.QuestionRepository;
+import codesquad.response.Result;
+import codesquad.user.User;
+import codesquad.utils.SessionUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpSession;
+import java.util.NoSuchElementException;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class AnswerService {
+
+    private final AnswerRepository answerRepository;
+    private final QuestionRepository questionRepository;
+
+    public Result<ResponseAnswerDto> create(long questionId, RequestAnswerDto requestAnswerDto, HttpSession session) {
+        log.info("comment = {}", requestAnswerDto.getComment());
+
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Question question = questionRepository.findById(questionId)
+                .orElseThrow(NoSuchElementException::new);
+
+        Answer answer = new Answer(question, user, requestAnswerDto.getComment());
+        answer.addQuestion(question);
+        answerRepository.save(answer);
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+
+    @Transactional
+    public Result<ResponseAnswerDto> remove(long questionId, long answerId, HttpSession session) {
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Answer answer = answerRepository.findQuestionFetchJoinById(answerId)
+                .orElseThrow(NoSuchElementException::new);
+
+        if (!answer.equalsWriter(user)) {
+            return Result.fail("다른 사람 답글은 삭제 못해요");
+        }
+
+        answer.changeDeletedFlag();
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+}
\ No newline at end of file

리뷰: Answer를 db에서 조회하는 로직 다음 세션 유저 체크가 이뤄지고 있습니다. 개선할 점이 있어보이는데 어떻게 생각하시나요?
@@ -0,0 +1,27 @@
+package codesquad.answer;
+
+import codesquad.response.Result;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpSession;
+
+@RestController
+@RequiredArgsConstructor
+@Slf4j
+public class ApiAnswerController {
+
+    private final AnswerService answerService;
+
+    @PostMapping("/questions/{question-id}/answers")
+    public Result<ResponseAnswerDto> create(@PathVariable("question-id") Long questionId, @RequestBody RequestAnswerDto requestAnswerDto, HttpSession session) {
+        return answerService.create(questionId, requestAnswerDto, session);
+    }
+
+    @DeleteMapping("/questions/{question-id}/answers/{answer-id}")
+    public Result<ResponseAnswerDto> remove(@PathVariable("question-id") Long questionId,
+                                            @PathVariable("answer-id") Long answerId, HttpSession session) {
+        return answerService.remove(questionId, answerId, session);
+    }
+}

리뷰: 이 요청의 응답 상태코드는 어떻게 나갈까요?
@@ -0,0 +1,62 @@
+package codesquad.answer;
+
+import codesquad.qua.Question;
+import codesquad.qua.QuestionRepository;
+import codesquad.response.Result;
+import codesquad.user.User;
+import codesquad.utils.SessionUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpSession;
+import java.util.NoSuchElementException;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class AnswerService {
+
+    private final AnswerRepository answerRepository;
+    private final QuestionRepository questionRepository;
+
+    public Result<ResponseAnswerDto> create(long questionId, RequestAnswerDto requestAnswerDto, HttpSession session) {
+        log.info("comment = {}", requestAnswerDto.getComment());
+
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Question question = questionRepository.findById(questionId)
+                .orElseThrow(NoSuchElementException::new);
+
+        Answer answer = new Answer(question, user, requestAnswerDto.getComment());
+        answer.addQuestion(question);
+        answerRepository.save(answer);
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+
+    @Transactional
+    public Result<ResponseAnswerDto> remove(long questionId, long answerId, HttpSession session) {
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Answer answer = answerRepository.findQuestionFetchJoinById(answerId)
+                .orElseThrow(NoSuchElementException::new);
+
+        if (!answer.equalsWriter(user)) {
+            return Result.fail("다른 사람 답글은 삭제 못해요");
+        }
+
+        answer.changeDeletedFlag();
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+}
\ No newline at end of file

리뷰: ResponseAnswerDto를 Result로 한번 더 감싸는 방식으로 구현하셨는데 어떤 이유가 있을까요?
@@ -0,0 +1,62 @@
+package codesquad.answer;
+
+import codesquad.qua.Question;
+import codesquad.qua.QuestionRepository;
+import codesquad.response.Result;
+import codesquad.user.User;
+import codesquad.utils.SessionUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpSession;
+import java.util.NoSuchElementException;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class AnswerService {
+
+    private final AnswerRepository answerRepository;
+    private final QuestionRepository questionRepository;
+
+    public Result<ResponseAnswerDto> create(long questionId, RequestAnswerDto requestAnswerDto, HttpSession session) {
+        log.info("comment = {}", requestAnswerDto.getComment());
+
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Question question = questionRepository.findById(questionId)
+                .orElseThrow(NoSuchElementException::new);
+
+        Answer answer = new Answer(question, user, requestAnswerDto.getComment());
+        answer.addQuestion(question);
+        answerRepository.save(answer);
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+
+    @Transactional
+    public Result<ResponseAnswerDto> remove(long questionId, long answerId, HttpSession session) {
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Answer answer = answerRepository.findQuestionFetchJoinById(answerId)
+                .orElseThrow(NoSuchElementException::new);
+
+        if (!answer.equalsWriter(user)) {
+            return Result.fail("다른 사람 답글은 삭제 못해요");
+        }
+
+        answer.changeDeletedFlag();
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+}
\ No newline at end of file

리뷰: 오,, 이 부분은 DB 접근은 무거운 작업이기 때문에 세션을 체크하고 나서 DB 접근하는 것이 좋아보입니다
감사합니다!
@@ -0,0 +1,62 @@
+package codesquad.answer;
+
+import codesquad.qua.Question;
+import codesquad.qua.QuestionRepository;
+import codesquad.response.Result;
+import codesquad.user.User;
+import codesquad.utils.SessionUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpSession;
+import java.util.NoSuchElementException;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class AnswerService {
+
+    private final AnswerRepository answerRepository;
+    private final QuestionRepository questionRepository;
+
+    public Result<ResponseAnswerDto> create(long questionId, RequestAnswerDto requestAnswerDto, HttpSession session) {
+        log.info("comment = {}", requestAnswerDto.getComment());
+
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Question question = questionRepository.findById(questionId)
+                .orElseThrow(NoSuchElementException::new);
+
+        Answer answer = new Answer(question, user, requestAnswerDto.getComment());
+        answer.addQuestion(question);
+        answerRepository.save(answer);
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+
+    @Transactional
+    public Result<ResponseAnswerDto> remove(long questionId, long answerId, HttpSession session) {
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Answer answer = answerRepository.findQuestionFetchJoinById(answerId)
+                .orElseThrow(NoSuchElementException::new);
+
+        if (!answer.equalsWriter(user)) {
+            return Result.fail("다른 사람 답글은 삭제 못해요");
+        }
+
+        answer.changeDeletedFlag();
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+}
\ No newline at end of file

리뷰: 이 부분만 그런게 아니라 다른 곳도 그렇게 작성되어있네요!!
@@ -0,0 +1,62 @@
+package codesquad.answer;
+
+import codesquad.qua.Question;
+import codesquad.qua.QuestionRepository;
+import codesquad.response.Result;
+import codesquad.user.User;
+import codesquad.utils.SessionUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpSession;
+import java.util.NoSuchElementException;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class AnswerService {
+
+    private final AnswerRepository answerRepository;
+    private final QuestionRepository questionRepository;
+
+    public Result<ResponseAnswerDto> create(long questionId, RequestAnswerDto requestAnswerDto, HttpSession session) {
+        log.info("comment = {}", requestAnswerDto.getComment());
+
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Question question = questionRepository.findById(questionId)
+                .orElseThrow(NoSuchElementException::new);
+
+        Answer answer = new Answer(question, user, requestAnswerDto.getComment());
+        answer.addQuestion(question);
+        answerRepository.save(answer);
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+
+    @Transactional
+    public Result<ResponseAnswerDto> remove(long questionId, long answerId, HttpSession session) {
+        User user = SessionUtil.getUserBySession(session);
+
+        if (user == null) {
+            return Result.fail("로그인 하세요");
+        }
+
+        Answer answer = answerRepository.findQuestionFetchJoinById(answerId)
+                .orElseThrow(NoSuchElementException::new);
+
+        if (!answer.equalsWriter(user)) {
+            return Result.fail("다른 사람 답글은 삭제 못해요");
+        }
+
+        answer.changeDeletedFlag();
+
+        return Result.ok(answer.toResponseAnswerDto());
+    }
+}
\ No newline at end of file

리뷰: 미션 명세에서 Result를 반환하라고 해서 이렇게 작성했습니다!