API 문서 & 스펙
AI-first API 문서와 OpenAPI 활용
API 문서는 AI 에이전트가 가장 자주 참조하는 문서 유형 중 하나입니다. 코드 생성, 테스트 작성, 디버깅에서 API 스펙을 직접 활용합니다.
왜 API 문서가 AI 시대에 중요한가
AI 에이전트가 API를 호출하는 코드를 작성할 때, 정확한 엔드포인트·파라미터·응답 형식이 필요합니다. 구조화된 API 문서(OpenAPI)가 있으면 AI는 정확한 코드를 생성합니다. 산문형 설명만 있으면 AI는 추측하고, 잘못된 파라미터를 사용합니다.
AI-readable API 문서 원칙
- 스키마가 진실의 원천: OpenAPI/Swagger YAML이 산문 설명보다 정확
- 예제 우선: 모든 엔드포인트에 요청/응답 예제 필수
- 에러 케이스 명시: 성공 케이스만이 아니라 실패 시나리오와 에러 코드
- 인증 흐름 구조화: 인증 방식, 토큰 취득, 갱신 과정을 단계별로
Before/After
Before — 산문형 API 설명:
## 사용자 API
사용자를 생성하려면 POST 요청을 /api/users로 보내면 됩니다.
이름과 이메일이 필요하고, 이메일은 유효해야 합니다.
성공하면 201이 오고 실패하면 400이 옵니다.After — 구조화된 API 문서:
# POST /api/users
summary: 사용자 생성
authentication: Bearer token (required)
request:
body:
name: string (required, 2-50자)
email: string (required, 유효한 이메일)
role: "admin" | "user" (optional, default: "user")
responses:
201:
body: { id, name, email, role, createdAt }
400:
- INVALID_EMAIL: 이메일 형식 오류
- DUPLICATE_EMAIL: 이미 존재하는 이메일
- NAME_TOO_SHORT: 이름 2자 미만
401:
- UNAUTHORIZED: 토큰 없음 또는 만료
example:
request:
POST /api/users
Authorization: Bearer eyJ...
{ "name": "홍길동", "email": "hong@example.com" }
response:
201
{ "id": "usr_123", "name": "홍길동", "email": "hong@example.com", "role": "user" }템플릿: API 엔드포인트 문서
## [METHOD] [PATH]
**요약**: [한 줄 설명]
**인증**: [인증 방식] (required/optional)
**권한**: [필요한 역할/권한]
### 요청
| 파라미터 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
| [name] | body/query/path | [type] | [Y/N] | [설명] |
### 응답
**성공 (200/201)**
\`\`\`json
{
"field": "value"
}
\`\`\`
**에러**
| 코드 | 에러 | 설명 |
|---|---|---|
| 400 | INVALID_INPUT | [설명] |
| 401 | UNAUTHORIZED | [설명] |
| 404 | NOT_FOUND | [설명] |
### 예시
\`\`\`bash
curl -X [METHOD] https://api.example.com[PATH] \
-H "Authorization: Bearer $TOKEN" \
-d '{"field": "value"}'
\`\`\`OpenAPI 스펙 활용
AI 에이전트는 OpenAPI(Swagger) YAML을 직접 파싱해서 코드를 생성합니다. 마크다운 문서보다 OpenAPI 스펙이 AI에게 더 정확한 정보를 전달합니다.
openapi: 3.0.3
info:
title: Users API
version: 2.3.0
paths:
/api/users:
get:
summary: 사용자 목록 조회
parameters:
- name: page
in: query
schema: { type: integer, default: 1 }
- name: limit
in: query
schema: { type: integer, default: 20, maximum: 100 }
- name: role
in: query
schema: { type: string, enum: [admin, user] }
responses:
'200':
description: 성공
content:
application/json:
schema:
type: object
properties:
data:
type: array
items: { $ref: '#/components/schemas/User' }
pagination:
$ref: '#/components/schemas/Pagination'OpenAPI + 마크다운 병행
OpenAPI 스펙은 기계가 읽고, 마크다운 문서는 사람이 읽습니다. 둘을 함께 유지하되, OpenAPI를 진실의 원천으로 삼고 마크다운은 보충 설명으로 사용하세요.
복잡한 엔드포인트 문서화
실제 API는 단순 CRUD보다 복잡합니다. 페이지네이션, 필터링, 중첩 응답을 다루는 방법:
# GET /api/orders?status=pending&from=2026-01-01&page=2&limit=50
summary: 주문 목록 조회 (필터링 + 페이지네이션)
parameters:
- status: string (optional) — pending | confirmed | shipped | delivered
- from: date (optional) — 시작일 (ISO 8601)
- to: date (optional) — 종료일 (ISO 8601)
- page: integer (optional, default: 1)
- limit: integer (optional, default: 20, max: 100)
response (200):
data:
- id: "ord_456"
status: "pending"
customer: { id: "usr_123", name: "홍길동" } # 중첩 객체
items:
- product: { id: "prd_789", name: "키보드" }
quantity: 2
price: 89000
total: 178000
createdAt: "2026-03-20T10:30:00Z"
pagination:
page: 2
limit: 50
total: 347
hasNext: trueAPI 버전 관리
API 버전이 여러 개일 때 문서를 구조화하는 방법:
| 전략 | 구조 | 장점 | 단점 |
|---|---|---|---|
| URL 기반 | /v1/users, /v2/users | 명확, AI가 구분 쉬움 | 중복 문서 발생 |
| 헤더 기반 | Accept-Version: v2 | URL 깔끔 | AI가 놓치기 쉬움 |
권장: URL 기반 버전 + 차이점만 문서화
## v2 변경사항 (v1 대비)
| 엔드포인트 | 변경 | v1 | v2 |
|---|---|---|---|
| GET /users | 응답 필드 추가 | - | `lastLoginAt` 추가 |
| POST /users | 필수 필드 변경 | email만 필수 | email + name 필수 |
| DELETE /users/:id | 동작 변경 | 즉시 삭제 | soft delete (30일 보관) |인증 흐름 문서화
AI가 인증이 필요한 API를 호출할 때, 토큰 취득 과정을 단계별로 알아야 합니다.
## 인증
### 토큰 취득
POST /auth/login
Body: { "email": "...", "password": "..." }
Response: { "accessToken": "eyJ...", "refreshToken": "...", "expiresIn": 3600 }
### 토큰 사용
모든 API 요청에 헤더 포함:
Authorization: Bearer {accessToken}
### 토큰 갱신
POST /auth/refresh
Body: { "refreshToken": "..." }
Response: { "accessToken": "eyJ...", "expiresIn": 3600 }
### 에러
- 401 UNAUTHORIZED: 토큰 없음 또는 형식 오류
- 401 TOKEN_EXPIRED: 토큰 만료 → /auth/refresh 호출
- 403 FORBIDDEN: 권한 부족 (역할 확인)AI가 실패하는 패턴
| 실수 | AI가 실패하는 이유 | 수정 방법 |
|---|---|---|
| "적절한 인증 필요" | AI가 인증 방식을 추측함 | Bearer token / API key 명시 |
| 에러 코드 없이 "실패 시 에러 반환" | AI가 에러 처리 코드를 생략 | 구체적 에러 코드 + HTTP 상태 명시 |
| "응답은 JSON" | 필드명과 타입을 모름 | 전체 응답 스키마 + 예시 제공 |
| 파라미터 제약 없이 "숫자 입력" | 음수, 0, 매우 큰 수 처리 불가 | min/max/default 명시 |
AI 프롬프트 예시
다음 라우트 핸들러 코드를 분석해서 API 문서를 작성해줘.
포함할 내용:
1. 엔드포인트 요약 (METHOD, PATH, 인증, 한 줄 설명)
2. 요청 파라미터 표 (이름, 위치, 타입, 필수 여부, 설명)
3. 응답: 성공 + 에러 케이스 (코드, 에러명, 설명)
4. curl 예시
코드에서 직접 추출하고, 추측하지 마.체크리스트
| 항목 | 확인 |
|---|---|
| 모든 엔드포인트에 요청/응답 예제가 있는가 | ☐ |
| 에러 코드와 의미가 명시되어 있는가 | ☐ |
| 인증 방식이 명확히 설명되어 있는가 | ☐ |
| 파라미터 타입과 제약조건이 명시되어 있는가 | ☐ |
| OpenAPI 스키마와 문서가 동기화되어 있는가 | ☐ |
| curl/코드 예시가 실행 가능한가 | ☐ |