블로그를 만들고 첫 달, Google Analytics에 찍힌 월간 방문자 수는 23명이었다. 그중 8명은 내 IP였다. 실질적으로 15명. 글을 5개나 올렸는데 하루 방문자가 한 명도 안 되는 날이 대부분이었다. 6개월 후에 월간 방문자가 1000명을 넘겼다. 대단한 숫자는 아니지만, 15명에서 1000명까지 가는 과정에서 배운 게 많았다. 효과 있었던 것, 시간 낭비였던 것, 예상과 완전히 달랐던 것.
이 글은 SEO 체크리스트가 아니다. 내가 6개월 동안 시도한 것들과 각각의 실제 결과를 공유하는 글이다.
출발: Lighthouse 100점에 집착한 1개월
블로그를 Next.js App Router로 만들었다. 첫 달에 한 일은 거의 전부 기술적 SEO였다.
generateMetadata로 모든 페이지에 메타태그 동적 생성- JSON-LD 구조화 데이터 (Article 스키마) 추가
sitemap.ts로 프로그래밍 방식 사이트맵 생성robots.ts설정- canonical URL 설정
- OG 이미지 1200x630으로 통일
next/image에priorityprop으로 LCP 최적화- Lighthouse SEO 점수 100점 달성
뿌듯했다. Lighthouse에서 SEO 100점, Performance 95점 이상. 기술적으로 할 수 있는 건 다 했다고 생각했다. Google Search Console에 사이트맵도 제출했다.
한 달 후 결과: 월간 방문자 23명.
Lighthouse 100점은 "검색 엔진이 이 페이지를 읽을 수 있다"는 뜻이지, "이 페이지를 상위에 노출시키겠다"는 뜻이 아니었다. 시험에서 이름을 쓴 것과 같다고 해야 할까. 최소 조건이지 경쟁력이 아니다.
투자 시간: 약 20시간. 효과: 거의 없음. 하지만 필수.
기술적 SEO는 한 번 제대로 세팅하면 끝이다. 그리고 이게 없으면 아무리 좋은 콘텐츠를 써도 검색 엔진이 제대로 인식하지 못한다. 효과가 없는 게 아니라, 이것만으로는 부족하다는 거다.
2개월 차: 키워드를 넣기 시작하다
검색 유입이 없어서 구글에 내 글 제목을 직접 검색해봤다. 안 나왔다. 제목이 "React 상태 관리의 진화"였는데, 같은 주제로 쓴 글이 이미 수백 개 있었다. 내 블로그가 그 사이에서 노출될 리가 없었다.
전략을 바꿨다. 경쟁이 적은 구체적인 키워드를 노리기로 했다. "React 상태 관리"는 경쟁이 치열하지만, "Zustand vs Jotai 비교"는 상대적으로 경쟁이 적다. "TypeScript 유틸리티 타입"보다 "TypeScript Record 타입 실전 예제"가 더 구체적이다.
실제로 한 것들.
- 글 제목에 사람들이 실제로 검색할 만한 키워드를 넣었다
- "프론트엔드 개발자가 알아야 할 SEO" 같은 제목 대신 "Next.js 블로그 SEO 적용기"처럼 구체적으로
- description 메타태그에 핵심 키워드를 자연스럽게 포함
- h2, h3에도 검색어를 의식해서 작성
2개월 차 결과: 월간 방문자 87명. 전월 대비 278% 증가(라고 쓰면 대단해 보이지만 23명에서 87명이다).
검색 유입이 처음으로 두 자리수가 됐다. Google Search Console에서 확인해보니 "Next.js sitemap 만들기", "React useEffect cleanup" 같은 키워드로 노출이 되기 시작했다. 긴 꼬리 키워드가 먼저 잡혔다.
투자 시간: 글당 30분 추가. 효과: 체감 가능.
3개월 차: 글 수를 늘렸다. 결과는 미미했다.
"글이 많으면 검색 노출이 더 많아지겠지"라는 단순한 논리로 한 달에 8개를 올렸다. 이전에는 4개 정도였는데 두 배로 늘린 거다.
근데 3개월 차 결과: 월간 방문자 130명. 글 수는 두 배로 늘었는데 방문자는 50% 정도만 늘었다.
뭐가 문제인지 Search Console 데이터를 뜯어봤다. 새로 쓴 8개 글 중에 검색 유입이 발생한 건 2개뿐이었다. 나머지 6개는 노출 자체가 안 됐거나, 노출됐는데 클릭이 없었다.
왜 그랬을까. 급하게 쓴 글이어서다. 양을 채우려고 얕은 내용을 넓게 다뤘다. "CSS Grid 정리", "JavaScript 배열 메서드 총정리" 같은 글. 이런 주제는 이미 MDN 문서와 수백 개의 블로그가 다루고 있다. 내 글이 그 사이에서 선택될 이유가 없었다.
한 기술 블로거가 쓴 글에서 "기술 문서를 쉽게 이해할 수 있게 만드는 것이 자신의 사명"이라고 한 걸 본 적이 있다. 그 사람의 블로그가 잘 되는 이유는 글 수가 아니라, 하나하나에 고유한 시각이 있기 때문이었다. 양보다 깊이가 중요하다는 걸 이때 깨달았다.
투자 시간: 많음. 효과: 양에 비례하지 않음.
4개월 차: 전환점이 된 글 하나
4개월 차에 쓴 글 하나가 흐름을 바꿨다. 실무에서 LCP를 3.2초에서 0.9초로 줄인 경험을 구체적으로 적은 글이었다. 원인 분석, 시도한 방법, 각 방법의 before/after 수치를 다 넣었다.
이 글 하나가 한 달에 200명 넘는 유입을 만들었다. 전체 방문자의 절반 이상이 이 글 하나에서 왔다.
왜 이 글이 잘 됐을까. 분석해보니 몇 가지 이유가 있었다.
첫째, 구체적인 수치가 있었다. "LCP를 개선했다"가 아니라 "LCP 3.2초를 0.9초로 줄였다". 검색하는 사람 입장에서 "LCP 개선 방법"보다 구체적인 사례가 더 클릭하고 싶다.
둘째, 실제 코드가 있었다. 이론적인 설명이 아니라 실제 프로젝트에서 적용한 코드와 설정. next.config.js의 어떤 옵션을 바꿨는지, Image 컴포넌트를 어떻게 수정했는지.
셋째, 실패 사례도 있었다. "이 방법을 시도했는데 효과가 없었다"는 내용도 포함했다. 검색하는 사람은 대부분 문제를 해결하려는 중이니까, 효과 없는 방법을 미리 알려주는 게 가치 있다.
web.dev에서 Core Web Vitals를 다루는 방식을 보면, LCP는 2.5초 이내, INP(Interaction to Next Paint)는 200ms 이내, CLS는 0.1 이하를 권장한다. 이런 구체적인 기준점이 있는 주제에서 "내 사이트의 실제 수치"를 공유하면 콘텐츠의 신뢰도가 올라간다.
4개월 차 결과: 월간 방문자 450명. 전월 대비 246% 증가. 글 수는 줄이고 깊이를 늘린 결과.
투자 시간: 이 글 하나에 8시간. 효과: 6개월 동안 꾸준히 유입.
5~6개월 차: 콘텐츠 전략을 잡다
4개월 차의 경험을 바탕으로 방향을 정했다.
1. 실무 경험 기반의 글만 쓴다. "정리" 글이 아니라 "경험" 글. "React Hook Form 사용법"이 아니라 "React Hook Form으로 복잡한 폼 리팩토링한 이야기". 같은 주제지만 다른 형태다. 내 경험에 기반한 글은 다른 블로그와 겹치지 않는다.
2. 글마다 하나의 구체적인 문제를 해결한다. "SEO 총정리" 같은 포괄적인 글보다, "Next.js에서 동적 OG 이미지 생성하는 법" 같은 좁은 주제가 검색 유입에 유리했다. 문제가 구체적일수록 검색어도 구체적이고, 경쟁도 적다.
3. 기존 글을 업데이트한다. 새 글만 쓰는 게 아니라, 잘 되는 글을 더 좋게 만들었다. LCP 개선 글에 추가로 알게 된 내용을 넣고, dateModified를 업데이트했다. 구글은 최신 콘텐츠를 선호한다. 새 글 10개보다 기존 잘되는 글 1개를 업데이트하는 게 효과적일 때가 있다.
4. 내부 링크를 신경 썼다. 관련된 글끼리 링크를 걸었다. "이벤트 루프 글"에서 "브라우저 렌더링 파이프라인 글"로 연결하는 식. 사용자가 사이트에 머무는 시간이 늘고, 구글도 사이트 구조를 더 잘 이해한다.
6개월 차 결과: 월간 방문자 1,047명.
숫자 요약
| 월 | 방문자 | 주요 활동 |
|---|---|---|
| 1개월 | 23 | 기술적 SEO 세팅 (Lighthouse 100점) |
| 2개월 | 87 | 키워드 최적화 시작 |
| 3개월 | 130 | 글 수 2배 증가 (양 위주) |
| 4개월 | 450 | 킬러 콘텐츠 1개 (LCP 개선기) |
| 5개월 | 720 | 콘텐츠 전략 수립 |
| 6개월 | 1,047 | 기존 글 업데이트 + 내부 링크 |
예상과 달랐던 것들
기술적 SEO의 ROI가 생각보다 낮았다. Lighthouse 100점, 구조화 데이터, 완벽한 메타태그. 이것들은 필수지만 그 자체로는 순위에 거의 영향을 주지 않았다. 집의 기초 공사와 비슷하다. 기초가 없으면 집이 무너지지만, 기초가 아무리 튼튼해도 사람이 살고 싶은 집이 되지는 않는다.
콘텐츠 퀄리티가 압도적으로 중요했다. 전체 유입의 60% 이상이 상위 3개 글에서 왔다. 나머지 20개 글을 다 합쳐도 그 3개를 못 이겼다. 글 30개를 쓰는 것보다 킬러 콘텐츠 3개를 만드는 게 SEO에 훨씬 효과적이었다.
소셜 미디어 공유의 효과가 짧았다. 트위터에 글을 공유하면 당일에 50~100명이 유입됐다. 근데 다음 날이면 0에 가까워졌다. 반면 검색 유입은 한번 잡히면 매일 꾸준히 들어왔다. 소셜 미디어는 단발성, 검색 유입은 복리 같은 거다.
title 태그의 영향이 상당했다. 같은 글의 제목을 바꾼 적이 있다. "React 성능 최적화"를 "React 앱이 느릴 때 확인할 5가지"로 바꿨더니 CTR(클릭률)이 2.1%에서 4.8%로 올랐다. 노출 수는 같은데 클릭만 늘었다. 검색 결과에서 클릭하고 싶게 만드는 제목이 중요하다.
페이지 속도는 간접적으로 중요했다. Core Web Vitals 자체가 랭킹에 직접 영향을 주는 건 체감하지 못했다. 근데 페이지가 빠르면 이탈률이 줄고, 체류 시간이 늘고, 결과적으로 구글이 "이 페이지가 유용하다"고 판단하는 것 같았다. LCP가 3초인 페이지에서 2초 이상 기다리는 사람은 드물다.
지금 다시 시작한다면
기술적 SEO는 블로그 만드는 첫날에 한 번 세팅하고 잊어버린다. 하루면 충분하다. 그 후로는 전부 콘텐츠에 투자한다.
구체적인 경험을 쓴다. "~하는 방법"보다 "~했더니 이렇게 됐다"가 훨씬 강력하다. 숫자가 있으면 더 좋다. 실패담이 있으면 더더욱 좋다.
글 수에 집착하지 않는다. 월 4개를 쓰되, 하나하나에 시간을 투자한다. 얕은 글 8개보다 깊은 글 2개가 검색 유입에 더 효과적이다.
그리고 인내심을 가진다. 구글이 새 블로그를 신뢰하기까지는 시간이 걸린다. 처음 2개월은 아무리 잘해도 유입이 적다. 그게 정상이다. 포기하지 않고 3개월 이상 꾸준히 쓰면 그때부터 복리가 시작된다.
