지난 블로그에서는 게시글 유효성 검사와 글쓰기 오류를 해결했다.
이번 블로그는 게시글 삭제를 해본다.
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