Skip to content

Commit babb30f

Browse files
author
jungtaeinn
committed
feat: SEO 최적화 기능 추가
- robots.txt 자동 생성 기능 추가 (app/robots.ts) - sitemap.xml 동적 생성 기능 추가 (app/sitemap.ts) - JSON-LD 구조화된 데이터 컴포넌트 추가 (components/seo/structured-data.tsx) * Person, Organization, BlogPosting, WebSite, Breadcrumb 스키마 지원 - Posts 페이지 메타데이터 추가 (app/posts/layout.tsx) * Open Graph, Twitter Card 메타데이터 포함 - SEO 최적화 가이드 문서 추가 (SEO_GUIDE.md) * Google Search Console 설정 방법 * 성능 모니터링 가이드 * 추가 권장사항 및 체크리스트
1 parent 25405ee commit babb30f

File tree

9 files changed

+864
-20
lines changed

9 files changed

+864
-20
lines changed

SEO_GUIDE.md

Lines changed: 361 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,361 @@
1+
# SEO 최적화 가이드
2+
3+
## 📋 목차
4+
1. [적용된 SEO 최적화](#적용된-seo-최적화)
5+
2. [Google Search Console 설정](#google-search-console-설정)
6+
3. [성능 모니터링](#성능-모니터링)
7+
4. [추가 권장사항](#추가-권장사항)
8+
9+
---
10+
11+
## ✅ 적용된 SEO 최적화
12+
13+
### 1. 메타데이터 최적화
14+
각 페이지별로 최적화된 메타데이터가 적용되었습니다:
15+
16+
#### 메인 페이지 (`/`)
17+
- **Title**: jungtaeinn.github.io - Frontend Engineer Blog
18+
- **Description**: Frontend Engineer 정태인의 기술 블로그
19+
- **Keywords**: Frontend, React, Next.js, TypeScript, etc.
20+
- **Open Graph & Twitter Cards**: 소셜 미디어 공유 최적화
21+
22+
#### About 페이지 (`/about`)
23+
- **Title**: About - 정태인
24+
- **Type**: Profile
25+
- **Person Schema**: 구조화된 데이터 포함
26+
27+
#### Posts 페이지 (`/posts`)
28+
- **Title**: Posts - 모든 블로그 글
29+
- **Description**: 블로그 글 모음 설명
30+
31+
#### 개별 포스트 (`/posts/[slug]`)
32+
- **Dynamic Metadata**: 각 포스트별 메타데이터
33+
- **BlogPosting Schema**: 구조화된 데이터
34+
- **Breadcrumb Schema**: 브레드크럼 네비게이션
35+
36+
---
37+
38+
### 2. 구조화된 데이터 (JSON-LD)
39+
40+
#### WebSite Schema (메인 페이지)
41+
```json
42+
{
43+
"@context": "https://schema.org",
44+
"@type": "WebSite",
45+
"name": "jungtaeinn.github.io",
46+
"url": "https://jungtaeinn.github.io",
47+
"description": "...",
48+
"author": "jungtaeinn",
49+
"potentialAction": {
50+
"@type": "SearchAction",
51+
"target": "..."
52+
}
53+
}
54+
```
55+
56+
#### Person Schema (About 페이지)
57+
```json
58+
{
59+
"@context": "https://schema.org",
60+
"@type": "Person",
61+
"name": "jungtaeinn",
62+
"jobTitle": "Frontend Engineer",
63+
"knowsAbout": [...],
64+
"sameAs": [...]
65+
}
66+
```
67+
68+
#### BlogPosting Schema (포스트 페이지)
69+
```json
70+
{
71+
"@context": "https://schema.org",
72+
"@type": "BlogPosting",
73+
"headline": "...",
74+
"author": "jungtaeinn",
75+
"publisher": {...},
76+
"datePublished": "...",
77+
"dateModified": "..."
78+
}
79+
```
80+
81+
---
82+
83+
### 3. 사이트맵 (sitemap.xml)
84+
85+
**위치**: `/app/sitemap.ts`
86+
87+
동적으로 생성되는 사이트맵으로 다음을 포함합니다:
88+
- 메인 페이지 (우선순위: 1.0)
89+
- About 페이지 (우선순위: 0.9)
90+
- Posts 목록 페이지 (우선순위: 0.9)
91+
- 모든 블로그 포스트 (우선순위: 0.8)
92+
93+
**확인 방법**:
94+
```bash
95+
# 로컬 개발 서버에서
96+
http://localhost:3000/sitemap.xml
97+
98+
# 배포 후
99+
https://jungtaeinn.github.io/sitemap.xml
100+
```
101+
102+
---
103+
104+
### 4. Robots.txt
105+
106+
**위치**: `/app/robots.ts`
107+
108+
검색 엔진 크롤러 설정:
109+
- **허용**: 모든 페이지 크롤링
110+
- **차단**: `/api/`, `/_next/`, `/static/` 디렉토리
111+
- **사이트맵**: sitemap.xml 위치 명시
112+
113+
**확인 방법**:
114+
```bash
115+
# 로컬 개발 서버에서
116+
http://localhost:3000/robots.txt
117+
118+
# 배포 후
119+
https://jungtaeinn.github.io/robots.txt
120+
```
121+
122+
---
123+
124+
## 🔧 Google Search Console 설정
125+
126+
### 1. 사이트 등록
127+
128+
1. [Google Search Console](https://search.google.com/search-console) 접속
129+
2. '속성 추가' 클릭
130+
3. URL 입력: `https://jungtaeinn.github.io`
131+
4. 소유권 확인 방법 선택
132+
133+
### 2. 소유권 확인 방법
134+
135+
#### 방법 1: HTML 파일 업로드 (권장)
136+
```bash
137+
# Google이 제공한 파일을 public 디렉토리에 저장
138+
cp google[hash].html public/
139+
140+
# 또는 Next.js 15에서는 app 폴더에 직접 생성
141+
# app/google[hash].html/route.ts
142+
```
143+
144+
#### 방법 2: 메타 태그 (이미 적용됨)
145+
`app/layout.tsx`의 metadata에 verification 코드가 포함되어 있습니다:
146+
```typescript
147+
export const metadata: Metadata = {
148+
verification: {
149+
google: 'your-google-verification-code', // 여기에 실제 코드 입력
150+
},
151+
};
152+
```
153+
154+
**⚠️ 중요**: `app/layout.tsx``verification.google` 값을 실제 Google 검증 코드로 교체해야 합니다.
155+
156+
### 3. 사이트맵 제출
157+
158+
1. Google Search Console에서 '색인 생성' > '사이트맵' 클릭
159+
2. 사이트맵 URL 입력: `https://jungtaeinn.github.io/sitemap.xml`
160+
3. '제출' 클릭
161+
162+
---
163+
164+
## 📊 성능 모니터링
165+
166+
### Google PageSpeed Insights
167+
168+
1. [PageSpeed Insights](https://pagespeed.web.dev/) 접속
169+
2. URL 입력: `https://jungtaeinn.github.io`
170+
3. 분석 실행
171+
172+
**목표 점수**:
173+
- **Performance**: 90+ (Green)
174+
- **Accessibility**: 95+ (Green)
175+
- **Best Practices**: 95+ (Green)
176+
- **SEO**: 95+ (Green)
177+
178+
### Lighthouse (Chrome DevTools)
179+
180+
1. Chrome DevTools 열기 (F12)
181+
2. 'Lighthouse' 탭 선택
182+
3. 'Generate report' 클릭
183+
184+
---
185+
186+
## 📝 추가 권장사항
187+
188+
### 1. 이미지 최적화
189+
190+
현재 Next.js Image 컴포넌트를 사용하고 있습니다. 추가 최적화:
191+
192+
```typescript
193+
// WebP 포맷 사용
194+
<Image
195+
src="/images/photo.jpg"
196+
alt="설명"
197+
width={800}
198+
height={600}
199+
quality={85}
200+
placeholder="blur"
201+
loading="lazy"
202+
/>
203+
```
204+
205+
### 2. Open Graph 이미지 생성
206+
207+
각 포스트별로 고유한 OG 이미지를 생성하면 좋습니다:
208+
- 크기: 1200x630px
209+
- 포맷: PNG 또는 JPG
210+
- 위치: `/public/images/og/[slug].png`
211+
212+
### 3. 콘텐츠 개선
213+
214+
#### 포스트 작성 시 체크리스트:
215+
- [ ] 제목은 60자 이내
216+
- [ ] 설명(excerpt)은 155자 이내
217+
- [ ] 3-5개의 관련 태그 추가
218+
- [ ] 커버 이미지 포함
219+
- [ ] 내부 링크 추가 (다른 포스트 연결)
220+
- [ ] 외부 링크는 `rel="noopener noreferrer"` 속성 사용
221+
222+
#### SEO 친화적인 마크다운 작성:
223+
```markdown
224+
---
225+
title: "명확하고 구체적인 제목 (60자 이내)"
226+
excerpt: "포스트의 핵심 내용을 요약한 설명 (155자 이내)"
227+
date: "2025-01-01"
228+
category: "Frontend"
229+
tags: ["React", "Next.js", "TypeScript"]
230+
featured: true
231+
coverImage: "/images/posts/slug/cover.jpg"
232+
---
233+
234+
# H1 제목 (페이지당 하나만)
235+
236+
## H2 부제목 (구조화)
237+
238+
### H3 소제목
239+
240+
내용...
241+
```
242+
243+
### 4. 외부 링크 (Backlinks) 확보
244+
245+
검색 순위를 높이는 방법:
246+
- LinkedIn, GitHub에 블로그 링크 공유
247+
- 다른 개발자 블로그에 댓글 작성
248+
- Dev.to, Medium 등에 크로스 포스팅
249+
- 오픈소스 프로젝트 기여 시 블로그 링크 추가
250+
251+
### 5. 소셜 미디어 최적화
252+
253+
현재 적용된 소셜 미디어 링크:
254+
- GitHub: https://github.com/jungtaeinn
255+
- LinkedIn: https://www.linkedin.com/in/jungtaeinn5493
256+
- Instagram: https://instagram.com/_jungtaeinn
257+
258+
**추가 권장사항**:
259+
- 새 포스트 작성 시 LinkedIn에 공유
260+
- 관련 커뮤니티(Reddit, 페이스북 그룹)에 공유
261+
- Twitter/X 계정 추가 고려
262+
263+
### 6. Google Analytics 설정
264+
265+
`app/layout.tsx`에 Google Analytics 추가:
266+
267+
```typescript
268+
// app/layout.tsx
269+
import Script from 'next/script';
270+
271+
export default function RootLayout({ children }) {
272+
return (
273+
<html>
274+
<body>
275+
{children}
276+
277+
{/* Google Analytics */}
278+
<Script
279+
src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"
280+
strategy="afterInteractive"
281+
/>
282+
<Script id="google-analytics" strategy="afterInteractive">
283+
{`
284+
window.dataLayer = window.dataLayer || [];
285+
function gtag(){dataLayer.push(arguments);}
286+
gtag('js', new Date());
287+
gtag('config', 'G-XXXXXXXXXX');
288+
`}
289+
</Script>
290+
</body>
291+
</html>
292+
);
293+
}
294+
```
295+
296+
### 7. 주기적인 콘텐츠 업데이트
297+
298+
검색 엔진은 활발히 업데이트되는 사이트를 선호합니다:
299+
- 최소 월 2-4회 포스트 작성
300+
- 기존 포스트 업데이트 (날짜 갱신)
301+
- 시즌별 콘텐츠 작성
302+
303+
---
304+
305+
## 🎯 체크리스트
306+
307+
### 배포 전
308+
- [ ] `app/layout.tsx`의 Google 검증 코드 업데이트
309+
- [ ] 모든 이미지에 alt 텍스트 추가
310+
- [ ] 내부 링크 확인 (404 없는지)
311+
- [ ] 로컬에서 sitemap.xml 확인
312+
- [ ] 로컬에서 robots.txt 확인
313+
- [ ] 빌드 에러 없는지 확인
314+
315+
### 배포 후
316+
- [ ] Google Search Console 등록
317+
- [ ] 사이트맵 제출
318+
- [ ] PageSpeed Insights 테스트
319+
- [ ] 실제 URL로 메타데이터 확인 (Facebook Debugger, Twitter Card Validator)
320+
- [ ] Google에서 사이트 검색 (`site:jungtaeinn.github.io`)
321+
322+
### 주기적으로
323+
- [ ] Google Search Console에서 검색 성능 확인 (주 1회)
324+
- [ ] 404 에러 확인 및 수정
325+
- [ ] 페이지 로딩 속도 모니터링
326+
- [ ] 새 포스트 작성 (월 2-4회)
327+
- [ ] 기존 포스트 업데이트
328+
329+
---
330+
331+
## 🔗 유용한 도구
332+
333+
### SEO 검증 도구
334+
- [Google Search Console](https://search.google.com/search-console)
335+
- [PageSpeed Insights](https://pagespeed.web.dev/)
336+
- [Schema Markup Validator](https://validator.schema.org/)
337+
- [Rich Results Test](https://search.google.com/test/rich-results)
338+
339+
### 메타데이터 미리보기
340+
- [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/)
341+
- [Twitter Card Validator](https://cards-dev.twitter.com/validator)
342+
- [LinkedIn Post Inspector](https://www.linkedin.com/post-inspector/)
343+
344+
### 분석 도구
345+
- [Google Analytics](https://analytics.google.com/)
346+
- [Google Tag Manager](https://tagmanager.google.com/)
347+
348+
---
349+
350+
## 📞 참고 자료
351+
352+
- [Next.js SEO Guide](https://nextjs.org/learn/seo/introduction-to-seo)
353+
- [Google Search Central](https://developers.google.com/search)
354+
- [Schema.org](https://schema.org/)
355+
- [Web.dev](https://web.dev/learn/seo/)
356+
357+
---
358+
359+
**작성일**: 2025-10-16
360+
**버전**: 1.0.0
361+

0 commit comments

Comments
 (0)