treeru.com
SEO

블로그 SEO 실전 — 내부 링크, relatedPosts, 시리즈 네비게이션

2026-02-18
Treeru

블로그에 글을 30편 썼는데, 검색으로 들어온 사용자가 그 글 하나만 읽고 나갑니다. 페이지당 체류시간 40초, 이탈률 85%. 글의 품질이 아니라 글 사이의 연결이 없는 게 문제입니다.

내부 링크를 체계적으로 설계하면, 한 글에서 다른 글로 자연스럽게 이동하는 순환 구조가 만들어집니다. 체류시간이 늘고, 검색 엔진도 사이트 구조를 더 잘 이해합니다. 새 글이 검색에 빨리 노출되려면 IndexNow로 즉시 인덱싱을 요청하는 방법도 함께 활용하세요.

양방향
내부 링크
이전/다음
시리즈 네비
목록↔상세
순환 구조
자동
RSS Feed

1내부 링크가 중요한 이유

내부 링크는 두 가지 역할을 합니다.

SEO: 크롤링 효율 + 페이지 권한 전달

검색 엔진 크롤러는 링크를 따라 페이지를 발견합니다. 내부 링크가 많은 페이지는 '중요한 페이지'로 인식됩니다. 메인 페이지의 높은 PageRank가 내부 링크를 통해 하위 페이지로 전달됩니다.

UX: 체류시간 + 페이지뷰 증가

글 하단에 관련 글 3~5개를 보여주면, 독자가 다음 글로 이동합니다. '한 편만 읽고 나가는' 패턴이 '3~4편 연속으로 읽는' 패턴으로 바뀝니다.

내부 링크 효과

  • 고립된 페이지(orphan page): 어디서도 링크하지 않는 페이지는 크롤러가 발견하기 어렵습니다. sitemap에만 의존하게 됩니다.
  • 깊은 계층: 메인 → 카테고리 → 글 (3 depth)까지는 괜찮지만, 4~5 depth부터는 크롤링 빈도가 떨어집니다.
  • 앵커 텍스트: 내부 링크의 텍스트가 대상 페이지의 키워드와 관련 있어야 합니다. "여기를 클릭하세요" 대신 "CLS 최적화 방법"처럼 의미 있는 텍스트를 사용하세요.

블로그 글 하단에 "관련 글"을 보여주는 건 기본입니다. 핵심은 양방향 연결입니다. A 글에서 B를 추천하면, B 글에서도 A를 추천해야 합니다.

// _meta.json — 각 글에 relatedPosts 설정
// 이미지 최적화 글
{
  "slug": "image-optimization-pagespeed-36mb-to-800kb",
  "relatedPosts": [
    "nextjs-pagespeed-optimization-38-to-88",  // 허브 글
    "lcp-optimization-motion-opacity-trap",     // LCP 글
    "nextjs-img-vs-image-pagespeed"             // img vs Image
  ]
}

// 허브 글에서도 역방향 연결
{
  "slug": "nextjs-pagespeed-optimization-38-to-88",
  "relatedPosts": [
    "image-optimization-pagespeed-36mb-to-800kb",
    "cls-zero-typewriter-animation-fix",
    "korean-webfont-pagespeed-render-blocking-css",
    "lcp-optimization-motion-opacity-trap"
  ]
}
// lib/blog.ts — 관련 글 조회 로직
export function getRelatedPosts(
  currentSlug: string,
  tags: string[],
  category: string,
  manualRelated: string[] = [],
  limit: number = 5
) {
  // 1순위: _meta.json에서 직접 지정한 글
  const manual = manualRelated
    .map(slug => getPost(slug))
    .filter(Boolean);

  // 2순위: 같은 태그를 가진 글 (자동)
  const byTag = getAllPosts()
    .filter(p => p.slug !== currentSlug)
    .filter(p => p.tags.some(t => tags.includes(t)))
    .sort((a, b) => /* 태그 겹침 수 내림차순 */);

  // 중복 제거 후 limit개 반환
  return [...manual, ...byTag]
    .filter(unique)
    .slice(0, limit);
}

수동 지정과 태그 기반 자동 추천을 결합하면, 매번 관련 글을 일일이 정하지 않아도 됩니다. 태그가 겹치는 글이 자동으로 추천됩니다.

3시리즈 네비게이션

연재 글에는 "1편 / 2편 / 3편" 네비게이션이 필요합니다. 독자가 이전 글과 다음 글로 자연스럽게 이동할 수 있어야 합니다.

// 시리즈 네비게이션 컴포넌트 예시
function SeriesNav({ currentSlug, series }) {
  const currentIndex = series.findIndex(
    s => s.slug === currentSlug
  );

  return (
    <div className="border rounded-xl p-4 my-8">
      <h3 className="font-bold mb-3">
        {series.title} ({currentIndex + 1}/{series.items.length})
      </h3>

      <div className="space-y-1">
        {series.items.map((item, idx) => (
          <Link
            key={item.slug}
            href={`/blog/${item.slug}`}
            className={idx === currentIndex
              ? "font-bold text-primary"
              : "text-muted-foreground hover:text-foreground"
            }
          >
            {idx + 1}편: {item.title}
          </Link>
        ))}
      </div>

      <div className="flex justify-between mt-4">
        {currentIndex > 0 && (
          <Link href={series.items[currentIndex - 1].slug}>
            ← 이전 편
          </Link>
        )}
        {currentIndex < series.items.length - 1 && (
          <Link href={series.items[currentIndex + 1].slug}>
            다음 편 →
          </Link>
        )}
      </div>
    </div>
  );
}

시리즈 글 상단이나 하단에 전체 목록 + 이전/다음 버튼을 넣으면, 한 편을 읽은 독자가 시리즈 전체를 읽을 확률이 높아집니다.

4카테고리 페이지 설계

블로그 목록 페이지가 모든 글을 한꺼번에 보여주면, 검색 엔진은 이 페이지의 주제를 파악하기 어렵습니다. 카테고리별로 분류하면 주제 관련성이 명확해집니다.

구조URL용도
블로그 메인/blog전체 글 목록 + 카테고리 필터
카테고리 필터/blog?category=개발해당 카테고리 글만 표시
글 상세/blog/post-slug본문 + 관련 글 + 시리즈

이 구조에서 내부 링크 순환이 만들어집니다: 블로그 목록 → 글 상세 → 관련 글(또 다른 상세) → 블로그 목록. 사용자가 사이트 안에서 계속 돌아다니게 됩니다.

5RSS Feed 자동 생성

RSS feed는 직접적인 SEO 효과보다 구독 기반 트래픽에 중요합니다. Feedly, Inoreader 같은 RSS 리더에서 자동으로 수집됩니다.

// app/feed.xml/route.ts
import { getAllPosts } from "@/lib/blog";

export async function GET() {
  const posts = getAllPosts();
  const baseUrl = "https://example.com";

  const items = posts.map(post => `
    <item>
      <title>${escapeXml(post.title)}</title>
      <link>${baseUrl}/blog/${post.slug}</link>
      <description>${escapeXml(post.excerpt)}</description>
      <pubDate>${new Date(post.date).toUTCString()}</pubDate>
      <guid>${baseUrl}/blog/${post.slug}</guid>
      <category>${post.category}</category>
    </item>`).join("");

  const xml = `<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Your Blog</title>
    <link>${baseUrl}/blog</link>
    <description>블로그 설명</description>
    <atom:link href="${baseUrl}/feed.xml"
      rel="self" type="application/rss+xml"/>
    ${items}
  </channel>
</rss>`;

  return new Response(xml, {
    headers: { "Content-Type": "application/xml" },
  });
}

HTML <head>에 RSS 링크를 추가하면 브라우저가 자동 감지합니다:

// app/layout.tsx metadata에 추가
export const metadata = {
  alternates: {
    types: {
      "application/rss+xml": "/feed.xml",
    },
  },
};

6내부 링크 구조 정리

내부 링크 체크리스트

모든 글에 relatedPosts 3~5개 설정 — 양방향으로 연결
시리즈 글에는 전체 목록 + 이전/다음 네비게이션 추가
블로그 목록 페이지에서 카테고리별 필터 제공
글 본문 내에서 관련 개념 설명 시 다른 글로 링크
앵커 텍스트는 대상 페이지의 키워드와 관련된 의미 있는 텍스트 사용
사이드바에 인기 글, 최신 글 위젯으로 추가 내부 링크 확보
고립된 페이지(orphan page) 없도록 모든 글이 최소 2곳에서 링크
RSS feed 자동 생성 + head에 alternate 링크 추가

내부 링크는 SEO의 한 요소일 뿐이며, 콘텐츠 품질이 가장 중요합니다. 과도한 내부 링크(한 페이지에 50개 이상)는 오히려 역효과가 날 수 있습니다.

T

Treeru

웹 개발, IT 인프라, AI 솔루션 분야의 실무 인사이트를 공유합니다. 기업의 디지털 전환을 돕는 IT 파트너, Treeru입니다.

공유

댓글

(4개)
4.50/ 5

로그인하면 댓글을 작성할 수 있습니다.

2026-03-01
4.554.5

RSS feed 자동 생성은 SEO보다 구독자 확보 측면에서 중요하네요. Feedly 같은 리더에서 자동 수집되니까.

2026-02-26
454.0

블로그 목록 → 상세 → 관련글 순환 구조 설명이 명확합니다. 사일로 구조라고도 하는데, 카테고리별로 묶으면 SEO에 확실히 좋습니다.

2026-02-22
555.0

시리즈 네비게이션 컴포넌트, 이거 바로 따라 만들어야겠습니다. 연재 글인데 이전/다음 글 링크가 없어서 이탈률이 높았거든요.

관련 글

© 2026 TreeRU. All rights reserved.

본 콘텐츠의 저작권은 TreeRU에 있으며, 출처를 밝히지 않은 무단 전재 및 재배포를 금합니다. 인용 시 출처(treeru.com)를 반드시 명시해 주세요.