Java Spring JSP웹페이지 만들기8 (게시글 삭제 기능)

호연지기·2023년 5월 26일
0
post-thumbnail

💞 게시글 삭제 기능 추가하기 (댓글, 글 내용, 파일 삭제)

D 버튼을 누르면 게시글이 삭제되는 기능 구현하기.
사용자는 버튼만 누르면 끝나지만 백엔드에서는 해야할 일이 많다.

  • 글을 쓴 사용자에게만 수정, 삭제 버튼 보이도록 처리하기
  • 댓글 삭제 처리
  • 게시글 삭제 처리
  • 파일 삭제 처리( 실제 파일 삭제, DB 파일 데이터 삭제)

U 버튼 : 게시글 수정하기
B 버튼 : 뒤로가기(글 목록 페이지로 이동)
다음 포스팅에서 작성할 예정

✏ 작업 순서

  1. 본인이 작성한 글일 경우에만 수정, 삭제 가능하도록 세팅
    ( BoardContents )
  2. 게시글을 삭제할건지 물어보는 체크 알림창 띄우기( BoardContents )
  3. D 버튼 클릭 시 작동하는 함수 작성( BoardContents 에서 script로 처리)
  4. 삭제 처리 ( BoardContents , BoardService , BoardDao )

🔻 본인의 글일 때만 글 삭제와 수정이 가능하다!

💻 BoardContents 소스

<script>
  //수정/삭제 버튼 처리(본인의 글이 아니면 버튼 숨기기)
  $('#upbtn').hide();
  $('#delbtn').hide();
  let mid = "${mb.m_id}";
  let bid = "${board.b_id}";

  if(mid == bid){
    $("#upbtn").show();
    $("#delbtn").show();
  }
</script>

회원가입되어 있는 아이디와 글을 쓴 게시판 아이디를 비교 후 일치할 경우에만 U , D 버튼을 노출한다.

🔻 D 버튼을 누르면 작동하는 것은?

예로부터 삭제는 신중하게 다뤄야 한다고 전해져 내려오...지는 않지만 사용자 입장에서도 삭제하기 전 한번 더 물어봐주는 게 동방예의지국에서는 친절하게 느껴진다.

<div class="btn-area">
  <button class="btn-write" id="upbtn" onclick="upboard('${board.b_num}')">U</button>
  <button class="btn-write" id="delbtn" onclick="delCheck('${board.b_num}')">D</button>
  <button class="btn-sub" onclick="backbtn()">B</button>

버튼 영역 중 D button에 매겨진 delCheck('${board.b_num}')가 삭제 처리를 할건지 다시 한 번 체크하는 부분!

💻 BoardContents 소스

<script>
  function delCheck(bnum){
  //상세화면으로 보이는 게시글을 삭제(글번호로 삭제)
  //alert(bnum); 삭제하려는 글 번호 제대로 가져오는지 체크
  let conf = confirm("삭제하겠습니까?");
  if(conf == true){
    location.href = "/delete?b_num=" + bnum;
  }
</script>

💻 Controller 소스

@GetMapping("delete")
public String boardDelete(Integer b_num, HttpSession session, RedirectAttributes rttr){
    log.info("boardDelete()");
    String view = bServ.boardDelete(b_num, session, rttr); //서비스에서 처리
    return view;
}

컨트롤러에서 @GetMapping으로 delete를 받고 서비스로 이동시킨다.
삭제 처리는 서비스에서!

💻 BoardService 소스

public String boardDelete(Integer b_num, HttpSession session, RedirectAttributes rttr){
    log.info("boardDelete()");
    String view = null;
    String msg = null;

    try {
        //댓글/파일 -> 게시글
        bDao.deleteReplys(b_num);
        //실제 파일들 삭제
        deleteFiles(b_num, session);
        //파일 정보 삭제
        bDao.deleteFiles(b_num);
        bDao.deleteBoard(b_num);

        view = "redirect:list?pageNum=1";
        msg = "삭제 성공";

    } catch (Exception e) {
        e.printStackTrace();
        view = "redirect:contents?b_num=" + b_num;
        msg = "삭제 실패";
    }
    rttr.addFlashAttribute("msg", msg);
    return view;
}

삭제 성공하면 게시글 목록 페이지로 이동 삭제 실패하면 현재 게시글 상세보기 페이지를 보여준다.

💻 BoardService 소스 (실제 파일 삭제하는 메소드)

private void deleteFiles(Integer b_num, HttpSession session) throws Exception {
    //sysname으로 upload 폴더에서 파일 삭제.
    //DB에서 같은 게시물에 해당하는 sysname 목록을
    //받아서 반복적으로 삭제 처리.
    //file.delete() : File 클래스의 파일 삭제 메소드.
    log.info("deleteFiles()");
    List<String> sList = bDao.selectSysname(b_num);
    String realpath = session.getServletContext().getRealPath("/");
    realpath += "upload/";

    for(String sn : sList){
        File file = new File(realpath + sn);
        if(file.exists()){
            file.delete();
        }
    }
}

실제 파일을 먼저 삭제하고 DB에 저장된 파일 정보를 삭제한다.

💻 BoardDao.java 소스

@Mapper
public interface BoardDao {    
    //댓글 목록 삭제 메소드 선언
    void deleteReplys(Integer b_num);
    //파일 목록 삭제 메소드 선언
    void deleteFiles(Integer b_num);
    //파일 삭제 메소드 선언(개별 파일)
    void deleteSingleFile(String sysname);
    //게시글 삭제 메소드 선언
    void deleteBoard(Integer b_num);
}

💻 BoardDao.xml 소스

-- 댓글 목록 삭제
<delete id="deleteReplys" parameterType="Integer">
    delete from reply where r_bnum=#{b_num}
</delete>
-- 파일 목록 삭제
<delete id="deleteFiles" parameterType="Integer">
    delete from boardfile where bf_bnum=#{b_num}
</delete>
-- 파일 삭제(개별 파일)
<delete id="deleteSingleFile" parameterType="String">
    delete from boardfile where bf_sysname=#{sysname}
</delete>
-- 게시글 테이블에서 게시글 삭제
<delete id="deleteBoard" parameterType="Integer">
    delete from board where b_num=#{b_num}
</delete>

삭제 후에는 삭제 성공 메세지와 함께 언제 글을 작성했냐는 듯 태연하게 게시글 목록으로 돌아온다.


📅 DATE

2023.05.26 작성

profile
사람의 마음에 차 있는 너르고 크고 올바른 기운

0개의 댓글