본문 바로가기

⭐ SpringBoot/𝄜 게시판 with SpringBoot

26. 댓글 삭제 with JavaScript

728x90
반응형

(재 정리 필요)

# 요약

1. 삭제 버튼을 추가 하였다.

삭제할 대상의 id를 같이 물려주기 위해서 data-comment-id="{{id}}" 속성을 함께 담아 주었고, 댓글이 여러개가 생성되어 삭제 버튼이 여러개가 생성되었을 수 있기 때문에 comment-delete-btn 이라는 class를 같이 추가 하였다.

comment-delete-btn이 값을 가지고 javascript를 통해서 document.querySelectorAll(".comment-delete-btn");를 통해서 여러개의 버튼을 가지고 왔고, 그 버튼을 처리하기 위해서 반복문을 돌려서 각 버튼의 대한 클릭 이벤트를 등록 하였다.

발생 이벤트된 버튼을 찾아서 그 버튼에서 댓글 id를 가져왔고, 그 아이디를 가지고 fetrch를 사용하여 REST API 삭제 요청을 보냈다. 

                <!-- 댓글 삭제 버튼 -->
                <button type="button"
                        class="btn btn-sm btn-outline-danger comment-delete-btn"
                        data-comment-id="{{id}}">삭제
                </button>
            </div>

2. 문자열을 만들때 백틱을 사용하여 문자열 안에 어떤 변수 값을 삽입하는 방법을 사용 하였다.

3. 새로고침을 하는것이 아니라 문서 상에서 직접 대상을 삭제 할 수도 있었다.

# REST API를 호출하여 댓글을 삭제한다.

 

# 댓글 삭제 버튼을 추가하고, 클릭 이벤트를 감지를 해서 댓글 삭제 요청을 REST API로 보내는것 까지 진행을 한다.

list.mustache 파일의 전체 소스코드

<div id="comments-list">
    {{#commentDtos}}
        <div class="card m-2" id="comments-{{id}}">
            <div class="card-header">
                {{nickname}}
                <!-- 모달 트리거 버튼 -->
                <button type="button"
                        class="btn btn-sm btn-outline-primary"
                        data-bs-toggle="modal"
                        data-bs-target="#comment-edit-modal"
                        data-bs-id="{{id}}"
                        data-bs-nickname="{{nickname}}"
                        data-bs-body="{{body}}"
                        data-bs-article-id="{{articleId}}">수정
                </button>
                <!-- 댓글 삭제 버튼 -->
                <button type="button"
                        class="btn btn-sm btn-outline-danger comment-delete-btn"
                        data-comment-id="{{id}}">삭제
                </button>
            </div>
            <div class="card-body">
                {{body}}
            </div>
        </div>
    {{/commentDtos}}
</div>


<!-- Modal -->
<div class="modal fade" id="comment-edit-modal" tabindex="-1">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="exampleModalLabel">댓글 수정</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
                <!-- 댓글 작성 폼 -->
                <form>
                    <!-- 닉네임 입력-->
                    <div class="bm-3">
                        <label class="form-label">닉네임</label>
                        <input class="form-control form-control-sm" id="edit-comment-nickname">
                    </div>

                    <!-- 댓글 본문 입력 -->
                    <div class="mb-3">
                        <label class="form-label">댓글 내용</label>
                        <textarea class="form-control form-control-sm" rows="3" id="edit-comment-body"></textarea>
                    </div>

                    <!-- 히든 인풋 -->
                    <input type="hidden" id="edit-comment-id">
                    <input type="hidden" id="edit-comment-article-id">

                    <!-- 전송 버튼 -->
                    <button type="button" class="btn btn-outline-primary btn-sm" id="comment-update-btn">수정 완료</button>
                </form>
            </div>
        </div>
    </div>
</div>

<!-- 모달 이벤트 처리 -->
<script>
{
    // 모달 요소 선택
    const commentEditModal = document.querySelector("#comment-edit-modal");

    // 모달 이벤트 감지
    commentEditModal.addEventListener("show.bs.modal", function(event) {
        // 트리거 버튼 선택
        const triggerBtn = event.relatedTarget;

        // 데이터 가져오기
        const id = triggerBtn.getAttribute("data-bs-id");
        const nickname = triggerBtn.getAttribute("data-bs-nickname");
        const body = triggerBtn.getAttribute("data-bs-body");
        const articleId = triggerBtn.getAttribute("data-bs-article-id");

        // 데이터 반영
        document.querySelector("#edit-comment-nickname").value = nickname;
        document.querySelector("#edit-comment-body").value = body;
        document.querySelector("#edit-comment-id").value = id;
        document.querySelector("#edit-comment-article-id").value = articleId;
    });

{

}
    // 수정 완료 버튼
    const commentUpdateBtn = document.querySelector("#comment-update-btn");

    // 클릭 이벤트 감지 및 처리
    commentUpdateBtn.addEventListener("click",function() {
        // 수정 객체 댓글을 생성
        const comment = {
            id: document.querySelector("#edit-comment-id").value,
            nickname: document.querySelector("#edit-comment-nickname").value,
            body: document.querySelector("#edit-comment-body").value,
            article_id: document.querySelector("#edit-comment-article-id").value
        };

        console.log(comment);

        // 수정 REST API 호출 - fetch()
        const url = "/api/comments/"+comment.id;
        fetch(url, {
            method: "PATCH",            // PATCH 요청
            body: JSON.stringify(comment), // 수정된 댓글 객체를 JSON 으로 전달
            headers: {
                "Content-Type": "application/json"
        }
        }).then(response => {
            // http 응답 코드에 따른 메세지 출력
                const msg = (response.ok) ? "댓글 수정이 완료 되었습니다." : "댓글 수정 실패...!";
                alert(msg);
            // 현재 페이지를 새로 고침
            window.location.reload();
        });
    });
}



</script>

<!-- 댓글 삭제 -->
<script>
{
    // 삭제 버튼 선택 (해당 값을 변수로 가져와야 한다.)
    const commentDeleteBtns = document.querySelectorAll(".comment-delete-btn"); // id 값이 아닌 class 값을 가져올때는 .을 찍고 값을 가져오면 된다.

    // 삭제 버튼 이벤트를 처리
    commentDeleteBtns.forEach(btn => {
        // 각 버튼의 이벤트 처리를 등록한다.
        btn.addEventListener("click", (event) => {
            // 이벤트 발생 요소를 선택
            const commentDeleteBtn = event.srcElement;

            // 삭제 댓글 id 가져오기
            const commentId = commentDeleteBtn.getAttribute("data-comment-id");
            console.log(`삭제 버튼 클릭: ${commentId}번 댓글`); // 오른쪽 코드와 같은 내용이다. "삭제 버튼 클릭: " + commentId + "번 댓글";


            // 삭제 API 호출 및 처리
            // 해당 url 값은 CommentApiController 파일의 // 댓글 삭제 내용을 실행 한다.
            const url = `/api/comments/${commentId}`; // 백틱: 숫자 1번 왼쪽 ~ ``을 사용한다.
            fetch(url, {
                method: "DELETE"
            }).then(response => {
                // 댓글 삭제 실패 처리
                if (!response.ok) {
                    alert("댓글 삭제 실패..!");
                    return;
                }

                // 삭제 성공 시, 댓글을 화면에서 지움!
                const target = document.querySelector(`#comments-${commentId}`);
                target.remove();
            });
        });
    });
}
</script>
728x90
반응형

'⭐ SpringBoot > 𝄜 게시판 with SpringBoot' 카테고리의 다른 글

28. IOC 와 DI  (0) 2022.04.11
27. DB 설치 및 연동  (0) 2022.04.11
25. 댓글 수정 with 자바스크립트  (0) 2022.04.08
24. 댓글 등록 with JavaScript  (0) 2022.04.08
23. 댓글 목록 뷰 만들기  (0) 2022.04.08