D
버튼을 누르면 게시글이 삭제되는 기능 구현하기.
사용자는 버튼만 누르면 끝나지만 백엔드에서는 해야할 일이 많다.
U
버튼 : 게시글 수정하기
B
버튼 : 뒤로가기(글 목록 페이지로 이동)
다음 포스팅에서 작성할 예정
BoardContents
)BoardContents
)D
버튼 클릭 시 작동하는 함수 작성( BoardContents
에서 script로 처리)BoardContents
, BoardService
, BoardDao
)<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}')
가 삭제 처리를 할건지 다시 한 번 체크하는 부분!
<script>
function delCheck(bnum){
//상세화면으로 보이는 게시글을 삭제(글번호로 삭제)
//alert(bnum); 삭제하려는 글 번호 제대로 가져오는지 체크
let conf = confirm("삭제하겠습니까?");
if(conf == true){
location.href = "/delete?b_num=" + bnum;
}
</script>
@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
를 받고 서비스로 이동시킨다.
삭제 처리는 서비스에서!
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;
}
삭제 성공하면 게시글 목록 페이지로 이동 삭제 실패하면 현재 게시글 상세보기 페이지를 보여준다.
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에 저장된 파일 정보를 삭제한다.
@Mapper
public interface BoardDao {
//댓글 목록 삭제 메소드 선언
void deleteReplys(Integer b_num);
//파일 목록 삭제 메소드 선언
void deleteFiles(Integer b_num);
//파일 삭제 메소드 선언(개별 파일)
void deleteSingleFile(String sysname);
//게시글 삭제 메소드 선언
void deleteBoard(Integer b_num);
}
-- 댓글 목록 삭제
<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>
삭제 후에는 삭제 성공
메세지와 함께 언제 글을 작성했냐는 듯 태연하게 게시글 목록으로 돌아온다.
2023.05.26 작성