{ "schema_version": 2, "document": "API 재시도는 횟수가 아니라 부하 예산으로 설계한다", "citation_style": "hidden", "reader_document_contains_internal_source_ids": false, "sections": [ { "section_id": "01-problem-scene", "intent": "problem_scene", "title": "코드보다 먼저 드러난 문제", "reader_question": "독자가 공감할 수 있는 구체적인 상황에서 어떤 문제가 드러났는가?", "decision_requirements": [], "evidence": [ { "id": "S1", "title": "Timeouts, retries, and backoff with jitter", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S2", "title": "RFC 9110, HTTP Semantics — Idempotent Methods", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S3", "title": "Retry strategy", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://cloud.google.com/storage/docs/retry-strategy", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 } ], "evidence_gap": false }, { "section_id": "02-constraints", "intent": "constraints", "title": "문제를 어렵게 만든 제약", "reader_question": "단순한 해법을 막은 프로젝트 제약은 무엇이었는가?", "decision_requirements": [], "evidence": [ { "id": "S1", "title": "Timeouts, retries, and backoff with jitter", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S2", "title": "RFC 9110, HTTP Semantics — Idempotent Methods", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S3", "title": "Retry strategy", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://cloud.google.com/storage/docs/retry-strategy", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 } ], "evidence_gap": false }, { "section_id": "03-options", "intent": "options", "title": "검토한 선택지와 막힌 지점", "reader_question": "어떤 대안들을 검토했고 각각 어디에서 비용이 생겼는가?", "decision_requirements": [ "상황·제약", "선택", "선택 이유", "검토한 대안", "수용한 비용", "보완 가드레일" ], "evidence": [ { "id": "S1", "title": "Timeouts, retries, and backoff with jitter", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S2", "title": "RFC 9110, HTTP Semantics — Idempotent Methods", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S3", "title": "Retry strategy", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://cloud.google.com/storage/docs/retry-strategy", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 } ], "evidence_gap": false }, { "section_id": "04-decision-rationale", "intent": "decision_rationale", "title": "선택의 이유와 지킨 경계", "reader_question": "왜 이 선택을 했으며 무엇을 일부러 포기하거나 금지했는가?", "decision_requirements": [ "상황·제약", "선택", "선택 이유", "검토한 대안", "수용한 비용", "보완 가드레일" ], "evidence": [ { "id": "S1", "title": "Timeouts, retries, and backoff with jitter", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S2", "title": "RFC 9110, HTTP Semantics — Idempotent Methods", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S3", "title": "Retry strategy", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://cloud.google.com/storage/docs/retry-strategy", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 } ], "evidence_gap": false }, { "section_id": "05-mechanism", "intent": "mechanism", "title": "선택이 코드와 흐름에 반영되는 방식", "reader_question": "결정이 모듈, 인터페이스, 제어 흐름에 어떻게 반영되는가?", "decision_requirements": [], "evidence": [ { "id": "S1", "title": "Timeouts, retries, and backoff with jitter", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S2", "title": "RFC 9110, HTTP Semantics — Idempotent Methods", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S3", "title": "Retry strategy", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://cloud.google.com/storage/docs/retry-strategy", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 } ], "evidence_gap": false }, { "section_id": "06-evidence-verification", "intent": "evidence_verification", "title": "결정이 지켜지는지 확인하는 방법", "reader_question": "설명한 경계와 결과가 실제로 유지되는지 어떻게 확인하는가?", "decision_requirements": [], "evidence": [ { "id": "S1", "title": "Timeouts, retries, and backoff with jitter", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S2", "title": "RFC 9110, HTTP Semantics — Idempotent Methods", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S3", "title": "Retry strategy", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://cloud.google.com/storage/docs/retry-strategy", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 } ], "evidence_gap": false }, { "section_id": "07-tradeoffs", "intent": "tradeoffs", "title": "얻은 것, 잃은 것, 적용하지 않을 때", "reader_question": "이 선택의 비용과 한계는 무엇이며 언제 다른 선택이 나은가?", "decision_requirements": [ "상황·제약", "선택", "선택 이유", "검토한 대안", "수용한 비용", "보완 가드레일" ], "evidence": [ { "id": "S1", "title": "Timeouts, retries, and backoff with jitter", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S2", "title": "RFC 9110, HTTP Semantics — Idempotent Methods", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S3", "title": "Retry strategy", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://cloud.google.com/storage/docs/retry-strategy", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 } ], "evidence_gap": false }, { "section_id": "08-conclusion", "intent": "conclusion", "title": "결국 지키려던 것은 무엇이었나", "reader_question": "세부 기술을 걷어냈을 때 남는 판단은 무엇인가?", "decision_requirements": [], "evidence": [], "evidence_gap": false } ], "sources": [ { "id": "S1", "title": "Timeouts, retries, and backoff with jitter", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S2", "title": "RFC 9110, HTTP Semantics — Idempotent Methods", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://datatracker.ietf.org/doc/html/rfc9110#section-9.2.2", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 }, { "id": "S3", "title": "Retry strategy", "source_type": "external", "status": "", "path": "", "heading": "", "line_start": null, "line_end": null, "url": "https://cloud.google.com/storage/docs/retry-strategy", "accessed": "2026-07-23", "claim_ids": [], "decision_ids": [], "priority": 0.0 } ] }