38. 댓글 구현 : 삭제하기

Feb 16, 2024
38. 댓글 구현 : 삭제하기

1. 댓글 확인하기

  • 쓰레기통이 안보여도 postman으로 삭제할 수 있음 → 나중에 잡아야 함
notion image
notion image
 

2. ReplyRepository에서 메서드 구현하 기

  • findById() 찾기
  • deleteById() 만들기
package shop.mtcoding.blog.reply; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import shop.mtcoding.blog.board.BoardResponse; import shop.mtcoding.blog.user.User; import java.util.List; @RequiredArgsConstructor @Repository public class ReplyRepository { private final EntityManager em; public List<BoardResponse.ReplyDTO> findByBoardId(int boardId, User sessionUser) { String q = """ select rt.id, rt.user_id, rt.comment, ut.username from reply_tb rt inner join user_tb ut on rt.user_id = ut.id where rt.board_id = ? """; // ReplyDTO는 ENTITY가 아니니까 파싱 안해줌 // Reply.class는 데이터가 다르니까 파싱 안해줌 Query query = em.createNativeQuery(q); // ReplyDTO는 ENTITY가 아니니까 파싱 안해줌 query.setParameter(1, boardId); List<Object[]> rows = query.getResultList(); return rows.stream().map(row -> new BoardResponse.ReplyDTO(row, sessionUser)).toList(); } @Transactional public void save(ReplyRequest.SaveDTO requestDTO, int userId) { Query query = em.createNativeQuery("insert into reply_tb(comment, board_id, user_id, created_at) values(?,?,?, now())"); query.setParameter(1, requestDTO.getComment()); query.setParameter(2, requestDTO.getBoardId()); query.setParameter(3, userId); query.executeUpdate(); } @Transactional public void deleteById(int id) { String q = """ delete from reply_tb where id = ? """; Query query = em.createNativeQuery(q); query.setParameter(1, id); query.executeUpdate(); } public Reply findById(int id){ String q = "select * from reply_tb where id = ?"; Query query = em.createNativeQuery(q, Reply.class); query.setParameter(1, id); try { return (Reply) query.getSingleResult(); } catch (Exception e) { return null; } } }
 

3. error 폴더에 404.mustache 만들기

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>자원을 찾을 수 없습니다. 404</h1> </body> </html>
 

4. ReplyController에서 /reply/{id}/delete 주소 만들기

package shop.mtcoding.blog.reply; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import shop.mtcoding.blog.user.User; // 댓글쓰기, 댓글삭제, 댓글 목록보기 @RequiredArgsConstructor @Controller public class ReplyController { private final HttpSession session; private final ReplyRepository replyRepository; @PostMapping("/reply/{id}/delete") public String delete(@PathVariable int id) { // 인증하기 User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { return "redirect:/loginForm"; } Reply reply = replyRepository.findById(id); // 잘못 요청된 것들 분기 처리하기 // 댓글이 없거나, 댓글 주인이거나, 댓글 주인이 아니거나 // 댓글 주인 일때만 허용, 나머지는 다 error if(reply == null) { return "error/404"; } // 권한 체크 if (reply.getUserId() != sessionUser.getId()) { return "error/403"; } // 핵심 로직 replyRepository.deleteById(id); return "redirect:/board/" + reply.getBoardId(); // 댓글이 있던 게시판 페이지 } @PostMapping("/reply/save") public String write(ReplyRequest.SaveDTO requestDTO) { System.out.println(requestDTO); User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { return "redirect:/loginForm"; } // 유효성 검사 (님들이 하세요) // 핵심 코드 replyRepository.save(requestDTO, sessionUser.getId()); return "redirect:/board/" + requestDTO.getBoardId(); } }
notion image
Share article
RSSPowered by inblog