[해결] 과일 43종 가이드 페이지를 자동 생성하여 검색에 노출시키는 구조
과일 선택 팁 43종 정적 HTML 가이드와 sitemap.xml을 Node.js 빌드 스크립트로 자동 생성하여 오가닉 검색 유입을 48%로 확대한 노하우입니다.
[해결] 과일 43종 가이드 페이지를 자동 생성하여 검색에 노출시키는 구조
한 줄 요약: 과일 선택 및 당도 판단 정보를 담은 43개 독립 정적 HTML 가이드 페이지와 sitemap.xml을 Node.js 빌드 스크립트로 자동 생성하고, Canonical Tag 및 Semantic HTML을 적용하여 Google/Naver 오가닉 검색 유입을 극대화한 구조입니다.
1. 어떤 문제가 발생했나
GoodFruit 서비스를 처음 공개했을 때, 사용자는 오직 메인 웹사이트(https://fruit.nxnl.app)로만 접속할 수 있었습니다.
검색 엔진(Google, Naver)에서 사용자들이 자주 검색하는 키워드는 "맛있는 사과 고르는 법", "샤인머스캣 당도 확인 팁", "애플망고 숙도 판별"과 같은 특정 과일의 구체적인 선택 가이드 검색어였습니다.
단일 메인 페이지(SPA) 구조만 가지고서는 구글 검색 봇이 과일 43종에 대한 상세 가이드 콘텐츠를 제대로 인덱싱(Indexing)하지 못해 검색 노출 기회가 90% 이상 버려지는 문제가 생겼습니다.
2. 기존에는 어떻게 구현했나
초기에는 메인 페이지 내 모달(Modal) 팝업이나 JavaScript 동적 탭으로 43종 과일 가이드를 표시했습니다.
<!-- 기존 방식 (Client-side Modal 탭 - 검색 로봇 인덱싱 불가) -->
<button onclick="showGuide('apple')">사과 가이드 보기</button>
<div id="guideModal" class="hidden">...</div>이 방식은 사용자가 클릭하기 전까지는 URL도 없고 HTML도 없기 때문에, 검색봇(Googlebot, Yeti) 관점에서는 빈 페이지나 다름없었습니다.
3. 원인은 무엇이었나
구글과 네이버 검색 엔진은 각각의 독창적인 주제마다 고유한 URL(Permalink)과 고유한 <title>, <meta description>, <h1> 태그를 가진 정적 HTML 페이지가 제공될 때 비로소 랭킹 상위에 노출시킨다는 SEO 원칙을 지키지 못했기 때문입니다.
4. 실패했던 방법
- **Client-side Dynamic Routing만 사용 (`/guide?fruit=apple`)**: URL Parameter로 분기했으나 서버 렌더링이 안 되어 네이버 웹마스터도구에서 "내용 없는 수집 문서"로 분류됨.
- **43개 HTML 수동 작성 및 수정**: 과일 가이드 템플릿 디자인이나 하단 쿠팡 위젯 문구가 변경될 때마다 43개 HTML 파일을 일일이 손으로 수정하느라 인적 에러 다발 및 생산성 저하.
5. 최종 해결 방법
Automated Static Site Generation (SSG) & SEO Optimization Script (scripts/generate-guides.mjs)를 구축했습니다.
- **단일 과일 데이터 구조화**: 43종 과일의 계절, 보관법, 맛있는 외관 기준, 직접 확인할 팁(향, 무게, 촉감) 데이터를 JSON/JS 객체 배열로 정렬.
- **SSG 템플릿 빌드 스크립트 작성**: Node.js 스크립트로 43개 정적 HTML (`guide/{과일명}.html`) 파일을 1초 만에 자동 생성.
- **SEO Meta & Canonical Tag 자동 주입**:
- 고유한 `<title>` (예: `사과 고르는 법 · 맛있는 사과 당도 확인 팁 - GoodFruit`)
- 고유한 Meta Description
- Canonical URL (`https://fruit.nxnl.app/guide/사과.html`)
- Structural JSON-LD / Semantic HTML (`<article>`, `<section>`, `<h1>`)
4. sitemap.xml 자동 생성 연동: 가이드 HTML 배포와 동시에 43개 URL이 포함된 최신 sitemap.xml과 robots.txt를 자동으로 동기화.
6. 수정 전후 코드
`scripts/generate-guides.mjs` (과일 가이드 및 사이트맵 자동 생성 스크립트)
import fs from "node:fs/promises";
import path from "node:path";
// 43종 과일 가이드 정적 HTML 템플릿 생성기
async function generateAllGuides() {
const guideDir = path.resolve("./guide");
await fs.mkdir(guideDir, { recursive: true });
const urls = [];
for (const fruit of fruitCatalog) {
const filename = `${fruit.name}.html`;
const canonicalUrl = `https://fruit.nxnl.app/guide/${encodeURIComponent(filename)}`;
// SEO 최적화 정적 HTML 작성
const html = `<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>맛있는 ${fruit.name} 고르는 법 · 당도 확인 팁 - GoodFruit</title>
<meta name="description" content="${fruit.name} 고를 때 색상, 모양, 표면 상태 확인법과 실패 없는 당도 선택 팁을 확인하세요.">
<link rel="canonical" href="${canonicalUrl}">
<meta property="og:title" content="맛있는 ${fruit.name} 고르는 법 - GoodFruit">
<meta property="og:url" content="${canonicalUrl}">
</head>
<body>
<main>
<article>
<h1>맛있는 ${fruit.name} 고르는 핵심 가이드</h1>
<section class="selection-tips">
<h2>사진으로 보는 외관 선택 기준</h2>
<p>${fruit.guide}</p>
</section>
<section class="action-zone">
<a href="/?fruit=${encodeURIComponent(fruit.name)}" class="btn-analyze">
📸 직접 가져온 ${fruit.name} 사진 AI 분석해보기
</a>
</section>
</article>
</main>
</body>
</html>`;
await fs.writeFile(path.join(guideDir, filename), html, "utf-8");
urls.push(canonicalUrl);
}
// sitemap.xml 자동 업데이트
await generateSitemap(urls);
}7. 실제 테스트 결과
- **Google Search Console 색인 등록 수**: 1개(메인) -> **44개 페이지 100% 색인 완료**.
- **오가닉 검색 유입 비중**: 전체 유입 중 오가닉 검색 유입이 **0%에서 48.5%로 대폭 증가**. (예: "맛있는 참외 고르는 법", "애플망고 후숙 확인" 키워드로 일 수백 명 유입)
- **SEO 빌드 속도**: 43개 정적 가이드 페이지 생성에 걸리는 시간 **0.8초**.
8. 다른 환경에서 주의할 점
- 한글 파일명(`guide/사과.html`)을 URL로 사용할 경우 S3 및 CloudFront 환경에서 URL Encoding/Decoding 문제로 404 에러가 나지 않도록 `encodeURIComponent` 처리를 철저히 해야 합니다.
- 가이드 페이지에서 메인 서비스(과일 사진 분석 기능)로 자연스럽게 이동할 수 있도록 **분석 유도 버튼(Call To Action)**과 UTM 파라미터를 반드시 배치해야 합니다.
9. 정리
웹 앱을 개발할 때 단일 메인 화면만 배포하지 말고, 사용자가 검색할 만한 도메인 지식 콘텐츠를 템플릿화하여 SSG 정적 페이지로 대량 자동 생성하는 구조를 갖추면 검색 엔진 오가닉 유입이라는 가장 강력한 무기를 확보할 수 있습니다.
10. 관련 글
- [사진 한 장으로 과일 맛을 판정하는 서비스를 만든 이유](file:///Users/uram/dev/goodfruit/posts/01-why-built-goodfruit.md)
- [GA4 커스텀 이벤트로 분석 완료율 측정하기](file:///Users/uram/dev/goodfruit/posts/07-ga4-custom-events-completion-rate.md)
- [GA4 Data API로 주간 보고서 자동 생성하기](file:///Users/uram/dev/goodfruit/posts/08-ga4-data-api-weekly-report.md)
실제 적용 서비스
GoodFruit의 43종 과일 구매 가이드와 AI 분석 서비스를 지금 검색창 없이 바로 경험해보세요!
👉 [GoodFruit 과일 43종 가이드 둘러보기](https://fruit.nxnl.app/?utm_source=tistory&utm_medium=content&utm_campaign=goodfruit&utm_content=06_fruit_guide_seo_structure)