댓글 DB에 저장되어있는 작성자 이름과 스프링 시큐리티 로그인 정보의 사용자 이름이 같다면 삭제 버튼이 보이도록 설정해준다.
<button th:replyId="${reply.id}" th:onclick="replyDelete(this.getAttribute('replyId'))"
id="btn-reply-delete"
th:if="${reply.user.username.equals(#authentication.name)}"
class="badge bg-danger">삭제</button>
Thymeleaf 환경에서 외부 자바스크립트 파일에 선언된 함수를 참조하는 방법을 찾지 못하여서 html파일에 인라인 자바스크립트 코드를 생성하여 동작하도록 생성하였다.
board.js 에 선언되어 있어야 할 스크립트 코드가 html 파일 내부에 선언되어 있어 유지보수에 용이하지 못하기 때문에 추후 리팩터링이 필요하다.
<script type="text/javascript" th:inline="javascript">
let boardId = $.parseJSON('[[ ${board.id} ]]');
function replyDelete(replyId){
$.ajax({
type: "DELETE",
url: `/api/board/${boardId}/reply/${replyId}`,
dataType: "json",
}).done(function (response) {
// 요청 결과가 정상인 경우
const status = response.status;
if (status === 200){
alert("댓글 삭제가 완료 되었습니다.");
location.href = ("/board/" + boardId);
} else {
alert(response.data);
}
}).fail(function (error) {
// 요청 결과가 비정상인 경우
alert(JSON.stringify(error));
});
}
</script>
“/api/board/{boardId}/reply/{replyId}” 주소로 DELETE
요청을 보낸다.
@DeleteMapping("/api/board/{boardId}/reply/{replyId}")
public ResponseDTO<Integer> replyDelete(@PathVariable int boardId,
@PathVariable int replyId){
boardService.replyDelete(replyId);
return new ResponseDTO<>(HttpStatus.OK.value(), 1);
}
댓글 작성자가 아니라도 댓글 삭제 URI를 알아내어 삭제 요청을 보내면 댓글이 삭제될 위험이 존재하기 때문에 백단에서 한번 더 검증을 진행하는 것이 좋을 것 같다.