API 설계 템플릿
REST API 명세서를 작성하는 표준 템플릿입니다.
개요
API 명세서는 프론트엔드 개발자와 백엔드 개발자 간의 커뮤니케이션 도구이자, 나중에 API를 유지보수할 때를 위한 문서입니다. 표준 형식을 사용하면 일관성을 유지할 수 있습니다.
학습 목표
- API 명세서 표준 구조 이해하기
- OpenAPI/Swagger 형식으로 문서화하기
- Controller 코드에서 명세서 자동 생성하기
- Claude로 API 문서 작성 자동화하기
템플릿 구조
전체 템플릿
---
title: ""
version: ""
baseUrl: ""
---
# API
## 개요
### 설명
### 관련 문서
- [[요구사항/기획서]]
- [[DB/스키마]]
---
## Endpoints
### 1.
` /api/`
#### 설명
#### Request Headers
```http
Content-Type: application/json
Authorization: Bearer
Path Parameters
| 파라미터 | 타입 | 필수 | 설명 | |———-|——|——|——| | | | Yes | | | | | No | |
Query Parameters
| 파라미터 | 타입 | 필수 | 설명 | |———-|——|——|——| | | | Yes | | | | | No | |
Request Body
{
"field1": "value1",
"field2": "value2"
}
Response
Success 200 OK
{
"code": 200,
"message": "성공",
"data":
}
Error 400 Bad Request
{
"code": 400,
"message": "잘못된 요청",
"errors": [
{
"field": "email",
"message": "이메일 형식이 올바르지 않습니다"
}
]
}
Error 401 Unauthorized
{
"code": 401,
"message": "인증이 필요합니다"
}
Error 404 Not Found
{
"code": 404,
"message": "리소스를 찾을 수 없습니다"
}
Error 500 Internal Server Error
{
"code": 500,
"message": "서버 오류가 발생했습니다"
}
Example
curl -X 'https://api.example.com/api/' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ' \
-d '{
"field1": "value1",
"field2": "value2"
}'
공통 응답 형식
성공 응답
{
"code": 200,
"message": "성공",
"data":
}
실패 응답
{
"code": ,
"message": "",
"errors":
}
에러 코드
| 코드 | 메시지 | 설명 |
|---|---|---|
| 400 | Bad Request | 잘못된 요청 |
| 401 | Unauthorized | 인증 필요 |
| 403 | Forbidden | 권한 부족 |
| 404 | Not Found | 리소스 없음 |
| 409 | Conflict | 리소스 충돌 |
| 422 | Unprocessable Entity | 검증 실패 |
| 429 | Too Many Requests | 요청 초과 |
| 500 | Internal Server Error | 서버 오류 |
| 503 | Service Unavailable | 서비스 불가 |
변경 이력
| 버전 | 날짜 | 변경 내용 | 작성자 | |——|——|———-|——–| | 1.0.0 | | 초기 버전 | |
---
## 각 섹션 상세 설명
### 1. Endpoint 명세
가장 중요한 섹션입니다. 각 엔드포인트마다 다음 정보를 포함합니다:
```markdown
### 사용자 조회
`GET /api/users/{id}`
#### 설명
ID로 사용자 정보를 조회합니다.
#### Request Headers
```http
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Path Parameters
| 파라미터 | 타입 | 필수 | 설명 | |———-|——|——|——| | id | Long | Yes | 사용자 ID |
Query Parameters
| 파라미터 | 타입 | 필수 | 설명 | |———-|——|——|——| | fields | String | No | 반환할 필드 (쉼표로 구분) |
Response
Success 200 OK
{
"code": 200,
"message": "성공",
"data": {
"id": 1,
"email": "user@example.com",
"name": "홍길동",
"createdAt": "2026-01-10T10:00:00"
}
}
Error 404 Not Found
{
"code": 404,
"message": "사용자를 찾을 수 없습니다"
}
### 2. 검증 규칙
Request Body의 각 필드에 대한 검증 규칙을 명시합니다:
```markdown
#### Request Body 검증
| 필드 | 타입 | 필수 | 제약조건 | 설명 |
|------|------|------|----------|------|
| email | String | Yes | 이메일 형식, 최대 255자 | 이메일 주소 |
| password | String | Yes | 최소 8자, 영문+숫자+특수문자 | 비밀번호 |
| name | String | Yes | 최소 2자, 최대 50자 | 이름 |
| age | Integer | No | 0 이상, 150 이하 | 나이 |
#### 검증 오류 응답
```json
{
"code": 422,
"message": "검증에 실패했습니다",
"errors": [
{
"field": "email",
"message": "이메일 형식이 올바르지 않습니다"
},
{
"field": "password",
"message": "비밀번호는 최소 8자 이상이어야 합니다"
}
]
}
---
## Claude로 API 문서 작성
### 1. Controller 코드에서 명세서 생성
```markdown
사용자:
"이 Spring Boot Controller 코드를
API 명세서로 변환해줘.
Templates/api-spec 템플릿을 사용해서"
[Controller 코드 붙여넣기]
Claude:
## 분석 완료
Controller: UserController.kt
엔드포인트: 5개
생성된 API 명세서:
- 경로: API/user-api.md
- 내용: 각 엔드포인트별 Request/Response 명세
미리보기:
### 사용자 생성
`POST /api/users`
Request Body:
{
"email": "user@example.com",
"password": "Password123!",
"name": "홍길동"
}
Response 201:
{
"code": 201,
"message": "사용자가 생성되었습니다",
"data": {
"id": 1,
"email": "user@example.com",
"name": "홍길동"
}
}
2. 기존 명세서 업데이트
사용자:
"기존 API 명세서에 새로운 엔드포인트를 추가해줘.
엔드포인트: DELETE /api/users/{id}
설명: 사용자 삭제
Response: 204 No Content"
Claude:
업데이트 완료:
- API/user-api.md에 새 엔드포인트 추가
- 에러 코드 섹션에 204 응답 추가
- 예제 cURL 명령어 추가
3. Swagger/OpenAPI 변환
사용자:
"이 API 명세서를 OpenAPI 3.0 YAML로 변환해줘"
Claude:
openapi: 3.0.0
info:
title: User API
version: 1.0.0
paths:
/api/users:
post:
summary: 사용자 생성
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUserRequest'
responses:
'201':
description: 생성 성공
---
## 실전 예시
### Before: 템플릿 없음
```markdown
# 사용자 API
POST /users
이름, 이메일 받아서 생성
GET /users/{id}
ID로 조회
PUT /users/{id}
수정
DELETE /users/{id}
삭제
문제점
- Request/Response 형식 없음
- 에러 처리 방법 없음
- 검증 규칙 없음
- 실제 사용 불가능
After: 템플릿 적용
---
title: "사용자 API"
version: "1.0.0"
baseUrl: "https://api.example.com"
---
# 사용자 API
## 개요
사용자 관리를 위한 REST API입니다. 사용자 생성, 조회, 수정, 삭제 기능을 제공합니다.
---
## Endpoints
### 1. 사용자 생성
`POST /api/users`
#### 설명
새로운 사용자를 생성합니다.
#### Request Body
```json
{
"email": "user@example.com",
"password": "Password123!",
"name": "홍길동",
"age": 30
}
Request Body 검증
| 필드 | 타입 | 필수 | 제약조건 | 설명 | |——|——|——|———-|——| | email | String | Yes | 이메일 형식, 중복 불가 | 이메일 주소 | | password | String | Yes | 최소 8자, 영문+숫자+특수문자 | 비밀번호 | | name | String | Yes | 2-50자 | 이름 | | age | Integer | No | 0-150 | 나이 |
Response
Success 201 Created
{
"code": 201,
"message": "사용자가 생성되었습니다",
"data": {
"id": 1,
"email": "user@example.com",
"name": "홍길동",
"age": 30,
"createdAt": "2026-01-10T10:00:00"
}
}
Error 409 Conflict
{
"code": 409,
"message": "이미 존재하는 이메일입니다"
}
Error 422 Unprocessable Entity
{
"code": 422,
"message": "검증에 실패했습니다",
"errors": [
{
"field": "email",
"message": "이메일 형식이 올바르지 않습니다"
}
]
}
Example
curl -X POST 'https://api.example.com/api/users' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"password": "Password123!",
"name": "홍길동",
"age": 30
}'
공통 응답 형식
성공 응답
{
"code": 200,
"message": "성공",
"data":
}
실패 응답
{
"code": ,
"message": "",
"errors":
}
에러 코드
| 코드 | 메시지 | 설명 | |——|——–|——| | 400 | Bad Request | 잘못된 요청 | | 401 | Unauthorized | 인증 필요 | | 404 | Not Found | 리소스 없음 | | 409 | Conflict | 리소스 충돌 (이메일 중복 등) | | 422 | Unprocessable Entity | 검증 실패 | | 500 | Internal Server Error | 서버 오류 |
---
## 모범 사례
### 1. 명확한 URL 설계
❌ **나쁜 예**
```markdown
GET /getUser
POST /createUser
PUT /updateUser
✅ 좋은 예
GET /api/users
POST /api/users
PUT /api/users/{id}
2. HTTP 메서드 올바른 사용
| 메서드 | 용도 | 멱등성 |
|---|---|---|
| GET | 조회 | Yes |
| POST | 생성 | No |
| PUT | 전체 수정 | Yes |
| PATCH | 부분 수정 | No |
| DELETE | 삭제 | Yes |
3. 상태 코드 올바른 사용
# 성공
200 OK: 조회/수정 성공
201 Created: 생성 성공
204 No Content: 삭제 성공 (본문 없음)
# 클라이언트 오류
400 Bad Request: 잘못된 요청
401 Unauthorized: 인증 필요
403 Forbidden: 권한 부족
404 Not Found: 리소스 없음
409 Conflict: 리소스 충돌
422 Unprocessable Entity: 검증 실패
# 서버 오류
500 Internal Server Error: 서버 오류
503 Service Unavailable: 서비스 점검 중
4. 일관된 응답 형식
// 모든 API에서 동일한 구조 사용
{
"code": 200,
"message": "성공",
"data": { ... },
"timestamp": "2026-01-10T10:00:00"
}
검색 팁
Dataview 쿼리
# 모든 API 문서
TABLE version, baseUrl
FROM #api
SORT file.ctime DESC
# 특정 서비스의 API
LIST
FROM #api
WHERE contains(tags, "user-service")
실습 과제
- 본인이 만든 Controller의 API 명세서 작성
- Claude에게 코드에서 명세서 생성 요청
- Swagger/OpenAPI로 변환
- Postman이나 curl로 테스트
- 팀원에게 리뷰 요청
참고 자료
다음 단계
API 명세를 작성했으면, 이제 시스템을 설계해봅시다.
| → [[15-template-design | 시스템 설계 템플릿]] |