Spring - 게시판 만들기 연습 (댓글이 있는 게시물 삭제 금지 구현)
현재 댓글이 존재하는 게시글을 삭제 처리할 경우 아래와 같은 오류 발생
위의 다이아그램에서와 같이 현재 tbl_board(게시판 테이블)과 tbl_reply(댓글 테이블)는 부모, 자식의 1:n 또는 1:다의 관계이다. 게시판 테이블의 기본키는 댓글테이블에서 참조하고 있기 때문에 foreign key 무결성 제약조건에 의해 부모테이블의 레코드를 단독으로 삭제처리가 불가능하다.
이 문제를 해결하는 방법에는 두가지 방법이 존재한다. 첫째, 삭제하려는 부모테이블의 레코드와 자식테이블의 레코드(참조하고 있는 레코드)를 함께 삭제 처리하는 방법이 있고, 둘째는 참조하는 레코드가 존재한다면 삭제 처리를 아예 금지하는 방법이 있다.
게시판을 이용하다보면 댓글이 작성된 게시글의 삭제가 처리안되는 것은 위와 같은 상황 때문이다. 게시글과 게시글에 해당하는 댓글 모두를 지우는 것은 좋은 방법이 아니기 때문에 삭제를 금지하는 방법으로 구현해보았다.
1. 구현화면
게시물에 댓글이 존재한다면, 삭제버튼을 클릭시 "댓글이 있는 게시물은 삭제할 수 없습니다"라는 경고 팝업 알림 처리한 뒤 삭제요청을 종료
2. 소스코드
BoardController(게시글 관련 컨트롤러)의 게시글 상세보기 매핑처리
@Controller @RequestMapping("/board/*") public class BoardController { private static final Logger logger = LoggerFactory.getLogger(BoardController.class); @Inject BoardService boardService; @Inject // ReplyService 주입(ReplyService의 댓글의 갯수를 구하는 메서드 호출하기 위해) ReplyService replyService; // 03. 게시글 상세내용 조회, 게시글 조회수 증가 처리 @RequestMapping(value="view.do", method=RequestMethod.GET) public ModelAndView view(@RequestParam int bno, @RequestParam int curPage, @RequestParam String searchOption, @RequestParam String keyword, HttpSession session) throws Exception{ boardService.increaseViewcnt(bno, session); ModelAndView mav = new ModelAndView(); mav.setViewName("board/view"); // 댓글의 수를 맵에 저장 : 댓글이 존재하는 게시물의 삭제처리 방지하기 위해 mav.addObject("count", replyService.count(bno)); mav.addObject("dto", boardService.read(bno)); mav.addObject("curPage", curPage); mav.addObject("searchOption", searchOption); mav.addObject("keyword", keyword); logger.info("mav:", mav); return mav; } } | cs |
replyMapper.xml(댓글 관련 mybatis)
<!-- 댓글 갯수(for 페이징처리) --> <select id="countReply" resultType="int"> SELECT COUNT(*) FROM tbl_reply WHERE bno=#{bno} </select> | cs |
view.jsp(게시글 상세 보기 화면)의 삭제 처리 스크립트 부분
// 삭제 버튼 클릭 $("#btnDelete").click(function(){ // 댓글이 존재하는 게시물의 삭제처리 방지 var count = "${count}"; // 댓글의 수가 0보다 크면 팝업, 함수 종료 if(count > 0) { alert("댓글이 있는 게시물은 삭제할 수 없습니다.") return; } // 댓글의 수가 0이면 삭제처리 if(confirm("삭제하시겠습니까?")){ document.form1.action = "${path}/board/delete.do"; document.form1.submit(); } }); | cs |