ํฐ์คํ ๋ฆฌ ์นดํ ๊ณ ๋ฆฌ ์ต์ ๊ธ ๋น๋๊ธฐ ๋ก๋ฉ ์คํฌ๋ฆฝํธ ์๊ฐ
๊ธฐ๋ณธ ๊ด๋ จ๊ธ ํ๋ฌ๊ทธ์ธ ์ฌ์ฉ ์ ๋ฐ์ํ๋ ์ด๋ฏธ์ง ๊ณต๋ฐฑ, ์ ๋ชฉ ์ถ์ฝ, Hํ๊ทธ ์ถฉ๋ ๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ณ ์ค์ ๋ก ํฐ์คํ ๋ฆฌ์ ๋ฐ๋ก ์ ์ฉ ๊ฐ๋ฅํ ์ต์ ํ ์ฝ๋์ ์ ์ฉ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฒ๊ธ์๋ ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์์ ๋ณธ๋ฌธ ํ๋จ์ ๋์ผ์นดํ ๊ณ ๋ฆฌ์ ์ต์ ํฌ์คํ 5๊ฐ๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๊ณต์ ํฉ๋๋ค.. ์ด ์ฝ๋๋ SEO์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ์ต์ํ ํ๊ณ ๋ธ๋ผ์ฐ์ ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋ฐฉํดํ์ง ์์ผ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋๋ค.
๊ธฐ์กด ์ต์ ๊ธ๊ณผ ๊ด๋ จ๊ธ์ ๋ฌธ์ ์
๊ธฐ๋ณธ์ ์ผ๋ก ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์์๋ ๊ด๋ จ ๊ธ๊ณผ ์์ฒด ํ๋ฌ๊ทธ์ธ์ ํตํด ์นดํ
๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ์ ๊ธ ๋ณธ๋ฌธ ํ๋จ์ ํ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ์ญ์ ๊ธฐ์กด์๋ ๊ด๋ จ ๊ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๊ณ , ์นดํ
๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ ํ๋ฌ๊ทธ์ธ๋ง ์ฌ์ฉํด ์์ต๋๋ค.
ํ์ง๋ง ์ต๊ทผ์๋ ๊ตณ์ด ์ด๋ฌํ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๊ณ ํ๋จํ์ฌ, ์ ๊ฐ ์ง์ ์ฌ์ฉํ๋ ค๊ณ ๊ฐ๋จํ ์ฝ๋๋ฅผ ์ ์ํ๊ฒ ๋์์ต๋๋ค.
์ฐ์ , ์ ํฐ์คํ ๋ฆฌ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์ฝ๊ณ ํธ๋ฆฌํ ๊ด๋ จ ๊ธ ๋ฐ ์นดํ
๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ ๊ธฐ๋ฅ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์๋์ง๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ๊ด๋ จ ๊ธ ๊ธฐ๋ฅ์ ๋ฌธ์ ์
์ฝํ ์ธ ์ ์ ์ ์ด๋ฏธ์ง๋ฅผ ์ฒจ๋ถํ์ง ์์ผ๋ฉด, ์ด๋ฏธ์ง ๋๋ฝ์ผ๋ก ์ธํด ์ ์ฒด ๋์์ธ์ด ๋ณด๊ธฐ ์ข์ง ์๊ฒ ๊นจ์ง๋๋ค.๋ํ ์ ๋ชฉ์ด ์ง๋์น๊ฒ ์งง๊ฒ ๋ ธ์ถ๋์ด, ๋ฐฉ๋ฌธ์๊ฐ ํด๋น ๊ธ์ด ์ด๋ค ๋ด์ฉ์ ๋ด๊ณ ์๋์ง ์ ํ ํ์ ํ ์ ์์ต๋๋ค.

2. ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ ๊ธฐ๋ฅ์ ๋ฌธ์ ์
์นดํ ๊ณ ๋ฆฌ ์๋จ ์ ๋ชฉ์ H4 ํ๊ทธ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ๋์ด ์์ด, ๋ณธ๋ฌธ ์ฝํ ์ธ ์์ H ํ๊ทธ๋ฅผ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ ํค๋ฉ ๊ตฌ์กฐ(Hierarchy)๊ฐ ๊ผฌ์ด๋ฉด์ SEO(์ฝ์ด ์น ๋ฐ์ดํ ๋ฐ ๋ฌธ์ ๊ตฌ์กฐ)์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ํ ๊ธฐ๋ณธ ๊ธ์ ์์ ๋๋น๊ฐ ์ถฉ๋ถํ์ง ์์, ์ ๊ทผ์ฑ ์ ์(Accessibility Score)๊ฐ ํ๋ฝํ๋ ์์ธ์ด ๋ฉ๋๋ค..

์นดํ ๊ณ ๋ฆฌ ๋ค๋ฅธ๊ธ ์ฝ๋ ์๋ ๋ฐฉ์
1. ๋ฐ์ดํฐ ์์ง ๋ฐ ํ์ฑ ๋ก์ง: Fetch API์ DOMParser
์คํฌ๋ฆฝํธ๋ ์ฌ์ฉ์๊ฐ ํ์ฌ ๋ณด๊ณ ์๋ ๊ธ์ ์นดํ ๊ณ ๋ฆฌ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋คํธ์ํฌ ํต์ ์ ์ํํฉ๋๋ค.
- ๋น๋๊ธฐ ํต์ (Fetch API):
fetch("/category/" + categoryPath)๋ฅผ ํตํด ํด๋น ์นดํ ๊ณ ๋ฆฌ ๋ชฉ๋ก ํ์ด์ง์ ์ ์ฒด HTML ์์ค๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ๋ฐฐ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋ฐฉ์์ ๋๋ค. - ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ํ์ฑ (DOMParser): ๊ฐ์ ธ์จ ํ
์คํธ ํํ์ HTML ๋ฐ์ดํฐ๋ฅผ
DOMParser().parseFromString์ ํตํด ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ DOM ๋ฌธ์๋ก ๋ณํํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ค์ ํ๋ฉด์๋ ์ํฅ์ ์ฃผ์ง ์๊ณ ํ์ํ ๋ฐ์ดํฐ๋ง ์ถ์ถํ ์ ์์ต๋๋ค.
2. ๋ฐ์ดํฐ ์ ์ ๋ฐ ๋ณด์ ์ฒ๋ฆฌ
์์ง๋ ๋ฐ์ดํฐ ์ค ์ ํจํ ์ฝํ ์ธ ๋ง์ ์ ๋ณํ์ฌ ๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ๊ณผ์ ์ ๋๋ค.
| ๋จ๊ณ | ์ ์ฉ ๊ธฐ์ ๋ฐ ๋ก์ง | ๋ชฉ์ |
|---|---|---|
| ์ค๋ณต ๊ฒ์ฌ | Set() ์๋ฃ๊ตฌ์กฐ ๋ฐ currentPath ๋น๊ต |
ํ์ฌ ์ฝ๊ณ ์๋ ๊ธ์ด ๋ชฉ๋ก์ ์ค๋ณต ๋ ธ์ถ๋๋ ๊ฒ์ ๋ฐฉ์ง |
| ๋ฐ์ดํฐ ์ถ์ถ | querySelectorAll ๋ฐ querySelector |
์ ๋ชฉ, ๋งํฌ, ์์ฝ๋ฌธ(excerpt) ๋ฑ์ ํน์ ํด๋์ค ์์ ์ ๋ณ |
| ํ ์คํธ ๊ฐ๊ณต | trim() ๋ฐ ์ ๊ทํํ์ replace(/\s+/g, " ") |
๋ถํ์ํ ๊ณต๋ฐฑ ์ ๊ฑฐ ๋ฐ ํ ์คํธ ๋ฐ์ดํฐ ์ ๊ทํ |
| ๊ธธ์ด ์ ํ | slice(0, 120) |
๋ ์ด์์ ๊นจ์ง ๋ฐฉ์ง๋ฅผ ์ํ ์์ฝ๋ฌธ ๊ธธ์ด ์ต์ ํ |
3. ๋์ DOM ์์ฑ
์ต์ข ์ ์ผ๋ก ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ ์น ํ์ด์ง์ ์ฝ์ ํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋จ๊ณ์ ๋๋ค.
- ๋์ ๋
ธ๋ ์ฝ์
:
document.createElement("li")์innerHTML์ ์กฐํฉํ์ฌ ๊ฐ ๊ฒ์๊ธ์ ๋งํฌ์ ์ ๋ชฉ์ ํฌํจํ HTML ๊ตฌ์กฐ๋ฅผ ์์ฑํ ๋ค,appendChild๋ก ๊ธฐ์กด ๋ชฉ๋ก(ul)์ ์ถ๊ฐํฉ๋๋ค.
4. ์์ธ ์ฒ๋ฆฌ ์ ๋ต
๋คํธ์ํฌ ์ค๋ฅ๋ ์นดํ
๊ณ ๋ฆฌ ์ ๋ณด ๋ถ์ฌ ์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด catch ๊ตฌ๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ์ ํ์ฉํฉ๋๋ค. ๋ง์ฝ ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ๊ฐ ํ๋๋ ์์ ๊ฒฝ์ฐ sectionEl.style.display = "none" ์ฒ๋ฆฌ๋ฅผ ํตํด ๋น ์์ญ์ด ๋
ธ์ถ๋์ง ์๋๋ก UI์ ์์ฑ๋๋ฅผ ์ ์งํฉ๋๋ค.
5. ๊ธ ํ๋จ ๊ด๊ณ ๋ ธ์ถ ์ต์ ํ
์ฝํ
์ธ ํ๋จ์ ๊ด๊ณ ๋ฅผ ๋ฐฐ์นํ๋ฉด ๋๋ถ๋ถ ๋
ธ์ถ ์ฑ๊ณผ๊ฐ ์ข์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๊ทธ ์ด์ ์ค ํ๋๋ ๊ด๊ณ ์ฃผ๋ณ์ ์๋ฏธ ์๋ ์ฝํ
์ธ ๊ฐ ๋ถ์กฑํ์ฌ ๊ด๊ณ ์
์ฐฐ(Ad Auction)์ ๋ถ๋ฆฌํ๊ฒ ์์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋์ ์๋ ์ฝ๋๋ ๋จ์ํ ์นดํ
๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ์ ์ ๋ชฉ๋ง ๋์ดํ๋ ๋ฐฉ์์ด ์๋๋ผ,
ํด๋น ๊ธ๊ณผ ๊ด๋ จ๋ ์์ฝ ๋ด์ฉ์ ํจ๊ป ํ์ํ๋๋ก ๊ตฌ์ฑํ์ฌ,
๊ด๊ณ ๋ฌธ๋งฅ ์ ํธ(Contextual Signal)๋ฅผ ๊ฐํํ๊ณ ๊ด๊ณ ๋
ธ์ถ์ด ๋ณด๋ค ์ํํ๊ฒ ์ด๋ฃจ์ด์ง๋๋ก ์ค๊ณํ์ต๋๋ค.
์นดํ ๊ณ ๋ฆฌ ์ต์ ๊ธ ์๋ ์ถ๋ ฅ ์ฝ๋ ์ค๋ช ๋ฐ ์ค์น ๋ฐฉ๋ฒ
์ด ์ฝ๋๋ ํ์ฌ ๋ณด๊ณ ์๋ ๊ธ์ด ์ํ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก, ๊ฐ์ ์นดํ ๊ณ ๋ฆฌ์ ์ต์ ๊ธ 5๊ฐ๋ฅผ ์๋์ผ๋ก ๋ถ๋ฌ์ ๊ธ ํ๋จ์ ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ํฉ๋๋ค.
ํ์ด์ง๊ฐ ๋ก๋๋๋ฉด ํ์ฌ ๊ธ์ ์นดํ ๊ณ ๋ฆฌ๋ช ์ ์ฝ์ด ํด๋น ์นดํ ๊ณ ๋ฆฌ ํ์ด์ง๋ฅผ ์ง์ ๋ถ๋ฌ์ค๊ณ , ๊ทธ ์์์ ์ ๋ชฉ๊ณผ ์์ฝ(excerpt) ์ ๋ณด๋ฅผ ์ถ์ถํด ๋ชฉ๋ก ํํ๋ก ํ์ํฉ๋๋ค. ์ด ๊ณผ์ ์์ ํ์ฌ ๋ณด๊ณ ์๋ ๊ธ์ ์ ์ธ๋๋ฉฐ, ์ค๋ณต ๊ธ๋ ์๋์ผ๋ก ํํฐ๋ง๋ฉ๋๋ค.
๋ํ ์์ฝ ๋ฌธ์ฅ์ ํจ๊ป ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์, ๋จ์ํ ์ ๋ชฉ ๋์ด ๋ฐฉ์๋ณด๋ค ์ฝํ ์ธ ๋ฌธ๋งฅ์ด ๊ฐํ๋์ด๊ธ ํ๋จ ๊ด๊ณ (์ ๋์ผ์ค) ๋ ธ์ถ ๋ฐ ์ ์ฐฐ ํ๊ฒฝ์๋ ๊ธ์ ์ ์ธ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
๋ณ๋์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ, ํฐ์คํ ๋ฆฌ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ๊ณ ์์ ์ ์ผ๋ก ๋์ํ๋ ๊ฒ์ด ํน์ง์ ๋๋ค.
section id="category-latest"
P์ด ์นดํ
๊ณ ๋ฆฌ ์ต์ ๊ธ/P
ul id="category-latest-list"/ul
/section
script
(function () {
"use strict";
if (!/^\/\d+$/.test(location.pathname)) return;
const categoryEl = document.querySelector(".category");
const listEl = document.getElementById("category-latest-list");
const sectionEl = document.getElementById("category-latest");
if (!categoryEl || !listEl) return;
const categoryPath = categoryEl.textContent.trim();
if (!categoryPath) return;
const currentPath = location.pathname;
const used = new Set();
fetch("/category/" + categoryPath)
.then((r) = r.text())
.then((html) = {
const doc = new DOMParser().parseFromString(html, "text/html");
const items = doc.querySelectorAll("ul.posts-container li");
let count = 0;
for (const item of items) {
if (count = 5) break;
const linkEl = item.querySelector(".post-item a[href^='/']");
const titleEl = item.querySelector(".title");
const descEl = item.querySelector(".excerpt");
if (!linkEl || !titleEl) continue;
const url = linkEl.getAttribute("href");
if (!url || url === currentPath || used.has(url)) continue;
used.add(url);
const title = titleEl.textContent.trim();
if (!title) continue;
let desc = "";
if (descEl) {
desc = descEl.textContent.trim().replace(/\s+/g, " ").slice(0, 120);
}
const li = document.createElement("li");
li.innerHTML =
'a href="' +
url +
'"' +
'strong class="cat-title"' +
title +
"/strong" +
(desc ? 'span class="cat-desc"' + desc + "/span" : "") +
"/a";
listEl.appendChild(li);
count++;
}
if (count === 0 && sectionEl) sectionEl.style.display = "none";
})
.catch(() = {
if (sectionEl) sectionEl.style.display = "none";
});
})();
/script
ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ ์ค์น ๋ฐฉ๋ฒ
1. HTML ์ฝ์ ์์น ์ ํ
์๋ ์์น ์ค ํ๋๋ง ์ ํํด ์ฝ์ ํ๋ฉด ๋ฉ๋๋ค.
- ๊ธ์ฐ๊ธฐ ํ๋ฉด HTML ๋ชจ๋ ๊ธ ํ๋จ
- ์คํจ ํธ์ง HTML /article ๋๋ /div!-- article -- ๋ฐ๋ก ์
- ์คํจ ํธ์ง HTML /body ๋ฐ๋ก ์
2. ์ฝ๋ ์ฝ์
์๋ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํด ์ ํํ ์์น์ ๋ถ์ฌ ๋ฃ์ต๋๋ค.
- ๋ชจ๋ฐ์ผPC ๊ณตํต์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- ๊ธ ํ์ด์ง(/์ซ์)์์๋ง ์คํ๋๋๋ก ์กฐ๊ฑด์ด ์ด๋ฏธ ํฌํจ๋์ด ์์
- ์ถ๊ฐ ์์ ์์ด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
(์ฌ์ฉ ์ค์ธ ์คํจ์์ .category, .posts-container, .title, .excerpt ๊ตฌ์กฐ๊ฐ ์ ์ง๋์ด์ผ ์ ์ ์๋ํฉ๋๋ค. )
3. ๊ธฐ๋ณธ CSS
#category-latest {
margin: 48px auto 0;
padding-top: 28px;
border-top: 1px solid #e6e6e6;
max-width: 1200px;
}
#category-latest p, .related-articles p {
font-size: 1.15rem;
font-weight: 700;
margin-bottom: 20px;
color: #111;
}
#category-latest ul {
list-style: none;
padding: 0;
margin: 0;
}
#category-latest li {
margin-bottom: 20px;
}
#category-latest a {
display: block;
padding: 14px 16px;
border-radius: 10px;
text-decoration: none;
background: #fafafa;
transition: background 0.2s ease;
}
#category-latest a:hover {
background: #f0f0f0;
}
#category-latest strong {
display: block;
font-size: 1.2rem;
font-weight: 600;
line-height: 1.4;
color: #111;
}
#category-latest span {
display: block;
margin-top: 6px;
font-size: 0.85rem;
line-height: 1.5;
color: #666;
}
@media (max-width: 768px) {
#category-latest {
margin-top: 32px;
padding-top: 20px;
}
#category-latest a {
padding: 12px 14px;
}
category-latest span {
font-size: 0.8rem;
}
}
4. ์ ์ฉ ์์
์๋๋ ๊ธฐ๋ณธ CSS๋ฅผ ์ ์ฉํ ์์ ์ด๋ฏธ์ง์ ๋๋ค. ์์ ์ ๋ธ๋ก๊ทธ ๊ฐ์ฑ์ ๋ง๊ฒ ์ CSS๋ฅผ ์์ ํ์ฌ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.

๊ฒฐ๋ก ์ ์ผ๋ก ์ด ์ฝ๋๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๊ณผ ๋ธ๋ผ์ฐ์ ์ต์ ํ API๋ฅผ ํ์ฉํด,
ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์ ๋ด๋ถ ๋งํฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๊ณ ์ฌ์ฉ์ ์ฒด๋ฅ ์๊ฐ์ ์์ฐ์ค๋ฝ๊ฒ ๋๋ ค์ฃผ๋ ์คํฌ๋ฆฝํธ์
๋๋ค.
๊ด์ฌ ์์ผ์ ๋ถ๋ค์ ํ ๋ฒ ์ ์ฉํด ๋ณด์
๋ ์ข๊ฒ ์ต๋๋ค.