📚 이 글은 “개발자가 AI 자동화로 부업하는 실전 기록” 시리즈입니다.
- 📌 1편: AI 자동화로 개발자 부업하는 법 — 실패 3번 하고 나서야 알게 된 것들
- 📌 2편: WordPress + Claude API Day 1 세팅 기록
- 📌 3편: Slack 봇으로 블로그 자동 발행 트리거 만들기
- 📌 4편: Threads API 연동으로 블로그 발행과 SNS 자동 배포 연결하기
- 📌 5편: Notion API로 블로그 발행 기록 자동화하기
- 📌 6편: Windows Task Scheduler로 블로그 자동 발행 스케줄러 만들기
- 📌 7편: 블로그 SEO 최적화 실전 — Yoast SEO + 키워드 전략부터 검색 상위 노출까지
- 📌 8편: 블로그 자동화 2주 운영 결과 공개
- 📌 9편: 쿠팡파트너스 가입부터 자동화까지
- 📌 10편: 구글 애드센스 신청 도전기
- 📌 11편: 구글 애드센스 신청 후기
- 📌 12편: 네이버 서치어드바이저 등록 후기
- 📌 13편: 블로그 자동화 한 달 총정리
- 📌 14편: Threads 마케팅으로 블로그 트래픽 늘리기
- 📌 15편: AI 자동화 부업 2개월 솔직 후기
- 📌 16편: 구글 애드센스 승인 결과 공개
- 📌 17편: WordPress 플러그인 최적화 실전
- 📌 18편: 카카오 애드핏 도전기
- 📌 19편: Python Pillow로 블로그 썸네일 자동 생성
- 📌 20편: 블로그 자동화 3개월 결과 공개 — 데이터로 보는 현실
- 📌 21편: 구글 서치콘솔 활용법 — 검색 유입 데이터로 콘텐츠 전략 세우기 (현재 글)
- 📌 22편: 롱테일 키워드 전략 — 경쟁 없는 틈새 검색어 공략법 (예정)
- 📌 23편: 블로그 포스트 자동 SNS 공유 — X(Twitter) API 연동 실전 (예정)
- 📌 24편: ChatGPT vs Claude — 블로그 글쓰기 AI 실전 비교기 (예정)
- 📌 25편: 수익화 다각화 전략 — 전자책·강의·컨설팅으로 블로그 수익 확장하기 (예정)
- 📌 26편: 티스토리 vs WordPress — 자동화 블로그 관점 완전 비교 (예정)
- 📌 27편: 뉴스레터 자동화 — Mailchimp API 연동으로 구독자 관리 시스템 만들기 (예정)
- 📌 28편: 블로그 자동화 코드 오픈소스화 — GitHub 공개와 포트폴리오 활용 (예정)
- 📌 29편: Google Analytics 4 연동 — 방문자 행동 데이터로 콘텐츠 개선하기 (예정)
- 📌 30편: AI 자동화 부업 6개월 총결산 — 수익, 실수, 그리고 앞으로의 계획 (예정)
← 20편: 블로그 자동화 3개월 결과 공개 — 데이터로 보는 현실
솔직히 고백하자면, 나는 꽤 오랫동안 구글 서치콘솔을 거의 쓸모없이 방치하고 있었다.
등록은 초기에 해뒀다. 사이트맵도 제출했다. 그런데 막상 대시보드를 열면 숫자가 너무 많고, 뭘 봐야 할지 몰라서 그냥 창을 닫는 게 루틴이었다. “그래, 어차피 트래픽 별로 없을 거야”라는 자기 합리화까지 곁들이면서. 3개월이 지나서야 데이터가 어느 정도 쌓였고, 20편에서 3개월 결과를 정리하면서 제대로 뜯어봤다. 그때 진짜 충격을 받았다. 내가 신경도 안 쓰고 있던 글이 특정 검색어로 꽤 많이 노출되고 있었고, 반대로 공들여 쓴 글이 검색 유입이 거의 없는 이유도 데이터에 다 적혀 있었다. 보고 있었으면 진작에 고쳤을 텐데. 진짜 아쉬웠다. 이번 편은 그 반성에서 나온 글이다. 구글 서치콘솔을 어떻게 읽고, 그 데이터를 실제 콘텐츠 전략으로 바꿔나가고 있는지를 정리해본다.
구글 서치콘솔, 어디서 무엇을 봐야 하는가
서치콘솔을 처음 열면 왼쪽 메뉴에 항목이 많아서 어디를 봐야 할지 막막하다. 나도 처음엔 그냥 ‘개요’ 화면만 보다가 닫았다. 그런데 실제로 콘텐츠 전략에 쓸 수 있는 데이터는 딱 한 곳에 집중돼 있다. 바로 검색 결과(Search results) 메뉴다.
여기서 볼 수 있는 핵심 지표는 네 가지다.
| 지표 | 의미 | 활용 포인트 |
|---|---|---|
| 클릭수(Clicks) | 검색 결과에서 실제로 클릭된 횟수 | 실질 트래픽 발생 여부 확인 |
| 노출수(Impressions) | 검색 결과 목록에 내 글이 뜬 횟수 | 검색엔진이 내 글을 인식했는지 여부 |
| CTR(클릭률) | 노출 대비 클릭 비율 | 제목·설명이 매력적인지 판단 |
| 평균 게재순위 | 검색 결과 평균 노출 위치 | 상위 노출 가능성 있는 키워드 발굴 |
이 네 가지 지표를 조합해서 읽는 게 핵심이다. 하나만 봐서는 잘못된 판단을 내리기 쉽다. 예를 들어, 노출수가 높은데 CTR이 낮다면 제목이나 메타 디스크립션에 문제가 있는 거고, 평균 순위가 11~20위 정도인데 노출수가 꽤 있다면 조금만 더 최적화하면 1페이지 진입이 가능하다는 신호다.
서치콘솔은 ‘검색 결과’ 메뉴 하나만 제대로 읽어도 콘텐츠 전략의 절반이 결정된다.
내가 발견한 충격적인 패턴 — 노출은 있는데 클릭이 없는 글들
3개월치 데이터를 쭉 내려다보다가 한 가지 패턴이 눈에 들어왔다. 특정 글들이 노출수는 수백, 수천 단위로 쌓이고 있는데 클릭수는 10을 넘지 못하는 케이스였다. CTR이 1%도 안 되는 상태. 처음에는 “그냥 관련 없는 키워드로 걸리는 거겠지” 싶었는데, 실제로 어떤 검색어로 노출되고 있는지를 확인해보니 내용과 꽤 관련 있는 키워드들이었다.
문제는 제목과 메타 디스크립션이었다. 내 자동화 스크립트가 처음에는 Yoast SEO의 메타 설명을 자동으로 채워주지 않았고, 구글이 본문 앞부분을 그냥 잘라서 검색 결과에 보여주고 있었다. 본문 첫 문장이 “이 글은 시리즈의 몇 번째 편입니다” 같은 식이었으니 클릭률이 낮을 수밖에. 진짜 허탈했다. 노출은 되고 있었는데, 내가 그걸 모르고 있었을 뿐이었다.
이걸 알고 나서 바로 세 가지 작업을 했다.
- ✅ 노출수 상위 20개 글의 메타 디스크립션 수동 점검 및 수정
- ✅ Claude API 프롬프트에 “메타 디스크립션은 120~155자 클릭 유도 문구로” 조건 추가
- ✅ 제목이 검색 의도와 맞는지 재검토 — 키워드를 앞으로 당기는 리라이팅
수정 후 2주가 지나자 같은 키워드에서 CTR이 평균 2~3%대로 올라갔다. 검색 유입 분석에서 얻을 수 있는 가장 빠른 성과였다.
노출은 되고 있었다 — 단지 내가 방치하고 있었을 뿐이다. 서치콘솔은 이미 답을 갖고 있었다.
SEO 데이터로 콘텐츠 전략 세우는 실전 방법
서치콘솔 데이터를 읽는 것과 그걸 전략으로 바꾸는 건 다른 차원의 이야기다. 내가 실제로 쓰고 있는 방법을 정리해보면 크게 세 가지 패턴으로 나뉜다.
① 11~20위 키워드 집중 공략 (Quick Win 전략)
검색 순위가 11~20위라는 건 2페이지에 걸쳐 있다는 의미다. 1페이지와 2페이지의 클릭수 차이는 말 그대로 천지 차이다. 서치콘솔에서 ‘평균 게재순위’를 기준으로 정렬하면 이 구간의 키워드들만 쉽게 뽑을 수 있다. 이 키워드들을 다루는 글을 찾아서 다음 두 가지를 집중적으로 개선한다.
– 해당 키워드를 h2, h3 소제목에 자연스럽게 추가
– 글의 분량과 정보 밀도를 높여 체류 시간 유도
② 노출수 많고 클릭 없는 글 — 제목·메타 개선
위에서 언급한 패턴이다. 이 케이스는 SEO 자체의 문제가 아니라 검색 결과 화면에서의 클릭 유도 문제다. 제목과 메타 디스크립션을 고치는 것만으로 빠르게 개선된다.
③ 전혀 예상 못 한 키워드 발굴 — 새 콘텐츠 소재
내가 가장 흥미롭게 생각하는 활용법이다. 서치콘솔의 ‘쿼리(Queries)’ 탭을 보면 내가 의도하지 않았던 검색어로도 글이 노출되고 있다는 걸 발견하게 된다. 예를 들어 Slack 봇 연동 편을 썼는데, “파이썬 슬랙 자동화 예제” 같은 키워드로도 꽤 노출되고 있었다. 이런 키워드들은 독립적인 글로 발전시킬 소재가 된다. 내가 미처 커버하지 못한 수요를 구글이 알려주는 셈이다.
콘텐츠 전략은 감이 아니라 데이터에서 나온다 — 서치콘솔이 이미 다음 편 주제를 알려주고 있다.
Search Console API로 데이터 자동 수집하기
서치콘솔 대시보드를 매번 수동으로 여는 건 나한테 맞지 않았다. 개발자 본능인지, 결국 자동화하고 싶어졌다. 다행히 구글은 Search Console API를 공개하고 있고, Python에서 꽤 간단하게 연동할 수 있다.
내가 만든 건 단순하다. 매주 월요일 아침에 지난 28일간의 쿼리 데이터를 자동으로 뽑아서 Slack 채널에 보내주는 스크립트다. 노출수 상위 10개, CTR 최하위 10개, 순위 11~20위 키워드를 각각 뽑아서 정리해서 보내준다. 덕분에 서치콘솔을 직접 열지 않아도 매주 내 블로그의 검색 상황을 파악할 수 있게 됐다.
⚙️ 사전 준비: Google Search Console API 사용을 위해 Google Cloud Console에서 프로젝트를 생성하고, Search Console API를 활성화한 뒤 서비스 계정(Service Account) JSON 키를 발급받아야 합니다. 발급받은 키 파일 경로를 SERVICE_ACCOUNT_FILE에 지정하세요. 또한 해당 서비스 계정 이메일을 Search Console의 ‘사용자 및 권한’에서 ‘소유자’ 또는 ‘전체 권한’으로 추가해야 합니다. Python 패키지: pip install google-auth google-auth-httplib2 google-api-python-client python-dotenv
import os
from datetime import datetime, timedelta
from googleapiclient.discovery import build
from google.oauth2 import service_account
from dotenv import load_dotenv
load_dotenv()
SERVICE_ACCOUNT_FILE = os.getenv("GSC_SERVICE_ACCOUNT_FILE")
SITE_URL = os.getenv("GSC_SITE_URL") # 예: https://devyul.com/
SCOPES = ["https://www.googleapis.com/auth/webmasters.readonly"]
def get_gsc_service():
creds = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES
)
return build("searchconsole", "v1", credentials=creds)
def fetch_top_queries(service, days=28, row_limit=20):
end_date = datetime.today().strftime("%Y-%m-%d")
start_date = (datetime.today() - timedelta(days=days)).strftime("%Y-%m-%d")
request_body = {
"startDate": start_date,
"endDate": end_date,
"dimensions": ["query"],
"rowLimit": row_limit,
"orderBy": [{"fieldName": "impressions", "sortOrder": "DESCENDING"}]
}
response = service.searchanalytics().query(
siteUrl=SITE_URL, body=request_body
).execute()
rows = response.get("rows", [])
results = []
for row in rows:
results.append({
"query": row["keys"][0],
"clicks": row["clicks"],
"impressions": row["impressions"],
"ctr": round(row["ctr"] * 100, 2),
"position": round(row["position"], 1)
})
return results
def find_quick_win_keywords(results):
"""순위 11~20위이면서 노출수가 50 이상인 키워드"""
return [
r for r in results
if 11 <= r["position"] <= 20 and r["impressions"] >= 50
]
if __name__ == "__main__":
service = get_gsc_service()
queries = fetch_top_queries(service, days=28, row_limit=50)
print("=== 노출수 상위 쿼리 ===")
for q in queries[:10]:
print(f"[{q['position']}위] {q['query']} | 노출:{q['impressions']} 클릭:{q['clicks']} CTR:{q['ctr']}%")
quick_wins = find_quick_win_keywords(queries)
print(f"\n=== Quick Win 키워드 ({len(quick_wins)}개) ===")
for q in quick_wins:
print(f"[{q['position']}위] {q['query']} | 노출:{q['impressions']}")
데이터를 자동으로 받아보면 매주 콘텐츠를 어떻게 개선해야 할지가 눈에 들어온다.
페이지별 분석 — 어떤 글이 검색 유입을 만들고 있나
쿼리 단위 분석도 중요하지만, 페이지 단위로 보는 것도 따로 해야 한다. 서치콘솔에서 ‘검색 결과’ 메뉴의 ‘페이지(Pages)’ 탭으로 전환하면 글별로 노출수와 클릭수가 나온다.
내가 이 탭에서 확인한 것들을 정리하면 이렇다.
- ✅ 전체 검색 유입의 약 40%를 단 3개의 글이 만들고 있었다 (파레토 법칙은 여기도 적용된다)
- ✅ 20편 넘게 글을 발행했는데 검색 유입이 전혀 없는 글도 8개나 됐다
- ✅ 검색 유입 상위 글들은 예외 없이 롱테일 키워드를 자연스럽게 포함하고 있었다
- ✅ 내가 가장 공들여 쓴 ‘수익화 총정리’ 계열 글들은 정보성 검색보다 브랜드 검색(devYul)으로 유입되는 비중이 높았다
이 데이터를 보고 나서 콘텐츠 전략을 실질적으로 바꿨다. 검색 유입이 있는 상위 글들의 키워드 패턴을 분석해서 비슷한 의도의 글을 더 발행하는 방향으로. 그리고 유입이 전혀 없는 글들은 내부 링크로 강화하거나, 검색 의도에 맞게 제목을 수정하는 방향으로.
파레토 법칙은 블로그에도 적용된다. 상위 글의 패턴을 파악하고 거기서 배우는 게 가장 빠른 전략이다.
서치콘솔 데이터를 Claude API와 연결하기 — 자동 인사이트 추출
여기까지 왔으면 자연스러운 다음 스텝은 이거다. 매주 뽑은 서치콘솔 데이터를 Claude API에 넘겨서 인사이트를 자동으로 요약받는 것. 나는 Slack 봇과 연결해서, 월요일 아침에 지난 주 데이터 요약 + 다음 주 개선 포인트를 자동으로 받아볼 수 있게 만들었다.
⚙️ 사전 준비: 위 섹션의 Search Console API 코드가 먼저 세팅돼 있어야 합니다. Claude API 키는 .env의 ANTHROPIC_API_KEY에, Slack 봇 토큰은 SLACK_BOT_TOKEN에 설정하세요. 패키지: pip install anthropic slack-sdk
import anthropic
from slack_sdk import WebClient
import os
from dotenv import load_dotenv
load_dotenv()
claude = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
slack = WebClient(token=os.getenv("SLACK_BOT_TOKEN"))
SLACK_CHANNEL = os.getenv("SLACK_CHANNEL_ID")
def analyze_gsc_data_with_claude(queries: list, quick_wins: list) -> str:
top_queries_text = "\n".join([
f"- '{q['query']}': 노출 {q['impressions']}회, 클릭 {q['clicks']}회, CTR {q['ctr']}%, 순위 {q['position']}위"
for q in queries[:15]
])
quick_win_text = "\n".join([
f"- '{q['query']}': 현재 {q['position']}위, 노출 {q['impressions']}회"
for q in quick_wins[:10]
]) if quick_wins else "없음"
prompt = f"""다음은 개발자 AI 자동화 부업 블로그(devyul.com)의 지난 28일 구글 서치콘솔 데이터입니다.
[노출수 상위 검색어]
{top_queries_text}
[Quick Win 후보 (11~20위, 노출 50회 이상)]
{quick_win_text}
위 데이터를 분석해서 다음을 한국어로 간결하게 정리해주세요:
1. 이번 주 검색 유입 핵심 패턴 (2~3문장)
2. 즉시 개선 가능한 CTR 개선 대상 글 (있다면)
3. Quick Win 키워드 중 콘텐츠 보강 우선순위 TOP 3
4. 다음 주 발행 추천 콘텐츠 주제 2개 (검색 데이터 근거 포함)
답변은 Slack 메시지에 붙여넣기 좋게, 이모지를 활용해 가독성 있게 작성해주세요."""
message = claude.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return message.content[0].text
def send_weekly_gsc_report(queries: list, quick_wins: list):
insight = analyze_gsc_data_with_claude(queries, quick_wins)
full_message = f"📊 *주간 서치콘솔 리포트*\n\n{insight}"
slack.chat_postMessage(channel=SLACK_CHANNEL, text=full_message)
print("Slack 리포트 전송 완료")
# 사용 예시
# service = get_gsc_service() # 이전 코드에서 정의
# queries = fetch_top_queries(service, days=28, row_limit=50)
# quick_wins = find_quick_win_keywords(queries)
# send_weekly_gsc_report(queries, quick_wins)
이 스크립트를 Windows Task Scheduler에 등록해서 매주 월요일 오전 9시에 자동으로 실행되게 해뒀다. 이제 서치콘솔을 직접 열지 않아도 Slack에서 요약 리포트를 받아볼 수 있다. 개발자가 만들면 이렇게 된다.
데이터 수집 → Claude 분석 → Slack 리포트까지 자동화하면, 콘텐츠 전략 회의를 혼자 매주 자동으로 하는 셈이 된다.
지금 솔직한 평가 — 서치콘솔이 바꾼 것들
서치콘솔 데이터를 제대로 활용하기 시작한 건 솔직히 시작한 지 3개월이 지나서였다. 초반에 진작 들여다봤으면 더 빨리 성장할 수 있었을 텐데, 라는 아쉬움이 있다. 하지만 데이터가 쌓이기 전에는 봐도 별로 의미 있는 게 없기도 하다. 어느 정도 글이 쌓이고 트래픽이 생기기 시작한 시점에서 서치콘솔이 진가를 발휘한다.
지금 내 블로그 기준으로 서치콘솔 덕분에 달라진 것들을 정리하면 이렇다.
- ✅ 메타 디스크립션 전면 수정 후 평균 CTR이 약 1.8%p 상승
- ✅ Quick Win 키워드 3개를 집중 보강한 글이 2페이지 → 1페이지 진입
- ✅ 매주 자동 리포트로 다음 편 주제 아이디어의 약 30%를 서치콘솔 데이터에서 가져오고 있음
- ✅ 내가 “잘 됐다”고 생각하던 글이 사실 검색 유입이 없었다는 사실을 알게 됨 (그리고 수정함)
여전히 검색 유입이 많지는 않다. 하루에 수십~수백 명 수준이다. 하지만 방향이 생겼다. 어떤 글을 어떻게 고쳐야 할지, 다음엔 어떤 주제를 써야 할지가 감이 아니라 데이터에서 나오고 있다. 그게 지금은 가장 뿌듯한 부분이다.
📌 다음 편: 롱테일 키워드 전략 — 경쟁 없는 틈새 검색어 공략법
- 서치콘솔 데이터에서 롱테일 키워드를 발굴하는 구체적인 방법
- 검색량은 적지만 전환율 높은 키워드가 왜 부업 블로그에 더 잘 맞는가
- 키워드 난이도 분석 없이도 경쟁 피하는 실전 전략
- 실제로 적용해서 유입이 생긴 롱테일 키워드 사례 공개