댓글 생성하기
뷰 페이지에 입력 칸 만들기는 일단 제쳐 두고
Talend API Tester로 입력해보기
JSON 형태로 articleId, nickname, body를 입력해주고 send 버튼을 눌렀을 때 DB에 comment 가 추가되도록 구현하자
1. PostMapping 댓글 생성 요청을 받아 들인다.
2. 컨트롤러의 create 메서드가 입력받은 articleId에 해당하는 게시글에 @RequestBody를 이용해서 dto로 Comment dto로 받아온다.
컨트롤러의 역할은 요청을 인식하고 결과를 내보내는것, 자세한 처리는 CommentService로 넘긴다. -> CommentService에 위임
CommentDto createdDto = commentService.create(dto);
그럼 commentService에 create 메서드를 만들어야 한다.
create()의 기능은 다음과 같다.
1. DB에서 부모게시글을 조회하고 부모게시글이 없으면 예외 발생시키기
2. 부모 게시글의 새 댓글 엔티티 생성하기
3. 생성된 엔티티를 DB에 저장하기
4. DB에 저장한 엔티티를 DTO로 변환해 반환하기
이 과정 전체는 트랜잭션이 되야한다. DB의 내용을 바꾸는 작업이기 때문에 중간 오류나 예외 발생시 처음으로 돌려야 한다.- >transactional
1. DB에서 부모게시글 조회:
Article article = articleRepository.findbyid(articleid); 로 DB에 요청이 들어온 게시글 id와 일치하는게 있는지 찾는다.
뒤에 .orElseThrow()를 이용해 없으면 예외를 발생시킨다. 이때 IllegalArgumentException으로 메시지를 띄운다.
2. 부모 게시글의 새 댓글 엔티티 생성
엔티티는 입력받은 dto를 DB에 보내기 위한 틀이다.
Comment comment = Comment.createComment(dto, article);
입력 받은 dto를 1번에서 찾은 article(부모 게시글) 의 댓글로 만드는 메서드
Comment 클래스의 createComment에서 예외 처리후 엔티티를 생성하여 comment에 저장하면 된다.
발생가능한 예외
- 입력받은 댓글의 id가 이미 존재하는 경우 -> 예외
- 입력받은 댓글의 부모 게시글의 id와 엔티티에서 가져온 부모 게시글의 id가 다른 경우 -> 예외
그리고 엔티티를 return 해준다. return new Comment(dto.getId(), article, dto.getNickname(), dto.getBody());
3. 이제 comment에는 댓글 엔티티가 들어있다.
이를 리파지토리에 저장한다.
Comment created = commentRepository.save(comment);
4.DB에 저장이 완료가 되었고, 마지막으로 created 엔티티를 DTO로 변환해서 반환한다.
return CommentDto.createCommentDto(created);