본문 바로가기

BackEnd/Spring

[코드로 배우는 스프링 웹 프로젝트] ch17 Ajax 댓글 처리 8

728x90
반응형

https://bobo12.tistory.com/324

 

7. 댓글 페이지의 화면 처리
   ▷ 게시물을 조회하는 페이지에 들어오면 기본적으로 가장 오래된 댓글들을 가져와서 1페이지에 보여줌
   ▷ 1페이지의 게시물을 가져올 때 해당 게시물의 댓글의 숫자를 파악해서 댓글의 페이지 번호를 출력함
   ▷ 댓글이 추가되면 댓글의 숫자만을 가져와서 최종 페이지를 찾아서 이동함
   ▷ 댓글의 수정과 삭제 후에는 다시 동일 페이지를 호출함

 

 
(1) 댓글 페이지 계산과 출력
   ▷ Ajax로 가져오는 데이터가 replyCnt와 list라는 데이터로 구성되므로 이를 처리하는 reply.js의 내용 역시 이를 처리하는 구조로 수정함

 

◎ reply.js 내용 수정

 

... (생략) ... ​​​​ ​​​​function getList(param, callback, error) { ​​​​var bno = param.bno; ​​​​var page = param.page || 1; ​​​​ ​​​​$.getJSON("/replies/pages/" + bno + "/" + page + ".json", ​​​​​​​​function(data) { ​​​​​​​​​​​​if(callback) { ​​​​​​​​​​​​​​​​// callback(data); // 댓글 목록만 가져오는 경우 ​​​​​​​​​​​​​​​​callback(data.replyCnt, data.list); // 댓글 숫자와 목록을 가져오는 경우 ​​​​​​​​​​​​} ​​​​​​​​}).fail(function(xhr, status, err) { ​​​​​​​​​​​​if(error) { ​​​​​​​​​​​​​​​​error(); ​​​​​​​​​​​​} ​​​​​​​​}); ​​​​} ​​​​ ​​​​... (생략) ...

 

   ▷ 기존에 비해서 변경되는 부분은 callback 함수에 해당 게시물의 댓글 수(replyCnt)와 페이지에 해당하는 댓글 데이터를 전달하도록 하는 부분, 화면에 대한 처리는 get.jsp 내에서 이루어짐

 

◎ get.jsp 내용 수정

   ▷ reply.js를 이용해서 댓글의 페이지를 호출하는 부분은 showList 함수이므로 페이지 번호를 출력하도록 수정함

 

... (생략) ... ​​​​ ​​​​function showList(page) { ​​​​ ​​​​console.log("show list " + page); ​​​​ ​​​​replyService.getList({bno:bnoValue, page:page||1}, function(replyCnt, list) { ​​​​​​​​ ​​​​​​​​console.log("replyCnt: " + replyCnt); ​​​​​​​​console.log("list: " + list); ​​​​​​​​console.log(list); ​​​​​​​​ ​​​​​​​​if(page == -1){ ​​​​​​​​​​​​pageNum = Math.ceil(replyCnt/10.0); ​​​​​​​​​​​​showList(pageNum); ​​​​​​​​​​​​return; ​​​​​​​​} ​​​​​​​​ ​​​​​​​​var str = ""; ​​​​​​​​if(list == null || list.length == 0) { ​​​​​​​​​​​​replyUL.html(""); ​​​​​​​​​​​​return; ​​​​​​​​} ​​​​​​​​ ​​​​​​​​for (var i = 0, len = list.length || 0; i<len; i++) { ​​​​​​​​​​​​str +="<li class='left clearfix' data-rno='"+list[i].rno+"'>"; ​​​​​​​​​​​​str +=" <div><div class='header'><strong class='primary-font'>["+list[i].rno+"] "+list[i].replyer+"</strong>"; ​​​​​​​​​​​​str +=" <small class='pull-right text-muted'>"+replyService.displayTime(list[i].replyDate)+"</small></div>"; ​​​​​​​​​​​​str +=" <p>"+list[i].reply+"</p></div></li>"; ​​​​​​​​} ​​​​​​​​replyUL.html(str); ​​​​​​​​}); // end function ​​​​​​​​} // end showList ​​​​​​​​ ​​​​​​​​... (생략) ...

 

▷ showList() 함수는 파라미터로 전달되는 page 변수를 이용해서 원하는 댓글 페이지를 가져오게 됨

 이때 만일 page 번호가 -1로 전달되면 마지막 페이지를 찾아서 다시 호출함

 사용자가 새로운 댓글을 추가하면 showList(-1); 을 호출하여 우선 전체 댓글의 숫자를 파악함

 이 후에 다시 마지막 페이지를 호출해서 이동시키는 방식으로 동작시킴

이러한 방식은 여러번 서버를 호출해야하는 단점, 댓글의 등록 행위가 댓글 조회나 페이징에 비해서 적기 때문에 심각한 문제는 아닙니다.

◎ get.jsp

... (생략) ... ​​​​ ​​​​modalRegisterBtn.on("click", function(e){ ​​​​​​​​ ​​​​​​​​var reply= { ​​​​​​​​​​​​reply: modalInputReply.val(), ​​​​​​​​​​​​replyer:modalInputReplyer.val(), ​​​​​​​​​​​​bno:bnoValue ​​​​​​​​}; ​​​​​​​​replyService.add(reply, function(result){ ​​​​​​​​​​​​alert(result); ​​​​​​​​​​​​ ​​​​​​​​​​​​modal.find("input").val(""); ​​​​​​​​​​​​modal.modal("hide"); ​​​​​​​​​​​​ ​​​​​​​​​​​​// showList(1); ​​​​​​​​​​​​showList(-1); ​​​​​​​​}); ​​​​}); ​​​​ ​​​​... (생략) ...

 

댓글은 화면상에서 댓글이 출력되는 영역의 아래쪽에 <div class='panel-footer'>를 하나 추가하고 <div>의 아래쪽에 추가.

 

◎ get.jsp 내용 수정

... (생략) ... ​​​​ ​​​​<!-- /.panel-heading --> ​​​​<div class="panel-body"> ​​​​​​​​<ul class="chat"> ​​​​​​​​​​​​ ​​​​​​​​​​​​... (생략) ... ​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​</ul> ​​​​​​​​​​​​<!-- /. end ul --> ​​​​​​​​​​​​</div> ​​​​​​​​​​​​<!-- /.panel .chat-panel --> ​​​​​​​​​​​​<div class="panel-footer"> ​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​</div> ​​​​​​​​​​​​</div> ​​​​​​​​​​​​</div> ​​​​​​​​​​​​<!-- ./ end row --> ​​​​​​​​​​​​</div>

 

추가된 <div class='panel-footer'>에 댓글 페이지 번호를 출력하는 로직은 showReplyPage()는 아래와 같음

 

◎ get.jsp 내용 수정

... (생략) ... ​​​​ }); // end function } // end showList var pageNum = 1; var replyPageFooter = $(".panel-footer"); function showReplyPage(replyCnt) { ​​​​ ​​​​var endNum = Math.ceil(pageNum / 10.0) * 10; ​​​​var startNum = endNum - 9; ​​​​ ​​​​var prev = startNum != 1; ​​​​var next = false; ​​​​ ​​​​if(endNum * 10 >= replyCnt) { ​​​​​​​​endNum = Math.ceil(replyCnt/10.0); ​​​​} ​​​​if(endNum * 10 < replyCnt){ ​​​​​​​​next = true; ​​​​} ​​​​var str = "<ul class='pagination pull-right'>"; ​​​​ ​​​​if(prev){ ​​​​​​​​str+= "<li class='page-item'><a class='page-link' href='"+(starNum -1)+"'>Previous</a></li>"; ​​​​} ​​​​ ​​​​for(var i = startNum; i<= endNum; i++){ ​​​​​​​​var active = pageNum == i? "active":""; ​​​​​​​​str+= "<li class='page-item "+active+" '><a class='page-link' href='"+i+"'>"+i"</a></li>"; ​​​​} ​​​​ ​​​​if(next){ ​​​​​​​​str+="<li class='page-item'><a class='page-link' href='"+(endNum + 1)+"'>Next</a></li>"; ​​​​} ​​​​str += "</ul></div>"; ​​​​ ​​​​console.log(str); ​​​​replyPageFooter.html(str); } ... (생략) ...


▷ showReplyPage( ) 는 기존에 Java로 작성되는 PageMaker의 JavaScript 버전에 해당함
 댓글 페이지를 문자열로 구성한 후 <div>의 innerHTML로 추가함
 showList()의 마지막에 페이지를 출력하도록 수정함

// get.jsp ... 생략 ... ​​​​ ​​​​replyUL.html(str); showReplyPage(replyCnt); }); // end function } // end showList ... 생략 ...

 

실제 화면상에는 CSS의 구성으로 인해 아래쪽에 추가

 

◎ 페이지 번호를 클릭했을 때 새로운 댓글을 가져오도록 get.jsp 내용 수정

... (생략) ... ​​​​ ​​​​replyPageFooter.on("click","li a", function(e){ ​​​​​​​​e.preventDefault(); ​​​​​​​​console.log("page click"); ​​​​​​​​ ​​​​​​​​var targetPageNum = $(this).attr("href"); ​​​​​​​​ ​​​​​​​​console.log("targetPageNum: " + targetPageNum); ​​​​​​​​ ​​​​​​​​pageNum = targetPageNum; ​​​​​​​​ ​​​​​​​​showList(pageNum); ​​​​}); ​​​​ ​​​​... (생략) ...

 

댓글의 페이지 번호는 <a> 태그 내에 존재하므로 이벤트 처리에서는 <a> 태그의 기본동작을 제한하고(preventDefault()) 댓글 페이지 번호를 변경한 후 해당 페이지의 댓글을 가져오도록 함

 

 

(2) 댓글의 수정과 삭제

   ▷ 댓글이 페이지 처리되면 댓글의 수정과 삭제 시에도 현재 댓글이 포함된 페이지로 이동하도록 수정함.

 

◎ get.jsp 내용 추가

... (생략) ... ​​​​ ​​​​modalModBtn.on("click", function(e){ ​​​​​​​​var reply = {rno:modal.data("rno"), reply: modalInputReply.val()}; ​​​​​​​​ ​​​​​​​​replyService.update(reply, function(result){ ​​​​​​​​​​​​alert(result); ​​​​​​​​​​​​modal.modal("hide"); ​​​​​​​​​​​​showList(pageNum); ​​​​​​​​}); ​​​​}); ​​​​ ​​​​modalRemoveBtn.on("click", function (e) { ​​​​​​​​var rno = modal.data("rno"); ​​​​​​​​replyService.remove(rno, function(result) { ​​​​​​​​​​​​alert(result); ​​​​​​​​​​​​modal.modal("hide"); ​​​​​​​​​​​​showList(pageNum); ​​​​​​​​}); ​​​​}); ​​​​ ​​​​... (생략) ...

 

기존과 달라진 점은 showList() 를 호출 할 때 현재 보고 있는 댓글 페이지의 번호를 호출 한다는 점입니다.

브라우저에서 댓글의 등록, 수정, 삭제 작업은 모두 페이지 이동을 하게 됩니다.

 

 

댓글 페이지의 화면 처리를 구현해 보았습니다. 오래된 댓글들을 1페이지에 보여주고 해당 페이지의 게시물을 가져올 때 해당 게시물의 댓글의 숫자를 파악해서 댓글의 페이지 번호를 출력하는 등 여러가지 기능들을 구현해보았습니다.

 

이렇게 스프링 공부를 해보았지만 아직 MVC에 대해서 자세히 이해하지를 못해서 그런지 확실하게 이해되는 것은 없네요,,

 

처음부터 책을 다시 한 번 읽어보고 따라해봐야 겠어요!!

 

다음은 스프링 부트에 대해서 공부해볼게요!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

 

 

 

728x90
반응형