개발자 블로그를 운영하면서 이런 생각 한 번쯤 해보셨을 겁니다. "글은 열심히 쓰는데 왜 아무도 안 찾아오지?"
콘텐츠가 좋아도 구글이 내 사이트를 제대로 이해하지 못하면, 검색 결과에서 좋은 자리를 차지하기 어렵습니다. SEO(Search Engine Optimization)는 그 간극을 좁히는 작업입니다.
마케터들이 말하는 SEO가 아니라, 개발자가 직접 사이트를 만들고 운영할 때 챙겨야 하는 기술 SEO를 이야기합니다. 이 블로그도 같은 고민을 하면서 적용한 내용들입니다.
구글은 내 사이트를 어떻게 이해할까요?
SEO를 잘하려면 구글이 사이트를 어떻게 탐색하는지부터 알아야 합니다.
구글에는 크롤러(crawler) 라는 프로그램이 있습니다. 흔히 '봇' 또는 '스파이더'라고도 부릅니다. 이 크롤러가 인터넷을 돌아다니며 페이지를 방문하고, 내용을 읽어서 색인(index) 에 저장합니다. 그리고 누군가 검색어를 입력하면, 저장해둔 색인에서 가장 관련도 높은 페이지들을 순서대로 보여줍니다.
SEO는 크게 두 단계에서 이루어집니다.
- 크롤링과 색인: 구글 봇이 내 사이트를 방문해서 페이지 내용을 저장하게 하기
- 순위 결정: 저장된 페이지가 검색 결과에서 더 앞에 뜨게 하기
기술 SEO는 주로 1단계, 즉 "구글이 내 사이트를 제대로 읽을 수 있게 하는 것"에 집중합니다.
sitemap.xml — 구글에게 지도를 건네는 것
사이트맵은 내 사이트에 어떤 페이지들이 있는지 목록을 정리한 XML 파일입니다. 구글 봇에게 "우리 사이트 이렇게 생겼어, 이 페이지들 꼭 봐줘"라고 알려주는 용도입니다.
사이트맵이 없어도 구글은 사이트를 발견할 수 있습니다. 하지만 있으면 훨씬 빠르고 빠짐없이 색인됩니다. 특히 새로 만든 사이트, 페이지가 많은 사이트, 외부 링크가 거의 없는 사이트일수록 사이트맵의 역할이 중요합니다.
Next.js App Router를 쓴다면 app/sitemap.ts 파일을 만들어서 동적으로 생성할 수 있습니다.
// app/sitemap.ts
import { MetadataRoute } from 'next'
export default function sitemap(): MetadataRoute.Sitemap {
return [
{
url: 'https://yourdomain.com',
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 1,
},
{
url: 'https://yourdomain.com/blog',
lastModified: new Date(),
changeFrequency: 'weekly',
priority: 0.8,
},
// 블로그 포스트들은 CMS나 파일 목록에서 동적으로 추가
]
}
만들었으면 Google Search Console에서 사이트맵 제출을 해주세요. 수동 제출이 없어도 언젠가는 발견되지만, 빠른 색인을 원한다면 직접 등록하는 게 낫습니다.
robots.txt — 크롤러에게 "여기는 들어오지 마"
robots.txt는 크롤러에게 접근 허용/제한 영역을 알려주는 파일입니다. 도메인 루트에 위치해야 합니다(yourdomain.com/robots.txt).
User-agent: *
Allow: /
# 관리자 페이지, API 엔드포인트, 로그인 페이지 등은 제외
Disallow: /admin/
Disallow: /api/
Disallow: /_next/
Sitemap: https://yourdomain.com/sitemap.xml
주의할 점이 있습니다. 색인되길 원하는 페이지를 Disallow에 넣으면 절대 안 됩니다. 당연해 보이지만, CMS 이관이나 개발 환경 설정을 잘못하면 프로덕션에서도 전체 사이트가 막혀있는 경우가 종종 있습니다. 새 사이트를 론칭하면 꼭 확인하세요.
이 블로그의 경우, 포트폴리오 카테고리 중 일부는 검색 색인에서 의도적으로 제외했습니다. 특정 클라이언트 작업물은 공개 검색보다는 직접 방문자에게만 보여주는 게 적합했기 때문입니다. SEO와 비즈니스 목적이 항상 일치하지 않을 수 있습니다.
메타 태그 — 검색 결과에 표시되는 '광고판'
검색 결과에서 파란색 제목과 그 아래 설명 텍스트, 보신 적 있으시죠? 그게 메타 태그에서 옵니다.
<title>개발자 블로그 SEO 가이드 | 파란여우</title>
<meta name="description" content="구글에 잘 잡히는 사이트를 만들기 위해 개발자가 직접 챙겨야 할 기술적 SEO 항목들을 실무 중심으로 정리했습니다.">
title 태그: 검색 결과에서 클릭률을 가장 크게 좌우합니다. 50~60자 이내로 페이지 내용을 명확하게 담는 게 좋습니다. 모든 페이지가 같은 제목이면 안 됩니다.
description: 검색 결과에 표시되는 설명입니다. 직접 순위에는 영향을 주지 않지만, 클릭률에는 영향을 줍니다. 150~160자로 요점을 담으세요. 구글이 마음에 들지 않으면 무시하고 본문에서 발췌하기도 합니다.
Next.js에서는 각 페이지 파일에 export const metadata를 선언해서 처리합니다.
// app/blog/[slug]/page.tsx
export async function generateMetadata({ params }) {
const post = await getPost(params.slug)
return {
title: `${post.title} | 파란여우`,
description: post.description,
openGraph: {
title: post.title,
description: post.description,
images: [post.thumbnail],
},
}
}
OG 태그(Open Graph) 도 함께 챙기세요. 카카오톡이나 SNS에서 링크를 공유할 때 나오는 미리보기 이미지와 제목이 OG 태그에서 나옵니다. SEO 직접 효과는 없지만, 공유가 잘 되면 방문자가 늘고 그게 간접적으로 SEO에 영향을 줍니다.
구조화 데이터 — 검색 결과를 더 풍성하게
구조화 데이터(Structured Data)는 구글에게 "이 페이지는 블로그 포스트야, 작성자는 이 사람이고, 작성일은 이 날짜야"처럼 기계가 읽기 좋은 형식으로 정보를 추가하는 방법입니다. JSON-LD 형식으로 작성합니다.
구조화 데이터를 잘 넣으면 검색 결과에서 리치 스니펫(Rich Snippet) 이라는 추가 정보가 표시될 수 있습니다. 예를 들어 레시피 사이트라면 별점과 요리 시간이, FAQ 페이지라면 질문-답변이 바로 검색 결과에 펼쳐지는 식입니다.
블로그라면 Article 스키마가 기본입니다.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "개발자 블로그 SEO 완전 가이드",
"author": {
"@type": "Person",
"name": "파란여우",
"url": "https://bluefoxdev.kr"
},
"datePublished": "2026-04-08",
"dateModified": "2026-04-08",
"description": "구글에 잘 잡히는 사이트를 만드는 방법",
"image": "https://bluefoxdev.kr/og-image.jpg"
}
</script>
구현 후에는 구글 리치 결과 테스트에서 오류 없이 파싱되는지 확인하면 됩니다.
카노니컬 태그 — 중복 페이지 문제 해결
같은 내용이 여러 URL에서 접근 가능한 경우가 있습니다. 예를 들어 페이지네이션이 있는 목록 페이지, 또는 ?utm_source= 같은 트래킹 파라미터가 붙은 URL들입니다.
구글은 이걸 별개의 페이지로 인식해서 어느 페이지를 원본으로 색인해야 할지 혼란스러워합니다. 이때 카노니컬 태그로 "이 페이지의 원본은 여기야"라고 알려주면 됩니다.
<link rel="canonical" href="https://yourdomain.com/blog/seo-guide" />
Next.js의 metadata 에서는 아래처럼 씁니다.
export const metadata = {
alternates: {
canonical: 'https://yourdomain.com/blog/seo-guide',
},
}
작은 항목처럼 보이지만, 카노니컬이 제대로 안 잡혀 있으면 구글이 SEO 점수를 여러 URL에 분산시켜버립니다.
내부 링크 전략 — 검색 엔진에게 길을 만들어주기
구글 봇은 링크를 따라 사이트를 탐색합니다. 링크가 없는 페이지(고아 페이지)는 발견되지 않을 수 있습니다.
내부 링크를 잘 구성하면 두 가지 효과가 있습니다.
첫째, 크롤링이 원활해집니다. 모든 페이지가 메인 페이지나 목록 페이지에서 링크로 연결되어 있으면, 봇이 빠짐없이 방문할 수 있습니다.
둘째, 페이지 권위(Page Authority)가 전달됩니다. 구글은 링크를 '투표'처럼 봅니다. 많은 페이지에서 링크된 페이지일수록 중요하다고 판단합니다. 내 사이트의 핵심 콘텐츠 페이지로 내부 링크가 많이 모이도록 구성하면, 그 페이지의 검색 순위가 올라갈 수 있습니다.
실제로 블로그를 운영할 때 관련 글끼리 "이 글도 읽어보세요" 형태로 연결하는 것, 그리고 목록 페이지에서 개별 포스트로 제목 링크를 명확히 거는 것만으로도 효과가 있습니다.
Google Search Console 활용법
Search Console은 구글이 내 사이트를 어떻게 보고 있는지 들여다볼 수 있는 무료 도구입니다. SEO에 진지하다면 반드시 연결해야 합니다.
꼭 확인해야 할 메뉴들:
- 검색 결과 (Performance): 내 사이트가 어떤 검색어로 노출되고, 클릭률은 얼마인지 확인합니다. 노출은 많은데 클릭이 낮은 키워드는 제목/설명 개선의 여지가 있습니다.
- URL 검사: 특정 페이지가 색인되어 있는지, 어떤 상태인지 확인합니다. 새 글을 올렸을 때 빠른 색인을 요청할 수도 있습니다.
- 색인 생성 (Indexing): 색인이 안 된 페이지들과 그 이유를 보여줍니다. "크롤링됨 - 현재 색인이 생성되지 않음" 상태가 많으면 사이트 구조나 콘텐츠 품질 문제일 수 있습니다.
- 코어 웹 바이탈: 실제 방문자 기준 Core Web Vitals 점수입니다.
처음 연결하면 데이터가 쌓이기까지 2~4주 정도 걸립니다. 그 이후부터 의미 있는 데이터를 볼 수 있습니다.
콘텐츠가 기반이다
기술 SEO를 아무리 잘 챙겨도 콘텐츠가 빈약하면 한계가 있습니다. 구글의 검색 품질 평가 기준에서 가장 중요한 것은 E-E-A-T(Experience, Expertise, Authoritativeness, Trustworthiness) 입니다. 직접 경험한 내용, 전문성, 신뢰성을 갖춘 콘텐츠입니다.
개발자 블로그라면 이런 글이 잘 먹힙니다.
- 실제 개발 과정에서 막혔던 문제와 해결 과정
- 특정 기술의 장단점을 직접 써본 후 정리한 비교
- 공식 문서에는 없는 실전 노하우
자동 생성된 것처럼 보이는 얄팍한 글은 구글도 걸러냅니다. 2024년부터 구글은 AI로 대량 생성된 저품질 콘텐츠를 색인에서 적극적으로 걸러내기 시작했습니다.
정리: 지금 당장 할 수 있는 것들
SEO는 단기간에 효과가 나오지 않습니다. 평균적으로 기술적 개선 후 3~6개월이 지나야 순위 변화가 가시화됩니다. 그렇기 때문에 지금 시작하는 게 맞습니다.
오늘 바로 할 수 있는 것:
- Google Search Console에 사이트 등록
- PageSpeed Insights에서 현재 점수 확인
- 사이트맵 생성 및 제출
이번 주 안에 할 것: 4. 모든 페이지의 title, description 메타 태그 점검 5. robots.txt 확인 — 막혀있는 중요 페이지 없는지 체크 6. 이미지에 alt 텍스트 추가
SEO는 한 번 잘 세팅해두면 꾸준히 방문자를 데려오는 '자산'이 됩니다. 광고비를 쓰지 않아도 되는 채널입니다. 개발자라면 기술적인 부분에서 충분히 직접 챙길 수 있습니다. 마케터에게 의존하지 않아도 됩니다.