티스토리 뷰

Backend/SpringBoot

SpringBoot 비동기 댓글

Mo'Greene 2023. 4. 27. 16:03
<div class="replyContent">
	//댓글 등록될 곳
	<div id="replyList">
	</div>
    
	<form>
		<input type="hidden" id="boardNo" th:value="${dto.boardNo}">
		<div class="card" style="margin-top: 10px;">
                	<div class="card-body"><textarea class="form-control" rows="1" id="replyContent"></textarea></div>
                	<div class="card-footer"><button class="btn btn-primary" id="btn-reply-save">등록</button></div>
		</div>
	</form>
</div>

div태그 id="replyList" 부분에 가져온 데이터들을 삽입하게 된다.

 

//스크립트 태그
<script layout:fragment="script" th:inline="javascript">
    $(document).ready(function () {
        getReplyList()
    })

    function getReplyList() {
        var boardNo = [[ ${dto.boardNo} ]]
        const replyList = document.getElementById("replyList");

        $.ajax({
            type: 'GET',
            url: '/reply/' + boardNo,
            success: function (res) {
                replyList.innerHTML = ``

                for (let i = 0; i < res.data.length; i++) {
                    const reply = res.data[i];
                    const date = new Date(reply.replyRegDate);
                    const formattedDate = date.toISOString().slice(0, 16).replace('T', ' ');
                    let replyContent = reply.replyContent;

                    const html = `
                        <th:block>
                            <div class="row justify-content-start px-2 pt-2">
                                ${formattedDate}
                            </div>
                            <div class="row border-bottom px-2 pb-3 text-break">
                                ${replyContent}
                            </div>
                        </th:block>
                    `;

                    replyList.innerHTML += html;
                }
            },
        })
    }
</script>

날짜 포맷팅 같은 경우 Date객체를 가져와 따로 날짜 처리를 해줘야 된다.


Controller
/**
 * 댓글 비동기 RestController
 * @author mogreene
 */
@Slf4j
@RestController
@RequiredArgsConstructor
public class ReplyController {

    private final ReplyService replyService;

    /**
     * 댓글 등록
     * @param boardNo
     * @param replyDTO
     * @return
     */
    @PostMapping("/reply/{boardNo}")
    public ResponseEntity<ApiResponseDTO<?>> postReply(@PathVariable Long boardNo,
                                                       @RequestBody ReplyDTO replyDTO) {

        int success = replyService.postReply(boardNo, replyDTO);

        if (success != 1) {
            throw new IllegalArgumentException("댓글 등록 실패!");
        }

        ApiResponseDTO<?> apiResponseDTO = ApiResponseDTO.builder()
                .httpStatus(HttpStatus.CREATED)
                .data("Reply Create!")
                .build();
        return new ResponseEntity<>(apiResponseDTO, HttpStatus.CREATED);
    }

    /**
     * 댓글 조회
     * @param boardNo
     * @return
     */
    @GetMapping("/reply/{boardNo}")
    public ResponseEntity<ApiResponseDTO<?>> getReplyList(@PathVariable Long boardNo) {

        List<ReplyDTO> dtoList = replyService.getReply(boardNo);

        ApiResponseDTO<?> apiResponseDTO = ApiResponseDTO.builder()
                .httpStatus(HttpStatus.CREATED)
                .data(dtoList)
                .build();
        return new ResponseEntity<>(apiResponseDTO, HttpStatus.CREATED);
    }
}

ApiResponseDTO 는 일관된 Json응답을 보내주기 위해 따로 만들었다. 만약 필요없다면 ResponseEntity<?>로 아무값이나 넣어주면 된다.

 

그 외 댓글을 가져오는 service나 repository는 많은 예제와 원하는 설정이 있을테니 알아서 입맛것 사용하면 될듯하다.

Comments