inblog logo
|
{CODE-RYU};
    SPIRNG

    [홈페이지 제작] 게시판 만들기 6 - 게시글 삭제

    Feb 07, 2024
    [홈페이지 제작] 게시판 만들기 6 - 게시글 삭제
    Contents
    1. Form 태그 만들기2. Delete 메서드 만들기3. 삭제 전 DB 확인4. 작성자 확인5. delete 쿼리 작성
     
    [홈페이지 제작] 게시판 만들기 5 - 글쓰기 권한 설정, 게시글 유효성 검사 - {CODE-RYU};
    SPIRNG
    [홈페이지 제작] 게시판 만들기 5 - 글쓰기 권한 설정, 게시글 유효성 검사 - {CODE-RYU};
    https://inblog.ai/coderyu1/홈페이지-제작-게시판-만들기-5-글쓰기-권한-설정-게시글-유효성-검사-15807?traffic_type=internal
    [홈페이지 제작] 게시판 만들기 5 - 글쓰기 권한 설정, 게시글 유효성 검사 - {CODE-RYU};
    지난 블로그에서는 게시글 유효성 검사와 글쓰기 오류를 해결했다.
     
    이번 블로그는 게시글 삭제를 해본다.
     
     

    1. Form 태그 만들기

    notion image
     
     
    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:/"; }
     
    삭제를 하기 위해 권한 인증을 해야 한다. 세선에서 로그인 정보를 확인해 로그인 되었는지를 확인하고, 로그인 되어 있지 않다면 로그인 페이지를 리다이렉션 한다.
     
    notion image
     
    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:/"; }
     
     
    notion image
     
    notion image
     
    삭제 버튼을 누르면 정상적으로 글이 삭제되고 메인 페이지로 리다이렉션 된다.
    Share article

    {CODE-RYU};

    RSS·Powered by Inblog