Next.js/SEO/Lesson 14
Metadata API — generateMetadata 로 동적 SEO + OG 카드
30분·theory
이 챕터
1/2
TypeScript
Metadata API — generateMetadata 로 동적 SEO + OG 카드
💡 왜 배워야 할까요? — SEO 와 소셜 공유의 차이를 만드는 부분
🎯
검색 결과의 제목·설명, 카톡·트위터 공유 카드의 이미지·문구 — 전부 `` 의 meta 태그가 결정.
💼
Pages Router 의 `` 컴포넌트 → App Router 의 `metadata` export 로 표준화됨.
⚡
동적 페이지(블로그 글 등) 는 `generateMetadata({ params })` 로 페이지마다 다른 메타 자동 생성.
🔗
파일 컨벤션 — `app/icon.tsx`·`app/opengraph-image.tsx`·`app/twitter-image.tsx` 만 두면 자동으로 메타에 연결.
📈
이걸 모르면 모든 페이지 공유 카드가 똑같이 나옴 = '아마추어' 인상.
🏢 실무에서는
블로그 글 100개 — 각 글마다 제목·요약·대표 이미지가 다르게 공유 카드에 떠야 함. generateMetadata 한 함수로 100개 페이지 자동. 또 검색 엔진이 글 제목을 정확히 가져가 SEO 순위에 직결.
metadata export · generateMetadata · 파일 컨벤션
1. 정적 metadata export
각 페이지·레이아웃의 최상단에 export. 자동으로 <head> 에 주입됨.
2. generateMetadata — 동적 페이지용
같은 fetch 가 페이지 본문에서도 호출되면 자동 dedupe — 추가 네트워크 비용 없음.
3. layout.tsx 의 title.template — 페이지마다 자동 접미사
4. 파일 컨벤션 — 자동 메타 연결
opengraph-image.tsx 는 ImageResponse 로 동적 PNG 생성 가능. codemaster40 도 이미 [src/app/opengraph-image.tsx](src/app/opengraph-image.tsx) 로 동적 생성.
5. 자주 사용하는 필드 정리
💡 💡 Metadata 실전 5
1. metadataBase 를 루트 레이아웃에 두기
OG 이미지 등 상대 경로가 절대 경로로 자동 변환됨.
2. title.template 으로 일관 브랜딩
루트에 template: '%s | 코드마스터' → 자식 페이지는 그냥 'TypeScript 기초' 만 적음.
3. generateMetadata 의 fetch 는 페이지 fetch 와 자동 dedupe
같은 URL 이면 한 번만 호출. 추가 네트워크 비용 없음.
4. 파일 컨벤션 4종 활용 — 코드 0줄app/icon.ico·apple-icon.png·opengraph-image.png·twitter-image.png 만 두면 자동 메타 연결.
5. OG 이미지는 1200×630, Twitter card 는 summary_large_image
표준 사이즈. 검증: https://www.opengraph.xyz/, https://cards-dev.twitter.com/validator
⚡ 직접 실행해보기 — generateMetadata 결과 시뮬레이션
각 페이지의 metadata 가 어떻게 머지되어 최종 head 가 되는지 시뮬레이션.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
App Router 의 `title.template = '%s | 코드마스터'` 가 루트 레이아웃에 있고, 자식 페이지가 `title: 'Promise<T>'` 이면 실제 렌더되는 `<title>` 은?
먼저 읽으면 좋은 개념: next/headers — cookies / headers / redirect