댓글 및 대댓글 목록 조회 다이어그램.drawio.png

댓글 및 대댓글 목록 조회 다이어그램.drawio

myHomeSelect.jsp

let data = {
    boardMyhomeArticleNo: `${selectMyHome.boardMyhomeArticleNo}`,
    memberIdCheck : `${member.memberId}`,
    isLogOn : `${isLogOn}`,
    member : `${member}`,    
}; // 원글 번호랑 로그인 아이디 가져오기(`` 이렇게 안하면 세션에 있는 아이디가 안받아짐 ㅜㅜ)
			
// 댓글 조회
function replyList(section, pageNum) {
	// 댓글 목록 요청
    $.ajax({
        url: '/gami/board/reply/replyList.do',
        type: 'POST',
        data: { boardMyhomeArticleNo: `${selectMyHome.boardMyhomeArticleNo}`,
        		section: section,	
        		pageNum: pageNum},    
        success: function(replyList) {
        	
        	
            var totalReplys = replyList.totalReplys;
            var totalPages = replyList.totalPages;
            var startPage = replyList.startPage;
            var endPage = replyList.endPage;
            var section = replyList.section;
            var pageNum = replyList.pageNum;
            
            var memberIdCheck = data.memberIdCheck;
            var isLogOn = data.isLogOn;
            var member = data.member;
            
            // 댓글 사진 URL
            var replyImageUrl = '${contextPath}/resources/image/';
            var replyImageName = 'mypage.png';

            console.log(memberIdCheck);
            console.log(isLogOn);
            console.log(member);
            
            console.log(totalReplys);
            console.log(totalPages);
            console.log(startPage);
            console.log(endPage);
            console.log('section : ' + section);
            console.log('pageNum : ' + pageNum);

            $('#reply').empty(); // 기존 댓글을 지우기

            replyList.replyList.forEach(function(reply) {
                var str = '';

                // LVL에 따른 padding 설정
                var paddingLeft = reply.LVL > 1 ? (reply.LVL - 1) * 15 : '0';

                // 댓글 출력
                str += '<div style="margin-bottom: 10px; border-bottom: 1px solid rgba(0, 0, 0, 0.1); padding-left: ' + paddingLeft + 'px;">' +
                       '<div style="display: flex; justify-content: space-between; align-items: flex-start;">' +
                       '<div style="display: flex; align-items: center;">' +
                       '<img id="replyImage" src="' + replyImageUrl + replyImageName + '" style="width: 30px; height: auto; max-width: 100%;"/>' +
                       '&nbsp;' + // 이미지와 닉네임 사이에 공백 추가
                       '<span style="font-weight: bold;">' + reply.memberNickname + '</span>' +
                       '</div>';

                    // 로그인 id와 글 id 비교
                       if (memberIdCheck == reply.memberId) {
                           str += '<div class="buttons">' +
                                   '<button type="button" class="editButton" onclick="updateReplyToggle(this)" value="' + reply.replyNo + '">수정</button>' +
                                   '<button name="deleteRereply" class="deleteRereply" type="button" value="' + reply.replyNo + '" onclick="deleteRereply(' + reply.replyNo + ', this)">삭제</button>' +
                                   '</div>';
                       }

                str += '</div>';

                // 댓글 내용
                str += '<div class="replyContent" style="margin-top: 10px; font-size: 16px; line-height: 1.5; text-align: left;" data-original-content="' + reply.replyContents + '">' +
                       reply.replyContents +
                       '</div>';

                // 로그인한 사용자에게만 대댓글 버튼 보이기
                if (isLogOn == 'true' && member != null) {
                    str += '<div class="buttons" style="text-align: left; margin-top: 10px;">' +
                            '<button class="rereToggle" value="대댓글 작성" onclick="rereToggle(' + reply.replyNo + ', this)">답변</button>' +
                            '</div>';
                }

                // 대댓글 작성 폼
                if (isLogOn == 'true' && member != null) {
                    str += '<div class="rereplyForm" style="display: none; margin-top: 10px;">' +
                        '<textarea class="rereplyContents" placeholder="여기에 작성해 주세요." style="width: 100%;"></textarea>' +
                        '<button class="addRereply" type="button" onclick="addRereply(' + reply.replyNo + ', this)">등록</button>' +
                        '</div>';
                }

                str += '</div>'; // 닫는 댓글 div
                // 댓글을 추가
                $('#reply').append(str);
            });

            // 페이징 기능
            var pagingStr = '';
            pagingStr += '<div class="paging">';

            // 글이 있나 없나
            if (totalReplys != 0) {
            
            // 맨 처음으로 이동
            if (section > 1 && pageNum > 10) {
                pagingStr += '<a href="#" onclick="updatePage(' + 1 + ',' +  1 + ')">&nbsp; ◀◀ </a>';
            }
            
            
            // 뒤로 이동            
            var pageNumCheck = pageNum;
            
            if (section > 1 && pageNum > 10 && (pageNum % 10) == 0) {
            	pageNumCheck = Math.floor((pageNum / 10) - 1);
                pagingStr += '<a href="#" class="pagingLink" onclick="updatePage(' + (section - 1) + ',' +  (pageNumCheck * 10) + ')">&nbsp; ◀ </a>';
            }
            
            // 뒤로 이동 10으로 나누어 지지 않는 경우
            if ((section > 1 && pageNum > 10) && (pageNum % 10) != 0) {
            	pageNumCheck = Math.floor((pageNum / 10));
                pagingStr += '<a href="#" class="pagingLink" onclick="updatePage(' + (section - 1) + ',' +  (pageNumCheck * 10) + ')">&nbsp; ◀ </a>';
            }
            
         // 현재 페이지를 변수로 저장
            var currentPage = pageNum;

         // 페이지 출력
            var pagingStr = '<div class="pagingContainer">'; // 컨테이너 시작
            for (var page = startPage; page <= endPage; page++) {
                if (page === currentPage) {
                    pagingStr += '<span class="pagingLink active" onclick="updatePage(' + section + ',' + page + ')">' + page + '</span>';
                } else {
                    pagingStr += '<span class="pagingLink" onclick="updatePage(' + section + ',' + page + ')">' + page + '</span>';
                }
            }
            pagingStr += '</div>'; // 컨테이너 끝
            
            // 다음 섹션으로 이동
            if(page>=10 && page<=endPage){
            if ((page % 10) == 0 && (totalPages / 10) != section) {
            	pagingStr += '<a href="#" class="pagingLink" onclick="updatePage(' + (section + 1) + ',' +  (page + 1) + ')">&nbsp; ▶ </a>';
            }
            }
            
            // 맨 끝 페이지로 이동
            var sectionCheck = section;
            
            if(totalPages>10){
            if ((page % 10) == 0 && (totalPages / 10) != section) {
            	sectionCheck = Math.floor(totalPages / 10);
                pagingStr += '<a href="#" class="pagingLink" onclick="updatePage(' + sectionCheck + ',' +  totalPages + ')">&nbsp; ▶▶ </a>';
            }
            if ((totalPages % 10) != 0) {
            	sectionCheck = Math.floor((totalPages / 10) + 1);
                pagingStr += '<a href="#" class="pagingLink" onclick="updatePage(' + sectionCheck + ',' +  totalPages + ')">&nbsp; ▶▶ </a>';
            }
            }
            
           
            pagingStr += '</div>';
            
            $('#reply').append(pagingStr);
            }
        },
        error: function() {
            alert('댓글 목록 실패');
        }
    });
}

// 페이지와 섹션 초기 설정
$(document).ready(function() {
	replyList(1, 1);
});

**<body>**
<form id="replyForm">
<h2>댓글 작성</h2>
    <textarea id="replyContents" name="replyContents" placeholder="여기에 작성해 주세요." required></textarea>
    <button id="addReply" type="submit">작성</button>
</form>

<!-- 댓글 작성 -->
<form id="replyForm">
    <textarea id="replyContents" name="replyContents" placeholder="댓글을 작성해주세요." required></textarea>
    <button id="addReply" type="submit">댓글 등록</button>
</form>
<div id="replyList">
    <ul id="reply"></ul>
</div>
<div class="pagingContainer">
</div>

ReplyController

	// 댓글 조회
	@RequestMapping(value="/replyList.do", method= {RequestMethod.POST, RequestMethod.GET})
	@ResponseBody
	public void replylist(@RequestParam("boardMyhomeArticleNo") int boardMyhomeArticleNo,
						  @RequestParam(value="section", defaultValue = "1") int section, // section, pageNum 값이 없을 경우 1로 초기화 하기.
			              @RequestParam(value="pageNum", defaultValue = "1") int pageNum,
						  HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		// Map 생성해서 section, pageNum 넣어주기
		Map<String, Integer> paging = new HashMap<>();
		paging.put("section", section);
		paging.put("pageNum", pageNum);
		paging.put("boardMyhomeArticleNo", boardMyhomeArticleNo);
		
		List<ReplyDomain> replyList = replyService.replyList(paging); // 게시글 조회
				
		// 페이징 정보 불러오기
		replyDomain = replyService.pagingInfo(pageNum, boardMyhomeArticleNo);
				
		// JSON 객체 생성
	    JSONObject data = new JSONObject();		
	    int totalReplys = replyDomain.getTotalReplys();
	    data.put("totalReplys", totalReplys); // 총 글 수
	    System.out.println("totalReplys" + replyDomain.getTotalReplys());
	    
	    int totalPages = replyDomain.getTotalPages();
	    data.put("totalPages", totalPages); // 총 페이지 수
	    System.out.println("totalPages" + replyDomain.getTotalPages());	
	    
	    int startPage = replyDomain.getStartPage();
	    data.put("startPage", startPage); // 시작 페이지
	    System.out.println("startPage" + replyDomain.getStartPage());	
	    
	    int endPage = replyDomain.getEndPage();
	    data.put("endPage", endPage); // 끝 페이지
	    System.out.println("endPage" + replyDomain.getEndPage());	
				
	    data.put("replyList", replyList);
				
	    data.put("section", section);
	    System.out.println("section 받았니?" + section);	
	    
	    data.put("pageNum", pageNum);
	    System.out.println("pageNum 받았니?" + pageNum);	
	    
	    
	    System.out.println("댓글 리스트" + replyList);
	    System.out.println("가져오나?" + boardMyhomeArticleNo);
	    
	    // 응답 설정
	    response.setContentType("application/json"); // json타입으로
	    response.setCharacterEncoding("UTF-8"); // utf-8로 안하면 외계어 나옴.
	    response.getWriter().write(data.toString()); // 스트링 타입으로 변환해서 JSON 데이터 전송
	}

ReplyServiceImpl

	@Override
	public List<ReplyDomain> replyList(int boardMyhomeArticleNo) throws Exception{
		return replyDAO.replyList(boardMyhomeArticleNo);
	}

ReplyDAOImpl

	@Override
	public List<ReplyDomain> replyList(boardMyhomeArticleNo) throws DataAccessException{
		return sqlSession.selectList("mapper.board.replyList", boardMyhomeArticleNo);
	}