포스트별 검색 인덱싱을 CMS에서 선택 가능하게
목차
블로그나 콘텐츠 플랫폼을 운영하다 보면 특정 포스트를 검색 결과에서 제외해야 할 순간이 생긴다. 임시 메모, 아카이브된 글, 중복 컨텐츠, 혹은 더 이상 유효하지 않은 정보들 말이다. 이번에 CMS에서 포스트별로 검색 인덱싱을 선택 가능하도록 cms_post.extra.noindex 필드를 추가했다.
배경: 왜 필요했나
기존에는 특정 포스트를 검색 엔진에서 제외하려면 코드 배포를 통해서만 가능했다. 혹은 라우팅 로직에 조건을 하드코드하거나, 포스트별 추가 설정 파일을 관리해야 했다. 이건 두 가지 문제를 야기했다:
- 운영 비효율: 콘텐츠팀이 "이 글은 검색에서 빼달라" 요청을 할 때마다 개발팀이 개입해야 함
- 일관성 관리 어려움: 어떤 글이 현재 인덱싱되고 있는지 한눈에 파악하기 힘듦
HTML의 <meta name="robots" content="noindex"> 태그는 검색 엔진에 "이 페이지를 색인하지 말아달라"는 신호다. 문제는 이 신호를 어디서, 어떻게 관리할 것인가였다.
해결책: 메타데이터 기반 제어
cms_post 테이블에 이미 있던 extra 컬럼(JSON 형식의 추가 필드들을 담는 곳)에 noindex 플래그를 추가하기로 했다. 이렇게 하면:
- CMS UI에서 "검색 인덱싱 제외" 토글 하나로 제어 가능
- 데이터가 영구적으로 저장되어 추적 가능
- 코드 배포 없이 즉시 적용
- 메타데이터와 콘텐츠가 한 곳에서 관리됨
| 관점 | 기존 방식 | 새로운 방식 |
|---|---|---|
| 제어 위치 | 코드/설정 파일 | CMS 데이터베이스 |
| 변경 방법 | 배포 필수 | 즉시 반영 |
| 추적성 | 낮음 (설정 파일 산재) | 높음 (DB 쿼리 가능) |
| 운영자 접근 | 낮음 | 높음 |
파일별 구현
네 파일이 이 기능의 흐름을 담당한다:
src/lib/db.ts — 데이터베이스 쿼리 레벨에서 cms_post.extra의 noindex 필드를 추출해 구조화된 형태로 제공한다. 매번 JSON 파싱의 오버헤드를 줄이고, 타입 안전성을 확보하는 역할이다.
src/pages/p/[id].astro — 포스트 상세 페이지의 엔트리 포인트. 데이터베이스에서 포스트 정보를 로드할 때 noindex 플래그도 함께 가져와 레이아웃으로 전달한다.
src/layouts/Post.astro — 포스트 본문을 렌더링하는 레이아웃 컴포넌트. props로 받은 noindex 값을 확인해 메타 태그를 조건부로 렌더링한다. 대략 이런 식이다:
{post.extra?.noindex && (
<meta name="robots" content="noindex" />
)}
src/layouts/Base.astro — 기본 레이아웃에는 robots 메타 태그의 기본 구조와 fallback을 정의한다. Post.astro가 특화된 값으로 오버라이드할 수 있도록 구성했다.
운영 관점에서의 고려사항
이 기능을 배포하며 팀과 함께 정리한 몇 가지 포인트:
- 검색 엔진의 반응 시간: noindex를 추가했다고 해서 즉시 검색 결과에서 사라지지 않는다. 검색 엔진이 페이지를 재크롤링할 때 태그를 읽고 처리하는데, 보통 수일에서 수주가 걸린다.
- 이전에 인덱싱된 페이지: 이미 검색 결과에 올라 있던 포스트에 noindex를 추가하면, 엔진의 캐시에서 제거되기까지 시간이 필요하다.
- 모니터링: 주요 포스트에 noindex를 설정했을 때, 검색 콘솔(Search Console)에서 실제로 제외되는지 정기적으로 확인하는 습관.
회고
작아 보이는 기능이지만 '누가 결정권을 가질 것인가'라는 아키텍처 질문을 담고 있었다. 개발자가 코드로 모든 걸 제어하는 것과, 운영자가 메타데이터로 선택할 수 있게 하는 것은 팀의 속도와 만족도를 크게 바꾼다. 특히 콘텐츠 정책이 자주 변하는 조직에서는 더욱 그렇다.
또한 extra 컬럼 같은 유연한 구조를 잘 설계해두면, 나중에 canonical URL per-post, og:image 커스터마이징 같은 다른 SEO 요구사항이 생겼을 때도 같은 패턴으로 빠르게 확장할 수 있다는 걸 배웠다. 인프라가 이렇게 준비되면 피처 추가 속도가 달라진다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.