게시판 하단에 붙이 댓글 API를 만든다. 댓글 상세보기(댓글 하나를 보는 화면은 없지만 댓글 생성후 생성된 댓글을 추가하기 위해서 필요), 댓글 목록 보기, 댓글 생성, 댓글 수정, 댓글 삭제 이렇게 5개의 api를 만든다.
DTO 객체 생성
foreign key인 board_id 도 생성해준다. 나중에 사용자 테이블을 추가하면 사용자 키가 추가되어야 하고 좋아요 싫어요를 구현한다면 1:N 관계의 테이블이 더 추가되어야 할 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.eastflag.fullstack.domain; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; @JsonInclude(JsonInclude.Include.NON_NULL) @Data public class CommentVO { private Integer id; private String content; private String created; private String updated; private Integer board_id; } |
mapper 생성
insert 후에 자동으로 생성된 id를 돌려받고 싶을때 @Options(useGeneratedKeys = true, keyProperty = “id”) 를 사용하면 commentVO 객체의 id에 해당 값이 들어간다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com.eastflag.fullstack.persistence; import com.eastflag.fullstack.domain.CommentVO; import org.apache.ibatis.annotations.*; import java.util.List; @Mapper public interface CommentMapper { @Options(useGeneratedKeys = true, keyProperty = "id") @Insert({"<script>", "INSERT INTO comment(content, board_id)", "VALUES(#{content}, #{board_id})", "</script>"}) int insertComment(CommentVO commentVO); @Select({"<script>", "SELECT * from comment", "where id = #{id}", "</script>"}) CommentVO findOneComment(int id); @Select({"<script>", "SELECT * from comment", "order by id desc", "</script>"}) List<CommentVO> findComment(int board_id); @Update({"<script>", "UPDATE comment", "set content = #{content}", "WHERE id = #{id}", "</script>"}) int updateComment(CommentVO commentVO); @Delete({"<script>", "DELETE FROM comment", "WHERE id = #{id}", "</script>"}) int deleteComment(int id); } |
controller 생성
에러 처리나 예외처리는 생략하였다.
댓글 생성시 자동 생성된 id를 리턴받아서 댓글 객체를 리턴하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
package com.eastflag.fullstack.controller; import com.eastflag.fullstack.domain.CommentVO; import com.eastflag.fullstack.domain.ResultVO; import com.eastflag.fullstack.persistence.CommentMapper; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; @RequiredArgsConstructor @RestController @RequestMapping("/api") public class CommentController { private final CommentMapper commentMapper; @PostMapping("/comment") public CommentVO addComment(@RequestBody CommentVO commentVO) { commentMapper.insertComment(commentVO); return commentVO; } @GetMapping("/comment") public CommentVO findOneComment(@RequestParam Integer id) { return commentMapper.findOneComment(id); } @GetMapping("/comments") public List<CommentVO> findAllComment(@RequestParam Integer board_id) { List<CommentVO> comments = commentMapper.findComment(board_id); return comments; } @PutMapping("/comment") public ResultVO modifyComment(@RequestBody CommentVO commentVO) { int result = commentMapper.updateComment(commentVO); if ( result > 0) { return new ResultVO(0, "success"); } else { return new ResultVO(100, "fail"); } } @DeleteMapping("/comment") public ResultVO removeComment(@RequestParam int id) { int result = commentMapper.deleteComment(id); if (result > 0) { return new ResultVO(0, "success"); } else { return new ResultVO(100, "fail"); } } } |
Test
댓글 생성 api를 postman으로 테스트하면 다음과 같다. 자동생성된 id가 리턴되는것을 확인하자.