
1. 댓글 확인하기
- 쓰레기통이 안보여도 postman으로 삭제할 수 있음 → 나중에 잡아야 함


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();
}
}

Share article