1. DTO Setting
- ReplyRequest
@Data
public static class SaveDTO {
@NotNull(message = "board의 id가 전달되어야 합니다")
private Integer boardId;
@NotEmpty(message = "내용을 입력하세요")
private String content;
public Reply toEntity(User sessionUser) {
return Reply.builder()
.content(content)
.board(Board.builder().id(boardId).build())
.user(sessionUser)
.build();
}
}
- ReplyResponse
@Data
public static class DTO {
private Integer id;
private String content;
private Integer userId;
private Integer boardId;
private String createdAt; // 날짜는 String으로 리턴한다 (날짜 타입 공부하기 전까지)
public DTO(Reply reply) {
this.id = reply.getId();
this.content = reply.getContent();
this.userId = reply.getUser().getId();
this.boardId = reply.getBoard().getId();
this.createdAt = reply.getCreatedAt().toString();
}
}
2. 댓글 작성
- ReplyController
@PostMapping("/s/api/reply")
public ResponseEntity<?> save(@Valid @RequestBody ReplyRequest.SaveDTO reqDTO, Errors errors) {
User sessionUser = (User) session.getAttribute("sessionUser");
ReplyResponse.DTO respDTO = replyService.댓글쓰기(reqDTO, sessionUser);
return Resp.ok(respDTO);
}
- ReplyService
@Transactional
public ReplyResponse.DTO 댓글쓰기(ReplyRequest.SaveDTO reqDTO, User sessionUser) {
Reply replyPS = replyRepository.save(reqDTO.toEntity(sessionUser));
return new ReplyResponse.DTO(replyPS);
}
Result
3. 댓글 삭제
- ReplyController
@DeleteMapping("/s/api/reply/{id}")
public ResponseEntity<?> delete(@PathVariable("id") Integer id) {
User sessionUser = (User) session.getAttribute("sessionUser");
replyService.댓글삭제(id, sessionUser.getId());
return Resp.ok(null);
}
- ReplyService
@Transactional
public void 댓글삭제(Integer id, Integer sessionUserId) {
Reply replyPS = replyRepository.findById(id)
.orElseThrow(() -> new ExceptionApi404("자원을 찾을 수 없습니다"));
if (!replyPS.getUser().getId().equals(sessionUserId)) {
throw new ExceptionApi403("권한이 없습니다");
}
replyRepository.deleteById(id);
}
Result
Share article