마이그레이션 후에 일어나는 일: 8일간의 복리 수익
블로그를 Next.js로 마이그레이션하고 어려운 부분은 끝났다고 생각했습니다. 그런데 복리 효과가 시작되었습니다 — 6개의 메가 가이드, 더 똑똑해진 AI 어시스턴트, 네이티브 뉴스레터, 봇 방어, SEO 전면 개편이 8일 만에 이루어졌습니다.
8일 전, 저는 전체 블로그 백엔드를 4일 만에 재구축했습니다. 485개의 WordPress 포스트를 Next.js로 마이그레이션하고, Sydney(저의 AI 챗봇)를 되살렸으며, 프로덕션 사이트를 배포했습니다.
그것이 이야기의 끝이라고 생각했습니다. 마이그레이션 완료, 축하하고, 다음으로 넘어가기.
틀렸습니다. 마이그레이션은 목적지가 아니라 출발선이었습니다.
2월 5일과 오늘의 사이트 모습을 비교해 보겠습니다:
| 기능 | 2월 5일 (마이그레이션 당일) | 2월 13일 (오늘) |
|---|---|---|
| 블로그 포스트 | 485 (WordPress에서 마이그레이션) | 492 (새 메가 가이드 6개) |
| Sydney AI | 기본 RAG, 테스트되지 않은 품질 | 평가 완료, 최적화, 81% 적중률 |
| 뉴스레터 | Beehiiv 임베드 (서드파티) | 네이티브 Supabase + Resend, 관심사 기반 |
| SEO | 기본 사이트맵 + 메타 태그 | 구조화 데이터, FAQ 스키마, llms.txt, AEO |
| 보안 | 속도 제한만 | Cloudflare Turnstile + 속도 제한 |
| 성능 | 기본 Lighthouse 검사 | Chrome DevTools MCP로 체계적 프로파일링 |
| 대표 이미지 | 수동 제작 | AI 생성 파이프라인 (Gemini + 자동 최적화) |
이 모든 개선은 이전 것이 다음 것을 더 쉽게 만들었기 때문에 가능했습니다. 이것이 제가 예상하지 못했던 복리 효과입니다.
핵심 발견: 블로그가 이제 코드입니다
WordPress에서 코드 기반 스택으로 마이그레이션할 때 아무도 말해주지 않는 것이 있습니다: 마이그레이션 자체가 핵심이 아닙니다. 핵심은 그 이후에 가능해지는 것입니다.
블로그가 MySQL 데이터베이스의 행이 아닌 Git 저장소의 492개 MDX 파일이 되면, 모든 것이 달라집니다:
- 모든 포스트가 파일입니다 — Claude Code가 대규모로 읽고, 검색하고, 수정할 수 있습니다
- 모든 변경이 diff입니다 — 50개 포스트에 걸쳐 정확히 무엇이 변경되었는지 검토할 수 있습니다
- 모든 기능이 조합 가능합니다 — 뉴스레터 시스템이 AI 챗봇과 동일한 포스트 메타데이터를 읽을 수 있습니다
- 모든 배포가 명령어 하나입니다 —
pnpm build && vercel --prod, 끝
WordPress에서는 12개 블로그 포스트를 업데이트하려면 wp-admin에 로그인하고, 각각을 클릭하고, 변경하고, 업데이트하고, 반복해야 했습니다. MDX 파일과 Claude Code로? "12개의 기존 공원 가이드에 국립공원 필러 포스트 링크를 추가해줘"라고 하면 각 파일을 읽고, 적절한 맥락에 맞는 크로스링크를 추가하고, diff를 보여주었습니다. 12개 업데이트가 몇 분 만에.
이것이 핵심 발견입니다. 마이그레이션이 아니라. 그 이후에 오는 속도입니다.
4일 만에 6개의 메가 가이드
마이그레이션 후 가장 먼저 만든 것은? 콘텐츠입니다. 많은 양의.
몇 달 동안 종합적인 해외 거주자 가이드를 쓰고 싶었습니다 — 미국 이주의 혼란을 헤쳐나가는 사람들에게 실제로 도움이 되는 2,000-4,000단어의 필러 포스트 말이죠. WordPress는 그것을 고통스럽게 만들었습니다. 각 포스트마다 수동 포맷팅, 이미지 업로드, SEO 플러그인 설정, 카테고리 관리가 필요했습니다.
지금은? 파이프라인이 이렇습니다:
- 구조와 개요를 브레인스토밍합니다
- SEO/AEO 최적화가 내장된 전체 MDX를 작성합니다
- 대표 이미지 생성 — Claude가 포스트를 읽고, 프롬프트를 작성하고, Gemini에 보내 이미지를 생성합니다
- 최적화 — Python 스크립트가 WebP로 변환하고, 웹용으로 압축합니다
- Vercel Blob에 업로드합니다
- 발행 —
git push,vercel --prod,pnpm db:publish - Sydney가 즉시 알게 됩니다 — 포스트가 임베딩과 함께 Supabase에 동기화됩니다
4일 동안 배포된 내용입니다:
| 포스트 | 주제 | 단어 수 |
|---|---|---|
| 의료보험 가이드 | HSA, FSA & HDHP 설명 | ~3,200 |
| 신용 구축 | 제로에서 720+ 신용점수까지 | ~3,500 |
| 저축 & 투자 | T-Bills vs HYSA 비교 분석 | ~2,800 |
| 신용카드 리워드 | 포인트, 마일리지, 캐시백 전략 | ~3,000 |
| 이주 가이드 | 미국 이주 완전 가이드 | ~3,800 |
| 국립공원 | 26개 공원, 4개 로드트립 | ~4,200 |
각 포스트는 동일한 AEO 패턴을 따릅니다: 답변 우선 오프닝, 비교 표, 120-180단어 섹션, 굵은 정의, 하단의 FAQ 스키마. AI 인용이 340% 더 많아지는 구조입니다.
국립공원 가이드가 가장 컸습니다 — 12개의 기존 공원 리뷰로 연결되는 필러 포스트입니다. 또한 PhotoGallery 컴포넌트도 만들었는데, 20개의 개별 이미지를 스크롤하는 것이 힘들었기 때문입니다. 이제 라이트박스가 있는 깔끔한 그리드입니다. 단순하지만 효과적입니다.
Sydney가 더 똑똑해졌습니다
마이그레이션 중 Sydney를 처음 되살렸을 때, 그녀는 작동했습니다 — 출시 전에 수동으로 테스트했습니다. 질문에 답하고, 관련 포스트를 찾고, 출처를 인용할 수 있었습니다. 하지만 수동 테스트는 "괜찮아 보이네"만 알려줍니다. 얼마나 괜찮은지, 어디에 격차가 있는지, 어떻게 개선할 수 있는지는 알려주지 않습니다.
품질을 체계적으로 측정할 방법이 없었습니다 — 그리고 측정 없이는 개선할 방법도 없었습니다.
그래서 RAG 평가 프레임워크를 구축했습니다. 12개 카테고리에 걸친 32개 테스트 쿼리, 각각 직접 큐레이션한 기대 결과가 있습니다. "해외 거주자가 받아야 할 신용카드는?"은 신용 구축 가이드를 반환해야 합니다. "Yosemite에 대해 알려줘"는 Yosemite 여행 리포트를 반환해야 합니다.
그런 다음 30가지 다른 구성 조합 — 6개의 유사도 임계값 × 5개의 결과 수 — 을 테스트하고 적중률, 정밀도, 시간적 다양성을 측정했습니다.
결과는 눈을 뜨게 했습니다:
| 지표 | 이전 (기본값) | 이후 (최적화됨) |
|---|---|---|
| 적중률 | ~30% | 81.2% |
| 결과 없음 쿼리 | 30개 중 6개 | 30개 중 0개 |
| 시간적 분포 | 1.2년 | 6.7년 |
가장 큰 수정은 창피했습니다: OpenAI SDK가 Next.js에서 실행될 때 dimensions 파라미터를 조용히 누락시키고 있었습니다. Sydney는 1536차원 임베딩을 생성하면서 384차원 인덱스를 검색하고 있었습니다. 결과가 안 좋았던 것이 당연합니다. 직접 fetch() 호출로 전환하니 하룻밤 사이에 해결되었습니다.
또한 Sydney의 시스템 프롬프트를 490개 이상의 블로그 주제 전체를 커버하도록 확장했습니다 — 이제 국립공원, 신용카드, 의료보험, 그리고 전체 해외 거주자 콘텐츠 라이브러리에 대해 알고 있습니다. AI와 마케팅만이 아닙니다.
직접 테스트하는 두 가지 명령어:
pnpm eval:rag # 로컬 Supabase에 대해 테스트
pnpm eval:rag:prod # 프로덕션에 대해 테스트
이제 Sydney가 더 똑똑해질 때 실제로 측정할 수 있습니다. 이런 종류의 인프라는 WordPress를 운영할 때는 절대 구축하지 않습니다.
대규모 SEO와 AEO
2026년의 SEO는 더 이상 Google만의 문제가 아닙니다. 누군가가 여러분의 콘텐츠가 답하는 질문을 할 때 ChatGPT, Perplexity, Claude에 의해 인용되는 것입니다.
하나의 주말에 완전한 SEO/AEO 스택을 구현했습니다:
전통적 검색용:
- 동적 사이트맵 (639페이지 인덱싱)
- 구조화 데이터 — Person, WebSite, Article, BreadcrumbList, FAQPage 스키마
- 신디케이션용 RSS 피드
- Google Search Console 인증 완료
AI 엔진용 (AEO/GEO):
llms.txt— AI 크롤러를 위한 우선순위 콘텐츠 가이드 (GPTBot, Claude-Web, PerplexityBot 모두robots.txt에서 허용)- 모든 섹션 오프닝에 답변 우선 패턴 (처음 150단어 내 굵은 핵심 문장)
- 사람들이 AI 어시스턴트에게 묻는 방식과 일치하는 질문 형식 H2
- FAQ 섹션 자동 감지 및 FAQPage 스키마로 렌더링
성능용:
Chrome DevTools MCP를 사용하여 다양한 페이지 유형을 프로파일링했습니다 — 홈페이지, 블로그 목록, 개별 포스트, /ask 페이지 — 그리고 병목 지점을 식별했습니다. 성능 트레이스를 실행하고, 결과를 분석하고, 동일한 Claude Code 세션에서 문제를 수정할 수 있다는 것은... 비합리적으로 효율적입니다.
결과는? 제가 쓰는 모든 새 포스트에 자동으로 구조화 데이터, FAQ 스키마 (FAQ 섹션이 있는 경우), AI 추출에 최적화된 포맷이 적용됩니다. 플러그인 없음. 수동 설정 없음. 그냥 사이트가 작동하는 방식입니다.
Beehiiv에서 네이티브 뉴스레터로
이것은 저도 놀랐습니다. Beehiiv에 작동하는 뉴스레터가 있었습니다. 이메일을 수집했습니다. 업데이트를 보냈습니다. 왜 교체할까요?
세 가지 이유:
- 제어 — 관심사 기반 구독을 원했습니다. "AI & 기술" 구독자는 국립공원 콘텐츠를 받으면 안 됩니다. Beehiiv의 무료 플랜은 이를 지원하지 않았습니다.
- 통합 — 구독자 데이터가 이제 Sydney의 검색 인덱스와 동일한 Supabase 데이터베이스에 있습니다. 하나의 진실의 원천.
- 비용 — Supabase (무료 플랜) + Resend (저용량 무료 플랜) = 월 $0.
구축한 시스템:
- 이중 확인 — 구독 → 확인 이메일 → 확정 → 개인화된 추천이 담긴 환영 이메일
- 5개 관심사 그룹 — AI, 해외 거주자 생활, 리더십, 마케팅, 여행 & 국립공원
- 스마트 매칭 — 포스트 카테고리가 구독자 관심사에 자동 매핑됩니다. 신용카드 가이드를 발행하면 "해외 거주자 생활" 구독자만 알림을 받습니다.
- 일일 크론 — Vercel이 태평양 시간 오전 11시에 작업을 실행하고, 지난 48시간의 포스트를 찾아 타겟 알림을 보냅니다
- 중복 방지 —
notification_log테이블이 중복 이메일을 영원히 방지합니다
가장 좋은 점은? 모든 블로그 포스트 하단의 구독 양식이 포스트의 카테고리에 따라 관련 관심사를 자동 선택합니다. AI 기사를 읽고 있나요? 스크롤을 내려 구독할 때 "AI & 기술" 필이 미리 선택되어 있습니다.
이것을 처음부터 구축하는 것은 많은 작업처럼 들립니다. 집중해서 작업한 어느 저녁 정도였습니다. Supabase 마이그레이션, API 라우트, 이메일 템플릿, 크론 작업 — Claude Code가 스캐폴딩을 처리하는 동안 저는 로직과 카피에 집중했습니다.
보안: 필요할 때까지 보이지 않는 것
공개 AI 챗봇과 뉴스레터 가입이 있으니, 봇이 악용하기 좋아하는 두 개의 엔드포인트가 있었습니다. 속도 제한은 이미 있었지만 (Upstash Redis, 분당 5회 요청), 두 번째 레이어를 원했습니다.
Cloudflare Turnstile이 등장합니다 — 의심스러운 활동이 감지될 때만 챌린지를 보여주는 보이지 않는 CAPTCHA입니다. 실제 방문자의 99%에게는 완전히 보이지 않습니다. 봇에게는? 벽입니다.
먼저 /ask 엔드포인트 (Sydney 채팅)에 추가한 다음, 정확히 동일한 패턴을 /api/subscribe에 재사용했습니다. 동일한 인증 라이브러리, 동일한 그레이스풀 디그레이드:
- 환경 변수 미설정 → 우회 (로컬 개발이 설정 없이 작동)
- Cloudflare API 다운 → 오픈 실패 (속도 제한기가 폴백)
- 토큰 누락이지만 시크릿 키 설정됨 → 거부 (프론트엔드를 우회하는 봇 포착)
재사용이 이것을 복리 이야기로 만드는 것입니다. 뉴스레터의 Turnstile 통합은 몇 시간이 아닌 몇 분이 걸렸는데, Sydney에서 이미 인프라가 갖춰져 있었기 때문입니다.
복리 효과
계획하지 않았지만 자연스럽게 일어난 것입니다:
Next.js로 마이그레이션 (2월 1-5일)
└─→ MDX 파일이 Claude Code가 대규모로 콘텐츠를 읽고/수정할 수 있게 함
└─→ SEO/AEO 최적화된 6개 메가 가이드 작성 (2월 6-11일)
└─→ 새 콘텐츠가 Sydney의 검색 품질 문제를 드러냄
└─→ RAG 평가 프레임워크 구축, Sydney 최적화 (2월 11일)
└─→ 더 많은 콘텐츠에 뉴스레터 필요 (Beehiiv 말고)
└─→ Supabase 기반 네이티브 뉴스레터 구축 (2월 12일)
└─→ 공개 엔드포인트에 봇 방어 필요
└─→ Sydney + 구독에 Turnstile 추가 (2월 12-13일)
이 중 어느 것도 시퀀스로 계획된 것이 아닙니다. 각각이 다음 필요를 드러냈습니다. 마이그레이션이 콘텐츠 생성을 빠르게 만들었습니다. 빠른 콘텐츠 생성이 검색 품질 격차를 노출했습니다. 검색 수정이 더 나은 배포를 원하게 만들었습니다. 더 나은 배포에 보호가 필요했습니다.
이것이 복리입니다. 각 개선이 단순히 가치를 더하는 것이 아니라 — 이전에 온 모든 것의 가치를 곱합니다. :)
그리고 이 모든 것의 공통 스레드는? 사이트의 모든 부분이 이제 프로그래밍적으로 읽고, 테스트하고, 수정할 수 있는 코드라는 것입니다. 그것이 진정한 핵심 발견입니다.
숫자로 보기
궁금하실 것을 알기에:
| 지표 | 값 |
|---|---|
| 마이그레이션 이후 일수 | 8 |
| 새 블로그 포스트 | 7 (이 글 포함) |
| 새로 배포된 기능 | 6 (뉴스레터, Turnstile ×2, RAG 평가, SEO 스택, PhotoGallery) |
| 업데이트된 블로그 포스트 | 12개 이상 (크로스링킹, 깨진 링크 수정) |
| 추가된 코드 줄 수 | ~5,600 |
| 추가된 데이터베이스 테이블 | 2 (subscribers, notification_log) |
| 추가된 API 엔드포인트 | 4 (subscribe, verify, unsubscribe, cron) |
| 비용 증가 | 월 $0 (모두 무료 플랜) |
다음 단계
아직 끝나지 않았습니다. 복리 효과는 멈추지 않았습니다:
- 더 많은 해외 거주자 가이드 — 세금 전략, 비자 타임라인, 은행 비교. 시리즈에 여력이 있습니다.
- Sydney 더 똑똑하게 — 이제 품질을 측정할 수 있으니, 적중률을 90% 이상으로 올리고 싶습니다.
- AI와 함께 만들기에 대한 더 깊은 분석 — 도구들이 매주 진화하고 있습니다. 진행하면서 기록하고 있습니다. (최신: Swift를 모르면서 네이티브 iOS 앱 만들기 그리고 AI가 60%까지 데려다주지만 — 나머지 40%가 제품이 실제로 존재하는 곳이라는 발견.)
하지만 솔직히? 저는 그냥 계속 글을 쓰는 것이 즐겁습니다. 17년간의 블로깅 역사에서 처음으로, 새 포스트를 발행하는 것이 진정으로 즐겁습니다 — 45분짜리 WordPress 작업이 아니라요. :D
마이그레이션이나 큰 기술적 결정 후에 이런 종류의 복리 효과를 경험한 적이 있으신가요? 궁금합니다 — 여러분을 놀라게 한 첫 번째 예상치 못한 발견은 무엇이었나요?
감사합니다,
Chandler
자주 묻는 질문
웹사이트 개발에서 복리 효과란 무엇인가요?
복리 효과는 사이트에 대한 각 개선이 다음 개선을 더 빠르고 쉽게 만드는 것입니다. 예를 들어, 코드 기반 스택으로 마이그레이션하면 AI 지원 콘텐츠 생성이 가능해지고, 이것이 검색 품질 문제를 드러내어 평가 프레임워크를 구축하게 됩니다. 각 단계가 이전 것 위에 쌓입니다.
AI 검색 엔진에 블로그 포스트를 최적화하는 방법은?
AI 검색 엔진은 명확한 제목과 간결한 섹션이 있는 구조화된 답변 우선 콘텐츠를 선호합니다. 핵심 기법에는: 처음 150단어 내 굵은 정의 문장, 질문 형식 H2 제목, 비교 표, 120-180단어 섹션, FAQ 스키마가 포함됩니다. 이러한 패턴은 AI 인용을 최대 340% 더 받습니다.
RAG 평가 프레임워크란 무엇인가요?
RAG 평가 프레임워크는 AI 어시스턴트가 관련 콘텐츠를 얼마나 잘 찾고 반환하는지 테스트합니다. 기대 결과 (정답)가 있는 사전 정의된 쿼리를 사용하고 적중률, 정밀도, 시간적 다양성 같은 지표를 측정합니다. 이를 통해 추측 대신 체계적으로 검색 설정을 최적화할 수 있습니다.
Beehiiv 대신 커스텀 뉴스레터 시스템을 만든 이유는?
커스텀 뉴스레터 시스템은 구독자 데이터, 관심사 기반 타겟팅, 기존 데이터베이스와의 통합에 대한 완전한 제어를 제공합니다. Supabase + Resend으로 구축하여 관심사 기반 구독, 자동 알림, 월 $0 호스팅을 얻었습니다 — 모두 Sydney의 검색 인덱스와 통합되어 있습니다.
Cloudflare Turnstile은 기존 CAPTCHA와 어떻게 다른가요?
Cloudflare Turnstile은 의심스러운 방문자에게만 챌린지를 보여주는 보이지 않는 봇 감지 시스템입니다. 모든 사용자에게 퍼즐을 풀게 하는 기존 CAPTCHA와 달리, Turnstile은 합법적인 사용자에게 조용히 실행됩니다. 사용자 경험을 방해하지 않고 브라우저 신호를 사용하여 봇을 감지합니다.
여전히 코딩하고, 여전히 배우고, 여전히 복리 이자가 성장하는 것을 지켜보고 있습니다.




