지난 블로그에서는 게시글 유효성 검사와 글쓰기 오류를 해결했다.
이번 블로그는 게시글 삭제를 해본다.
1. Form 태그 만들기

board/detail.mustache
<form action="/board/{{board.id}}/delete" method="post">
<button class="btn btn-danger">삭제</button>
</form>
detail.mustache 의 삭제 버튼를 form 태그 사이로 넣는다. delete, update 는 자바스크립트가 있어야 하기 때문에 현재는 post 를 사용한다.
주소에는 동사를 쓰지 않는다. 다만 현재는 자바스크립트를 쓰지 않기 때문에 get과 post만 쓸 수 있어서 구분을 위해 주소에 동사를 썼다.
2. Delete 메서드 만들기
@PostMapping("/board/{id}/delete")
public String delete(@PathVariable int id){}
자바스크립트가 없기 때문에
@PostMapping
을 사용한다. board/1 게시판을 삭제하도록 주소를 만들었고, @PathVariable
으로 url 에서 id 를 쉽게 변수로 사용할 수 있다.@PostMapping("/board/{id}/delete")
public String delete(@PathVariable int id){
// 세션에서 정보 받음
User sessionUser = (User) session.getAttribute("sessionUser");
// 로그인 여부 확인, 로그인 하지 않으면 로그인 페이지로 리다이렉트
if(sessionUser==null){
return "redirect:/loginForm";
}
return "redirect:/";
}
삭제를 하기 위해 권한 인증을 해야 한다. 세선에서 로그인 정보를 확인해 로그인 되었는지를 확인하고, 로그인 되어 있지 않다면 로그인 페이지를 리다이렉션 한다.

postman 을 통해 접속해보면 로그인 페이지가 리다이렉션 된다.
3. 삭제 전 DB 확인
게시글 삭제 전 미리 ID 를 확인해서 해당 게시글이 있는지 없는지를 먼저 확인한다.
삭제 전 데이터를 먼저 확인하면 잘못된 데이터 삭제나 중복 삭제를 방지하여 데이터의 무결성을 유지할 수 있다.
@PostMapping("/board/{id}/delete")
public String delete(@PathVariable int id){
// 세션에서 정보 받음
User sessionUser = (User) session.getAttribute("sessionUser");
// 로그인 여부 확인, 로그인 하지 않으면 로그인 페이지로 리다이렉트
if(sessionUser==null){
return "redirect:/loginForm";
}
// 삭제 전 아이디 있는지 체크
boardRepository.findByIdCheck(id);
return "redirect:/";
}
boardRepository 를 연결한다.
public Board findByIdCheck(int id) {
Query query = em.createNativeQuery("select * from board_tb where id = ?",Board.class);
query.setParameter(1,id);
Board board = (Board) query.getSingleResult();
return board;
}
board 테이블에서 게시판 id (게시판 번호)를 조회한다.
4. 작성자 확인
게시글의 권한을 확인하기 위해 세션에 있는 로그인 정보와 게시글의 작성자 정보를 확인한다.
@PostMapping("/board/{id}/delete")
public String delete(@PathVariable int id,HttpServletRequest request){
// 세션에서 정보 받음
User sessionUser = (User) session.getAttribute("sessionUser");
// 로그인 여부 확인, 로그인 하지 않으면 로그인 페이지로 리다이렉트
if(sessionUser==null){
return "redirect:/loginForm";
}
// 삭제 전 아이디 있는지 체크
Board board = boardRepository.findByIdCheck(id);
// 로그인 아이디와 작성자 확인
if(board.getUserId()!=sessionUser.getId()){
request.setAttribute("status",403);
request.setAttribute("msg","게시글을 삭제할 권한이 없습니다.");
return "error/40x";
}
return "redirect:/";
}
만약 세션의 id 와 게시글 작성자가 다르면 동적으로 에러 페이지를 띄운다.
5. delete 쿼리 작성
@Transactional
public void deleteByID(int id) {
Query query = em.createNativeQuery("delete from board_tb where id =?");
query.setParameter(1,id);
query.executeUpdate();
}
BoardRepository 에
deleteByID
메서드를 만든다. DB에 변화가 가는 쿼리문은 고립성을 위해
@Transactional
을 사용해야 한다.@PostMapping("/board/{id}/delete")
public String delete(@PathVariable int id,HttpServletRequest request){
// 세션에서 정보 받음
User sessionUser = (User) session.getAttribute("sessionUser");
// 로그인 여부 확인, 로그인 하지 않으면 로그인 페이지로 리다이렉트
if(sessionUser==null){
return "redirect:/loginForm";
}
// 삭제 전 아이디 있는지 체크
Board board = boardRepository.findByIdCheck(id);
if(board.getUserId()!=sessionUser.getId()){
request.setAttribute("status",403);
request.setAttribute("msg","게시글을 삭제할 권한이 없습니다.");
return "error/40x";
}
boardRepository.deleteByID(id); // 메서드 호출
return "redirect:/";
}


삭제 버튼을 누르면 정상적으로 글이 삭제되고 메인 페이지로 리다이렉션 된다.
Share article