사이드프로젝트 slecs

Astro 블로그에 SEO 컴포넌트를 분리해 구조를 정리했다

목차

블로그에 표준 SEO 컴포넌트를 새로 만들고, BaseHead.astro에 붙여 넣었다.

왜 지금 SEO였나

블로그는 어차피 내가 읽는 글인데 SEO가 무슨 소용이냐 싶을 수도 있다. 근데 팀 내에서도 기술 블로그를 외부 공개로 전환하는 경우를 여럿 봤고, 그때마다 "처음부터 SEO를 심어뒀으면 좋았을 텐데"라는 회고가 나왔다. 이번에는 그 순서를 뒤집고 싶었다. 나중에 후회하는 것보다 초기 구조에 박아두는 게 훨씬 싸다.

Astro 기반 블로그라 이미 BaseHead.astro<head> 영역을 담당하고 있었는데, 거기다 meta 태그를 직접 인라인으로 때려 박기엔 관리가 지저분해질 것 같았다. 그래서 Seo.astro를 별도 컴포넌트로 분리해서 SEO 관련 마크업만 모아두는 구조로 갔다.

변경 구조 정리

파일 역할 이번 변경
BaseHead.astro <head> 전체 구성 Seo.astro 컴포넌트 import 및 props 전달
Seo.astro SEO 전용 컴포넌트 (신규) OG, twitter card, canonical 등 표준 메타 태그 담당
consts.ts 사이트 전역 상수 사이트 이름, URL 등 SEO 기본값 소스로 활용

consts.ts를 SEO 기본값의 소스로 잡은 게 핵심이다. 타이틀이 없는 페이지, description이 빠진 페이지에서 fallback으로 쓸 값들을 여기서 끌어오게 했다. 이렇게 하면 나중에 블로그 이름이 바뀌거나 도메인이 변경될 때 consts.ts 한 군데만 손보면 된다. 분산 관리의 반대, 중앙화다.

Seo.astro 구조 예시

---
interface Props {
  title?: string;
  description?: string;
  image?: string;
  canonicalUrl?: string;
}

const {
  title = SITE_TITLE,
  description = SITE_DESCRIPTION,
  image = '/og-default.png',
  canonicalUrl = Astro.url.href,
} = Astro.props;
---

<title>{title}</title>
<meta name="description" content={description} />
<link rel="canonical" href={canonicalUrl} />

<!-- OG -->
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={image} />

<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />

props 전부 optional로 뺀 게 포인트다. 모든 페이지마다 SEO 값을 강제하면 귀찮아서 결국 안 쓰게 된다. fallback을 consts.ts에서 충분히 잡아두고, 글마다 override가 필요한 것만 넘기는 방식이 현실적으로 더 잘 지켜진다.

컴포넌트 분리의 실질적 이유

BaseHead.astro가 길어지면 어디서 뭘 건드려야 할지 감이 안 잡힌다. 리뷰할 때도 마찬가지다. SEO 관련 변경인지, 폰트 로딩 변경인지, 스크립트 삽입 변경인지 파일 하나에 다 섞여 있으면 diff가 지저분해진다. 컴포넌트를 목적 단위로 쪼개두면 "이 PR은 SEO만 건드렸다"는 게 명확해진다.

작은 블로그 프로젝트지만 이 원칙은 대규모 코드베이스에서도 동일하게 적용된다. 팀원한테 리뷰 요청할 때 "이 파일은 이 역할만 한다"고 설명할 수 있어야 리뷰어의 인지 부하가 줄어든다. 결국 SEO 컴포넌트 분리도 그 연장선.

표준 SEO 적용이라는 커밋 하나지만, 구조적으로는 꽤 깔끔하게 정리됐다고 본다.

끝.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.