Projects About

Claude Code로 네이버 치과 블로그 300개 분석하고 카드 자동화까지 — 671번의 도구 호출

5개 세션, 총 1501번의 도구 호출. 그 중 하나의 세션이 671번이었다. 25시간 55분짜리 세션이다.

TL;DR 네이버 검색 API로 치과 블로그 330개를 수집·분석하고, S급 구조 패턴을 추출해 Gemini API + Playwright로 자동 생성하는 파이프라인을 Claude Code 한 세션에서 완성했다. /compact를 3번 써야 했고, 컨텍스트가 3번 날아갔다.

시작: “분당 임플란트 상위 10건만 분석해줘”

처음 요청은 단순했다. 네이버 블로그 하나를 URL로 던지며 구조 분석을 요청했다. iframe 래퍼가 3KB, 실제 본문이 292KB인 PostView URL 구조를 파악하는 데 몇 번의 Bash 호출이 필요했다.

macOS에서 막힌 첫 번째 삽질: grep -P 옵션이 없다. Perl 정규식을 지원하지 않는다. Python으로 우회했다.

# macOS grep 대신 Python으로 class 빈도 추출
import re
from collections import Counter
# ...

네이버 API 키 발급은 사람이 직접 해야 하는 작업이다. 개발자 콘솔 로그인이 필요한 인증 단계는 Claude가 대신할 수 없다. 키를 받아서 붙여넣는 방식으로 진행했다.

첫 분석 결과: 상위 1위 블로그(서울리더스치과)는 컴포넌트 27개, 이미지 36장(슬라이드 26장 포함), 텍스트 단락 77개였다. 이 구조를 기준으로 S급 패턴을 정의했다.

330개로 확장: Background Task 전략

“분당 임플란트”에서 시작해 “16 지역 × 7 시술”로 검색어를 확장했다. 112개 키워드, 각 상위 3건 = 336건. 이걸 한 번에 Claude에게 넘기면 컨텍스트가 터진다.

해결 방법은 Background Task였다.

TaskCreate → "Run full dental blog collection pipeline"
(exit code 0으로 완료 알림 수신)

Claude가 직접 모든 HTTP 요청을 처리하는 대신, Python 스크립트를 Background로 실행하고 완료 알림을 기다리는 패턴이다. API 응답이 contextzip에 의해 압축되는 문제도 있어서, 결과를 파일로 저장하고 파싱하는 방식으로 우회했다.

도구 사용 통계를 보면 이 전략이 효과적이었는지 알 수 있다. Read 277번, Bash 191번. 직접 처리보다 파일 읽기 비중이 압도적으로 높다.

/compact 3번: 컨텍스트 한계와의 싸움

25시간짜리 세션에서 /compact를 3번 사용했다. 컨텍스트가 한계에 가까워지면 이전 요약을 넣고 새 컨텍스트로 이어간다.

두 번째 compact 이후 세션 요약에 들어온 내용:

“Primary Request: 사용자는 데이터 기반 치과 블로그 마케팅 자동화 파이프라인을 구축하고 싶다. 330개+ 포스트를 분석해 S급 품질 HTML 카드 템플릿을 만들고…”

같은 세션이지만 Claude 입장에서는 처음 만나는 컨텍스트다. 중요한 결정사항과 진행 상태가 요약에 충분히 담겨야 다음 compact 이후에도 이어갈 수 있다.

이 패턴에서 배운 것: 긴 작업을 이어가려면 중간 중간 명확한 상태 요약이 필요하다. Claude가 알아서 요약하지만, 사용자가 핵심 결정사항을 명시적으로 확인해두는 게 낫다.

시각적 피드백 루프: 스크린샷으로 이터레이션

카드 이미지 생성 단계에서는 코드 리뷰가 아니라 시각적 피드백이 반복됐다. 사용자가 스크린샷을 붙여넣으면 Claude가 문제를 파악하고 HTML을 수정하는 루프다.

[Image: 스크린샷 2026-04-01 오후 8.39.28.png]
"이게 원본 사이트야 로고 가져와서 저장해"

Playwright로 캡처 → 사용자 확인 → 피드백 → HTML 수정 → 재캡처. 이 루프가 수십 번 돌았다.

로고 관련 삽질이 가장 길었다. opacity 값이 들어가 있어서 흐리게 나오는 문제, SVG를 직접 크롤링해서 logo2W.svg(다크 배경용 화이트 버전)를 사용하는 방식으로 해결했다. 최종 카드 구조:

┌─────────────────────────────┐
│  Gemini API 생성 의료 일러스트  │
│  ──────────────────────────  │
│  메인 텍스트 (IBM Plex Sans KR) │
│  서브 내용 3~4줄              │
│  ──────────────────────────  │
│     UD 유디치과 로고 (중앙)     │
└─────────────────────────────┘

결과물: 재사용 가능한 파이프라인

세션이 끝날 때 남은 것:

  • generate-blog-cards 커맨드: 시술명 입력 → HTML 템플릿 렌더링 → Gemini API 의료 일러스트 생성 → Playwright PNG 캡처
  • write-dental-blog 커맨드: 위 커맨드를 내부적으로 호출하며 블로그 글 구조 설계까지
  • 재사용 가능한 이미지 캐시: 30~50개 배경 이미지를 처음에 생성해두고 재조합
  • BLOG-DESIGN-GUIDELINE.md: S급 래퍼런스에서 추출한 구조 패턴 문서

Gemini API로 생성한 의료 일러스트는 “이 이미지는 수술 과정 이해를 돕기 위한 예시입니다” 문구와 함께 삽입된다. 실사 사진 대신 생성 이미지를 쓰는 게 명확히 낫다는 판단이었다.

병렬 세션에서 진행된 다른 작업

같은 기간에 다른 세션들도 돌아갔다.

spoonai 이미지 깨짐 수정: CDN에서 HTML 파일이 .jpg로 저장되는 버그. 4개 파일의 image frontmatter를 제거하고, SKILL.md에 이미지 검증 로직을 추가했다. 중복 기사 4건(같은 주제가 3~4일 연속 발행된 것)도 정리했다.

jidonglab SEO 강화: robots.txt, sitemap, JSON-LD, RSS, OpenSearch까지. 두 사이트(jidonglab + spoonai)를 동시에 업데이트했다. 168번의 도구 호출, 42분.

refmade 모바일 수정: 42개 iframe(각 1440×6000px)을 모바일에서 로드하면 Safari가 메모리 초과로 탭을 kill → reload 루프에 빠진다. useIsMobile hook으로 768px 미만에서는 썸네일 PNG를 사용하도록 전환했다. 진단에서 수정까지 10분이 안 걸렸다.

Claude Code 활용 관점에서 정리

이번 세션들에서 패턴으로 굳어진 것들:

Background Task는 필수다. 300개 데이터 수집 같은 I/O 집약 작업을 Claude가 직접 처리하면 컨텍스트를 낭비한다. 스크립트를 작성하고 Background로 실행한 뒤 완료 알림을 받는 방식이 훨씬 효율적이다.

이미지 피드백은 텍스트보다 빠르다. “로고가 흐릿하다”는 텍스트 설명보다 스크린샷 하나가 문제를 더 정확하게 전달한다. Claude Code가 이미지를 직접 읽을 수 있다는 점을 적극적으로 활용했다.

컨텍스트 관리는 사용자 몫이다. /compact 타이밍을 잘 잡는 게 중요하다. 너무 이르면 필요한 컨텍스트가 사라지고, 너무 늦으면 Claude가 이전 결정을 잊어버린다. 25시간 세션에서 3번이 적당했다.

Comments 0

0 / 1000