Conversation
빌드가 Notion API 429로 실패하거나(실제로 #54 프로덕션 배포가 이걸로 실패), 조용히 본문 없는 글을 배포할 수 있는 구조였다. 실패가 세 갈래로 번졌다. 1) getPageContent가 예외를 삼키고 excerpt로 대체 — 본문이 사라진 채 빌드가 성공해 그대로 배포된다 2) queryDatabase가 429에 그대로 실패 — 빌드 전체가 중단된다 3) getBlogPostMeta/BySlug가 모든 예외를 null로 — layout이 이를 '글 없음'으로 읽어 멀쩡한 글이 404로 굳는다 - client.ts: 요청을 한 줄로 세워 최소 간격(기본 350ms)을 둔다. SDK에 커스텀 fetch를 주입해 notion-to-md의 블록 요청까지 같은 게이트를 지나게 했다 — 호출부만 감싸면 실제 트래픽 대부분이 새어 나간다 - client.ts: 429·5xx에 지수 백오프 재시도(최대 8회), Notion이 알려주는 retry_after를 우선 존중. 4xx는 즉시 전파 - pageToMarkdown을 client.ts로 옮겨 블로그·프로젝트가 함께 쓴다 - blog.ts: object_not_found/404만 null, 나머지는 전파. 슬러그 조회는 Slug 속성 부재(400)일 때만 null - projects.ts도 같은 경로를 타게 정리 검증: 재시도 정책 6케이스(429 복구·retry_after 존중·5xx·4xx 즉시 전파· 한도 소진 시 전파·SDK 에러 형태) 통과. 연속 빌드 3회 모두 성공(이전엔 3회차에 실패), 2회차는 48번 재시도로 자력 복구. 생성된 글 42개 전부 30KB 이상으로 본문 유실 없음. 404/308/200 상태 코드 회귀 없음. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VMaC7hvbuyHaPbCatSjvqK
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
문제
빌드가 Notion API 429로 실패하거나, 더 나쁘게는 조용히 본문 없는 글을 배포할 수 있는 구조였습니다. 실제로 PR #54의 프로덕션 배포가 이것 때문에 실패해서 포트폴리오 변경이 반영되지 않았습니다.
실패가 세 갈래로 번집니다.
getPageContentexcerpt로 대체queryDatabasegetBlogPostMeta/BySlugnull세 번째는 PR #52에서 상태 코드를 고치면서 생긴 경로입니다. 일시적 장애가 정적 빌드에 404로 박제됩니다.
원인
Notion 공개 API는 통합당 초당 평균 3요청입니다. PR #50에서 42개 글을 빌드 타임에 프리렌더하도록 바꾸면서, 글 하나가 블록 요청을 여러 번 보내는 것까지 겹쳐 수백 개 요청이 한꺼번에 나가게 됐습니다.
변경 사항
요청 간격 조절 — 요청을 한 줄로 세워 최소 간격(기본 350ms,
NOTION_MIN_REQUEST_GAP_MS로 조정)을 둡니다. 중요한 건 SDK에 커스텀fetch를 주입한 점입니다.notion-to-md는 페이지 하나에 블록 요청을 여러 번 보내는데, 호출부만 감싸면 실제 트래픽의 대부분이 게이트를 새어 나갑니다.재시도 — 429·5xx에 지수 백오프(최대 8회), Notion이 응답에 실어 주는
retry_after를 우선 존중합니다. 4xx는 재시도해도 소용없으므로 즉시 전파합니다.실패와 부재의 구분 —
object_not_found/404만null로 보고 나머지는 전파합니다. 슬러그 조회는 "DB에 Slug 속성이 없음"(400)일 때만null입니다. 한도 초과가 '글 없음'이 되지 않습니다.구조 정리 —
pageToMarkdown을client.ts로 옮겨 블로그와 프로젝트가 같은 경로를 타게 했습니다.projects.ts의 중복 변환·예외 삼킴도 제거했습니다.검증
재시도 정책 6케이스 — 429 복구,
retry_after존중, 5xx 재시도, 4xx 즉시 전파, 한도 소진 시 전파(삼키지 않음), SDK 에러 형태 인식. 전부 통과.연속 빌드 3회 모두 성공 (수정 전에는 3회차에 실패):
본문 유실 없음 — 생성된 42개 글 전부 30KB 이상, 표본의 본문 문단도 정상.
회귀 없음 — 구 UUID 308, 없는 글 404, 없는 UUID 404, 정상 글 200, 주요 라우트 전부 200.
트레이드오프
정적 생성이 9초에서 33초로 늘었습니다. 간격을 두는 대가이고, 빌드는 자주 돌지 않으므로 조용한 본문 유실이나 배포 실패보다 낫다고 판단했습니다. 더 빠르게 하려면
NOTION_MIN_REQUEST_GAP_MS를 낮추면 되고, 그만큼 재시도 빈도가 올라갑니다.🤖 Generated with Claude Code
https://claude.ai/code/session_01VMaC7hvbuyHaPbCatSjvqK