1. View
휴지통 버튼을 누르면 삭제가 실행된다.
<!-- 댓글아이템 --> {{#replyList}} <div class="list-group-item d-flex justify-content-between align-items-center"> <div class="d-flex"> <div class="px-1 me-1 bg-primary text-white rounded">{{username}}</div> <div>{{comment}}</div> </div> <!--댓글 삭제 --> {{#replyOwner}} <form action="/reply/{{id}}/delete" method="post"> <button class="btn">🗑</button> </form> {{/replyOwner}} </div> {{/replyList}}
form 태그 내부에 댓글 삭제 버튼을 만든다.
삭제는 댓글 번호를 통해 삭제를 한다. /reply/{{id}}/delete
BoardResponse 를 통해 전달받은 댓글의 id 를 변수로 할용한다.
2. 컨트롤러
reply/ReplyController
@PostMapping("/reply/{id}/delete") public String delete(@PathVariable int id,HttpServletRequest request){ //로그인 확인 User sessionUser = (User) session.getAttribute("sessionUser"); if(sessionUser==null){ return "redirect:/loginForm"; } Reply reply = replyRepository.findById(id); if(reply==null){ request.setAttribute("msg","페이지를 찾을 수 없습니다."); request.setAttribute("status",404); return "error/40x"; } if(reply.getUserId()!=sessionUser.getId()){ request.setAttribute("msg","권한이 없습니다."); request.setAttribute("status",403); return "error/40x"; } replyRepository.deleteById(id); return "redirect:/board/"+reply.getBoardId(); }
3. 레파지토리
reply/ReplyRepository
public Reply findById(int id) { //select 문은 Reply.class 클래스명을 작성해야 파싱 가능 Query query = em.createNativeQuery("select * from reply_tb where id =?",Reply.class); query.setParameter(1,id); try { return (Reply) query.getSingleResult(); }catch (Exception e){ return null ; } }
댓글 번호로 댓글이 존재하는지 여부를 확인한다.
삭제 전 데이터를 먼저 확인하면 잘못된 데이터 삭제나 중복 삭제를 방지하여 데이터의 무결성을 유지할 수 있다.
reply/ReplyRepository
@Transactional public void deleteById(int id) { Query query = em.createNativeQuery("delete from reply_tb where id = ?"); query.setParameter(1,id); query.executeUpdate(); }
댓글 번호로 게시글을 삭제한다.
댓글이 삭제되었다.
DB에서도 데이터가 삭제된 것을 확인할 수 있다.
Share article