API(Application Programming Interface) 란,하나의 소프트웨어 응용 프로그램(Application) 이 다른 소프트웨어나 컴포넌트와 프로그래밍 방식(Programming) 으로 상호작용할 수 있도록 정의된 접점 또는 규칙(Interface) 의 집합.
API 소비자(Client) 와 제공자(Server) 사이에 어떻게 통신할지 명시적으로 정의한 약속 또는 규칙 집합 입니다. 요청 형식, 응답 구조, 허용 매서드, 오류 처리 방식 등을 포함하는 문서화된 계약입니다.
| 항목 | 설명 |
|---|---|
| Endpoint | 호출할 URL 및 리소스 경로 (/users/{id} 등) |
| HTTP Method | 허용된 요청 방식 (GET, POST, PUT, DELETE 등) |
| Request Schema | 요청 시 필요한 파라미터, 바디의 형식 및 필수 여부 |
| Response Schema | 응답의 구조, 필드, 데이터 타입, 예시 값 |
| Status Codes | 요청에 대한 결과 상태 (200, 400, 404, 500 등) |
| 에러 메시지 구조 | 오류 발생 시 표준화된 응답 포맷 (예: problem+json, custom JSON) |
| Authentication | 인증 방식 (JWT, OAuth2, API Key 등) |
시스템간 데이터 구조와 인터페이스를 명확하게 정의하는 중립적 기술 언어 ➡️ API가 어떤 요청 / 응답 구조를 가질지 컴퓨터가 이해 가능하게 명세
.proto ➡️ gRPC에서 사용)YAML/JSON)| 방식 | 설명 |
|---|---|
| Schema First | OpenAPI/GraphQL SDL 등에서 타입과 구조를 먼저 선언하고 API 개발 |
| Example First | 예시 요청/응답부터 작성 → 후속적으로 스키마를 추론하거나 문서화 |
발신자는 명확하게, 수신자는 유연하게 설계하라.

// 서버 응답
{
"id": 123,
"name": "Junha",
"nickname": "J"
}
| 이점 | 한계 |
|---|---|
| 상호운용성 향상 | 버그 은폐: 잘못된 입력도 수용되므로 버그가 감춰짐 |
| 낮은 중단 가능성 | 사양 혼란: 명확하지 않은 API 스펙이 생김 |
| 오래된 클라이언트 호환 | 보안 취약성 가능성 증가 |
현대 API 설계에서는 Postel's Law를 부분 수용합니다.
하지만,
스키마가 변경되더라도 직렬화/역직렬화가 실패하지 않도록 설계
메시지(데이터)의 필드가 추가/삭제/순서 바뀌어도 구버전 클라이언트가 무시하고 처리 가능
일반적으로 직렬화 포맷(Protocol Buffers, Thrift 등)이 제공
코드나 시스템 설계가 아닌, 데이터 포맷의 기능
이전 버전의 API 클라이언트가 새 버전 서버에서도 정상 동작해야함.
- Backwards Compatible API를 만들기 위해서는 내부적으로 version tolerant한 직렬화 포멧이 뒷받침되어야 함.
- version tolerant serialization이 있다고 해서 전체 API가 backwards-compatible 하다는 보장은 없음.
// Old version
message User {
string name = 1;
}
// New version
message User {
string name = 1;
string nickname = 2; // optional field
}
즉. “Version-tolerant serialization은 메시지 수준에서 필드 추가·삭제 등 스키마 변화에 유연하게 대처할 수 있는 기술입니다. 반면 Backward Compatibility는 전체 API 수준에서 이전 클라이언트가 여전히 정상 동작할 수 있도록 보장하는 설계 원칙입니다. 전자는 구현, 후자는 설계 철학이라 할 수 있습니다.”
오류 발생시에도 예측 가능한 공통 포멧으로 응답.
{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "User with ID 999 not found.",
"details": { "userId": 999 }
}
}
RFC 9457 (formerly 7807) – application/problem+json
에러 응답을 표준화하면 클라이언트의 오류 처리 코드를 단순화 할 수 있음.
컴포넌트간의 입력 전제조건, 출력 보장조건, 불변성을 계약처럼 정의하는 방식