sori.studio

์›Œ๋“œํ”„๋ ˆ์Šค ๊ฒŒ์‹œ๊ธ€์— ๋Œ“๊ธ€ ๊ธฐ๋Šฅ ๋ถ™์ด๊ธฐ (REST API ๊ธฐ๋ฐ˜)

๐Ÿ“˜ ์›Œ๋“œํ”„๋ ˆ์Šค REST API๋ฅผ ์ด์šฉํ•ด์„œ ๋‚˜๋งŒ์˜ ์‚ฌ์ดํŠธ ๋งŒ๋“ค๊ธฐ - 6ํŽธ

๊ฒŒ์‹œ๋ฌผ์— ๋Œ“๊ธ€ ๋ณด๊ธฐ & ์ž‘์„ฑ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ (๋Œ“๊ธ€ API ํ™œ์šฉ)

 

 

 

 

๐Ÿงญ ๊ฒŒ์‹œ๋ฌผ ํด๋ฆญ → ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๊ตฌ์กฐ

 

ํฌ์ŠคํŒ…์€ ๋”ฐ๋กœ ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก ํ™”๋ฉด(index.html)์—์„œ ๊ฐ ๊ฒŒ์‹œ๋ฌผ ํ•˜๋‹จ์— ๊ฐ ๊ฒŒ์‹œ๋ฌผ์˜ ๋งํฌ๋ฅผ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ๊ณผ, ํ˜„์žฌ ๊ฒŒ์‹œ๋ฌผ์— ์ž‘์„ฑ๋œ ๋Œ“๊ธ€์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ณด์—ฌ์ง€๋„๋ก ๊ตฌํ˜„ํ•ด๋†“์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๋ฉ”์ธํ™”๋ฉด์—์„œ ๋ณด์—ฌ์ง€๋Š” ๋ชจ์Šต


์—ฌ๊ธฐ์„œ ๋Œ“๊ธ€์„ ํด๋ฆญํ•˜๋ฉด id๋ฅผ ํฌํ•จํ•œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

location.href = `post.html?id=${post.id}`;

 

๊ทธ๋ ‡๊ฒŒ ์ด๋™ํ•œ post.html์—์„œ๋Š” URL์—์„œ id ๊ฐ’์„ ์ถ”์ถœํ•˜์—ฌ ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

const postId = new URLSearchParams(location.search).get("id");
const postUrl = `https://myDomain.com/wp-json/wp/v2/posts/${postId}`;

 

 

 

์ƒ์„ธ ํŽ˜์ด์ง€(post.html) ๊ตฌ์กฐ:

<h3>๋Œ“๊ธ€</h3>
<div id="commentList"></div>

<h4>๋Œ“๊ธ€ ์ž‘์„ฑ</h4>
<textarea id="commentContent" placeholder="๋Œ“๊ธ€์„ ์ž…๋ ฅํ•˜์„ธ์š”"></textarea>
<button onclick="submitComment()">๋Œ“๊ธ€ ์ž‘์„ฑ</button>

 

๐Ÿ“ฅ ๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ (GET):

์›Œ๋“œํ”„๋ ˆ์Šค์˜ ๋Œ“๊ธ€ REST API๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ„๋‹จํžˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const commentsUrl = `https://myDomain.com/wp-json/wp/v2/comments?post=${postId}`;
const res = await fetch(commentsUrl);
const comments = await res.json();

 

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์ด์šฉํ•ด ๋Œ“๊ธ€ ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋ ค์ค๋‹ˆ๋‹ค.

function renderComments(comments, parentId = 0, depth = 0) {
  return comments
    .filter(c => c.parent === parentId)
    .map(c => {
      const replies = renderComments(comments, c.id, depth + 1);
      const indent = `margin-left: ${depth * 20}px`;
      return `
        <div class="comment" style="${indent}">
          <div class="comment-author">${c.author_name}</div>
          <div class="comment-content">${c.content.rendered}</div>
          <button onclick="showReplyForm(${c.id}, ${depth + 1})">๋‹ต๊ธ€</button>
          <div id="reply-form-${c.id}"></div>
          ${replies}
        </div>
      `;
    }).join("");
}

 

๐Ÿ“ ๋Œ“๊ธ€ ์ž‘์„ฑ (POST)

async function submitComment(parentId = 0) {
  const textareaId = parentId ? `replyContent-${parentId}` : "commentContent";
  const content = document.getElementById(textareaId).value.trim();
  if (!content) return alert("๋Œ“๊ธ€์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");

  const res = await fetch("https://myDomain.com/wp-json/wp/v2/comments", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${token}`, // ๋กœ๊ทธ์ธ ํ† ํฐ
    },
    body: JSON.stringify({
      post: postId,
      content,
      parent: parentId,
    }),
  });

  if (res.ok) {
    document.getElementById(textareaId).value = "";
    loadComments(); // ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ๋Œ“๊ธ€ ๋ฐ˜์˜
  } else {
    const err = await res.json();
    alert("๋Œ“๊ธ€ ์ž‘์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค: " + (err.message || "์˜ค๋ฅ˜"));
  }
}

 

 

 

๋‹ต๊ธ€์— ๋Œ“๊ธ€์„ ๋‹ฌ๊ธฐ์œ„ํ•œ ๋‹ต๊ธ€ ํผ ๋™์  ์ƒ์„ฑ:

function showReplyForm(parentId, depth) {
  const container = document.getElementById(`reply-form-${parentId}`);
  container.innerHTML = `
    <textarea id="replyContent-${parentId}" placeholder="๋‹ต๊ธ€์„ ์ž…๋ ฅํ•˜์„ธ์š”"></textarea>
    <button onclick="submitComment(${parentId})">๋‹ต๊ธ€ ์ž‘์„ฑ</button>
  `;
}

 

์™„์„ฑ๋œ ๋ชจ์Šต

 

 

๐ŸŽ‰ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ง€๊ธˆ๊นŒ์ง€ ์ด 6ํŽธ์— ๊ฑธ์ณ ์›Œ๋“œํ”„๋ ˆ์Šค REST API๋ฅผ ํ™œ์šฉํ•ด ๋‚˜๋งŒ์˜ ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ธ์ฆ๋ถ€ํ„ฐ ๊ฒŒ์‹œ๋ฌผ ์ž‘์„ฑ, ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ, ๊ฒ€์ƒ‰, ๋Œ“๊ธ€ ๊ธฐ๋Šฅ๊นŒ์ง€, ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์€ ์–ด๋А ์ •๋„ ๊ตฌํ˜„๋˜์—ˆ๊ธฐ์— ์ด ์—ฐ์žฌ๋Š” ์—ฌ๊ธฐ์„œ ๋งˆ๋ฌด๋ฆฌํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.


ํ•˜์ง€๋งŒ ์‚ฌ์‹ค, ์ง€๊ธˆ๋ถ€ํ„ฐ๊ฐ€ ์ง„์งœ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค.

์ด์ œ๋ถ€ํ„ฐ๋Š” ๊ฐ์ž์˜ ์Šคํƒ€์ผ์— ๋งž๊ฒŒ ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋‚˜๊ฐ€๊ธฐ ๋‚˜๋ฆ„์ž…๋‹ˆ๋‹ค.


์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋Ÿฐ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค:

  • โœ๏ธ ๊ฒŒ์‹œ๋ฌผ ์ˆ˜์ •/์‚ญ์ œ ๊ธฐ๋Šฅ
  • ๐Ÿ’ฌ ๋Œ“๊ธ€ ์ˆ˜์ •/์‚ญ์ œ ๊ธฐ๋Šฅ
  • ๐ŸŽจ ์™ธํ˜• ๊พธ๋ฏธ๊ธฐ (CSS ์ปค์Šคํ„ฐ๋งˆ์ด์ง•, ๋‹คํฌ๋ชจ๋“œ ๋“ฑ)

์‚ฌ์‹ค 1~2ํŽธ ์“ฐ๋Š” ๋™์•ˆ ์‹ค์ œ ๊ตฌํ˜„์€ ๋Œ€๋ถ€๋ถ„ ๋๋‚˜๋ฒ„๋ ธ๊ณ , ๊ทธ ์ดํ›„๋กœ๋Š” ๊ธ€์„ ์ž‘์„ฑํ•˜๊ธฐ์œ„ํ•ด์„œ ํ•ต์‹ฌ๊ธฐ๋Šฅ๋งŒ ๋นผ๋‚ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ž๋‹ˆ ์˜คํžˆ๋ ค ์ฝ”๋“œ๊ฐ€ ๊ผฌ์ด๊ฑฐ๋‚˜ ๊ท€์ฐฎ์•„์„œ ๊ธ€์„ ์“ฐ๋Š” ๊ฒŒ ์กฐ๊ธˆ ๋ฒ„๊ฒ๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜๋„ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์ด ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ, ์ด๋ ‡๊ฒŒ ๋งˆ๋ฌด๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ™‡