v9
★ PART · REST

비동기 댓글

REST API와 마무리 — 읽기 자료

📍 지금 어디를 만지고 있나요?
브라우저
REST API와 마무리
DB

핵심 용어

async/awaitPromise 를 더 읽기 쉽게 만든 자바스크립트 문법.

1. 문제

전 차시까지의 답답함

댓글 하나 달 때마다 새로고침되는 v6 — 사용자 경험이 답답.

2. 새 도구

새 테이블 + FK + Ajax

myreply 테이블 신설(ON DELETE CASCADE FK), Reply 도메인 추가, fetch 로 비동기 전송 후 응답 JSON 을 DOM 에 직접 추가.

3. 코드

-- DB: 새 테이블 + FK
CREATE TABLE myreply (
    num        INT          PRIMARY KEY AUTO_INCREMENT,
    content    VARCHAR(500) NOT NULL,
    boardnum   INT          NOT NULL,
    writer     VARCHAR(50)  NOT NULL,
    created_at DATETIME     DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (boardnum) REFERENCES myboard(num) ON DELETE CASCADE
);

// 도메인 (com.smhrd.domain)
@Data @AllArgsConstructor @NoArgsConstructor
public class Reply {
    private int num;
    private String content;
    private int boardnum;
    private String writer;
    private LocalDateTime createdAt;
}

// 서버 (com.smhrd.controller)
@RestController @RequestMapping("/api/replies")
public class ReplyApiController {
    @GetMapping
    public List<Reply> list(@RequestParam int boardnum) {
        return service.list(boardnum);
    }

    @PostMapping
    public Reply add(@RequestBody Reply r, HttpSession s) {
        Member u = (Member) s.getAttribute("loginUser");
        r.setWriter(u.getId());
        return service.add(r);
    }
}

// 클라이언트 JS
async function addReply(boardnum, content) {
    const res = await fetch('/api/replies', {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({boardnum, content})
    });
    const newReply = await res.json();
    document.querySelector('#replyList').innerHTML += `
        <div>${newReply.writer}: ${newReply.content}</div>
    `;
}

4. 정리

5. Before / After

전 차시 끝

댓글 하나 달 때마다 새로고침되는 v6 — 사용자 경험이 답답.

이번 차시 끝

새로고침 없이 댓글이 화면에 즉시 추가된다. v9.