게시판 12 - 댓글 기능 추가

JIWOO YUN·2024년 5월 7일
0

게시판만들기

목록 보기
12/21
post-custom-banner

질문과 답변에 댓글 기능을 추가해보자.

우선 댓글의 객체를 어떻게 만들지 생각해야한다.

Coment 객체에 들어가야 할 것이 뭐가 있을까?

  • question과 answer에 공용으로 사용하기 위해서 각자 관계를 연결시켜야한다.
    • coment의 경우 question 에 여러개를 달 수 있으니 다대일 관계
    • answer와도 여러개의 댓글을 달 수 있으니 일대다 관계를 마찬가지로 연결한다.

Coment 객체

@Entity
@NoArgsConstructor
@Getter
public class Coment {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createDate;

    private LocalDateTime modifyDate;

    @ManyToOne(fetch = FetchType.LAZY)
    private Question question;

    @ManyToOne(fetch = FetchType.LAZY)
    private Answer answer;

    @ManyToOne(fetch = FetchType.LAZY)
    private SiteUser author;

    public Coment(String content, LocalDateTime createDate,SiteUser author) {
        this.content = content;
        this.createDate = createDate;
        this.author = author;
    }

    public void AddQuestion(Question question){
        this.question = question;
    }

    public void AddAnswer(Answer answer){
        this.answer =answer;
    }

    public void updateComent(String content){
        this.content = content;
    }

}
  • addXXX 를 추가적으로 만들어둔 이유는 아무리 생각해도 setter 애노테이션을 통해서 다른 곳에서 set을 사용하게 하는 건 무분별하게 set을 사용할 수 있다는 위험성이 존재하기 때문에 이해를 할 수 있게 매서드를 만들어 두었다.
    • 마찬가지로 수정을 할때에도 이 매서드를 사용하면 수정한다는 걸 알기 위해서 updateComent를 추가해놓앗다.

answer 객체에 추가된 내용

@JsonIgnore
@OneToMany(mappedBy = "answer" ,cascade = CascadeType.REMOVE)
private List<Coment> comentList = new ArrayList<>();
  • cascade타입을 remove로 잡은 이유는 answer 가 삭제될 경우 coment도 전부 삭제되게 할려고 관계를 형성

Question객체에도 같은 방식으로 추가

@JsonIgnore
@OneToMany(mappedBy = "question",cascade = CascadeType.REMOVE)
private List<Coment> comentList = new ArrayList<>();

ComentController

@Controller
@RequiredArgsConstructor
@RequestMapping("/coment")
public class ComentController {

    private final QuestionService questionService;
    private final AnswerService answerService;
    private final ComentService comentService;

    private final UserService userService;


    @PreAuthorize("isAuthenticated()")
    @GetMapping("/create/question/{id}")
    public String createQuestionComent(ComentForm comentForm) {
        return "comment_form";
    }


    //질문 에 댓글 달때 사용
    //
    @PreAuthorize("isAuthenticated()")
    @PostMapping("/create/question/{id}")
    public String createQuestionComent(Model model, @PathVariable("id") Integer id,
                                       @Valid ComentForm comentForm, BindingResult bindingResult,
                                       Principal principal) {
        Question question = questionService.getQuestion(id);
        SiteUser user = userService.getUser(principal.getName());

        if (bindingResult.hasErrors()) {
            model.addAttribute("question", question);
            return "question_detail";
        }

        comentService.createQuestionComent(question, comentForm.getContent(), user);

        return String.format("redirect:/question/detail/%s", id);
    }

    @PreAuthorize("isAuthenticated()")
    @GetMapping("/create/answer/{id}")
    public String createAnswerComent(ComentForm comentForm) {
        return "comment_form";
    }

    @PreAuthorize("isAuthenticated()")
    @PostMapping("/create/answer/{id}")
    public String createAnswerComent(Model model, @PathVariable("id") Integer id,
                                     @Valid ComentForm comentForm, BindingResult bindingResult,
                                     Principal principal) {
        Answer answer = answerService.getAnswer(id);
        SiteUser user = userService.getUser(principal.getName());


        if (bindingResult.hasErrors()) {
            model.addAttribute("question", answer.getQuestion());
            return "question_detail";
        }
        comentService.createAnswerComent(answer, comentForm.getContent(), user);

        return String.format("redirect:/question/detail/%s", answer.getQuestion().getId());
    }
}
  • 질문에 대한 댓글이기 때문에 question.id가 필요하며 , 댓글을 쓴 사람이 누군지 알아야하기 때문에 user가 필요하다.
  • 답변의 댓글의 경우에도 answer.id가 필요하며, 댓글을 쓴사람이 누군지 알아야하기 때문에 user 가 필요
    • 답변의 경우 질문에 같은 페이지에서 달리기 때문에 답변의 댓글을 단 경우에도 질문으로 다시 돌아가야한다. -> 이의 경우 answer에 있는 question객체의 id를 통해서 돌아갈 수 있도록 추가.

질문과 답변에 댓글을 추가하는 방식까지 먼저 진행 했고 여기서 추가적으로 해야할 것은 수정과 삭제를 추가로 진행할 예정이다.

profile
열심히하자
post-custom-banner

0개의 댓글