๐Ÿ”ฅ #20 ๋Œ“๊ธ€ ์ž‘์„ฑํ•˜๊ธฐ

myeonjiยท2022๋…„ 2์›” 25์ผ
0

๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.

๋จผ์ € ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธํŽ˜์ด์ง€์˜ ๋Œ“๊ธ€ ์ž‘์„ฑ ๋ฒ„ํŠผ์— id๋ฅผ ๋„ฃ๊ณ  board.js ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

< detail.jsp >

.
.
.
<div class="card">
        <form>
            <input type="hidden" id="boardId" value="${board.id}" />
            <div class="card-body">
                <textarea id="reply-content" class="form-control" row = "1"></textarea>
            </div>
            <div class="card-footer">
                <button type="button" id="btn-reply-save" class="btn btn-primary">๋“ฑ๋ก</button>
            </div>
        </form>
    </div>
    <br />
    <div class="card">
        <div class="card-header">๋Œ“๊ธ€ ๋ฆฌ์ŠคํŠธ</dv>
            <ul id="reply--box" class="list-group">
                <c:forEach var="reply" items="${board.replys}">
                    <li id="reply--1" class="list-group-item d-flex justify-content-between">
                        <div>${reply.content}</div>
                        <div class="d-flex">
                            <div class="font-italic">์ž‘์„ฑ์ž : ${reply.user.username} &nbsp;</div>
                            <button class="badge">์‚ญ์ œ</button>
                        </div>
                    </li>
                </c:forEach>
            </ul>
        </div>
.
.
.

< board.js >

replySave: function () {
        let data = {
            content: $("#reply-content").val()
        };
        let boardId = $("#boardId").val()

        $.ajax({
            type: "POST",
            url: `/api/board/${boardId}/reply`,
            data: JSON.stringify(data),
            contentType: "application/json; charset=utf-8",
            dataType: "json"
        }).done(function (resp) {
            // ๊ฒฐ๊ณผ๊ฐ€ ์ •์ƒ์ด๋ฉด done ์‹คํ–‰
            alert("๋Œ“๊ธ€์ž‘์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
            location.href = `/board/${boardId}`;
        }).fail(function (error) {
            // ์‹คํŒจํ•˜๋ฉด fail ์‹คํ–‰
            alert("๋Œ“๊ธ€์ž‘์„ฑ์ด ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.");
            alert(JSON.stringify(error));
        });
    },

์—ฌ๊ธฐ์„œ url ์— ๋ฐฑํ‹ฑ์„ ์“ฐ๋Š” ์ด์œ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋ฅผ ๋ฌธ์ž์—ด์— ๋ฐ”์ธ๋”ฉ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

Reply ์˜ค๋ธŒ์ ํŠธ๋Š” Board์™€ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ๋Œ“๊ธ€์ด ์–ด๋Š ๊ธ€์— ์“ฐ์—ฌ์ง„ ๊ฒƒ์ธ์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ jsp์—์„œ hidden ๊ฐ’์œผ๋กœ board.id ๋ฅผ ๋„˜๊ฒจ์ฃผ์—ˆ๊ณ , ์ด๋ฅผ board.js ์—์„œ ๋ฐ›์•„ url๋กœ ๋ณด๋ƒˆ๋‹ค.

๐ŸŽˆ data๋Š” body์— ๋‹ด๊ณ , boardId๋Š” ์ฃผ์†Œ์— ๋‹ด์€ ๊ฒƒ!!

์ด์ œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์œ„์˜ ์ฃผ์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

< BoardApiController >

	@PostMapping("/api/board/{boardId}/reply")
    public ResponseDto<Integer> replySave(@PathVariable int boardId, @RequestBody Reply reply, @AuthenticationPrincipal PrincipalDetail principal) {

        boardService.๋Œ“๊ธ€์“ฐ๊ธฐ(principal.getUser(), boardId, reply);
        return new ResponseDto<Integer>(HttpStatus.OK.value(), 1);
    }

boardId ์™€ reply ๊ฐ์ฒด, principal๋กœ ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๋ฅผ ๋ฐ›์•„์˜จ๋‹ค. (๋Œ“๊ธ€์„ ์ž‘์„ฑํ•œ User ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด)

< BoardService >

	@Transactional // ์ „์ฒด๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ commit, ์‹คํŒจํ•˜๋ฉด rollback
    public void ๋Œ“๊ธ€์“ฐ๊ธฐ(User user, int boardId, Reply requestReply) {
        Board board = boardRepository.findById(boardId)
                .orElseThrow(()->{
                    return new IllegalArgumentException("๋Œ“๊ธ€ ์“ฐ๊ธฐ ์‹คํŒจ : ๊ฒŒ์‹œ๊ธ€ id๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. id : " + boardId);
                });
        requestReply.setBoard(board);
        requestReply.setUser(user);

        replyRepository.save(requestReply);
    }

reply์—๋Š” content ๋ฐ–์— ์—†์œผ๋ฏ€๋กœ user์™€ board๋ฅผ ์ง์ ‘ setํ•œ ํ›„, save ํ•œ๋‹ค.

์™„๋ฃŒ ใ…Žใ…Ž

profile
๐Ÿ“š

0๊ฐœ์˜ ๋Œ“๊ธ€