
Win32와 POSIX API는 로컬 OS 자원 제어에 집중한 추상화였음.
당시 개발자의 주요 관심은 파일을 열고, 쓰레드를 만들고, GUI를 띄우는 일이었고, API 역시 내 컴퓨터 안에서 무엇을 어떻게 다룰것인가가 중심이었음.
프로그램이 CPU / 메모리 / 파일을 만지는 유일한 통신 창구인 OS API
앱이 머신마다 달라지는 세부 레지스터를 몰라도 되게끔 하기 위한 하드웨어 추상화가 목적이었음.
흐름상 실행 파일 ➡️ DLL/시스템 콜 ➡️ 커널로 동기 / 단일 프로세스 호출
네트워크 없이 동작하던 로컬 애플리케이션 시대.

이들을 하나의 흐름으로 통합하는 것이 필요함 (주문이 들어오면 물류·회계 시스템이 자동으로 감지하고 반응하는 등.)
<Envelope>
<Header>…</Header> <!-- 인증, 트랜잭션 등 메타정보 -->
<Body>…</Body> <!-- 실제 호출 내용 -->
</Envelope>
<portType name="OrderService">
<operation name="PlaceOrder">
<input message="tns:PlaceOrderRequest"/>
<output message="tns:PlaceOrderResponse"/>
</operation>
</portType>

| 장점 | 한계 |
|---|---|
| 언어/플랫폼 독립성 (XML 기반) | XML 문서가 크고 복잡함 → 성능 저하 |
| 계약 기반(Contract-first 개발 가능) | 툴 의존도 ↑, 학습 비용 ↑ |
| 확장 가능한 헤더 구조 (WS-Security 등) | “WS-*" 스펙들이 너무 방대하고 복잡 |
| 트랜잭션, 신뢰성, 보안 모두 대응 가능 | HTTP만 사용하지 않아서 방화벽 제약 발생 |
| IDE 지원 강력 (Java, .NET 등에서 자동 생성) | 브라우저/모바일 환경 부적합 |

2000년대 후반부터 본격적으로 시작되어, 오늘날까지 가장 널리 사용되는 API 설계 방식
배경
SOAP은 무겁고 복잡하며, XML만 지원하고 브라우저나 모바일에 비효율적
Ajax, JavaScript, iPhone 등으로 웹이 상호작용 중심으로 진화
기업뿐 아니라 개발자 커뮤니티·오픈 플랫폼 생태계가 성장함 ➡️ 단순하고 유연한 API 필요
REST(Representational State Transfer)
2000s, Roy Fielding의 논문에서 제시된 웹 아키텍쳐 스타일
REST는 웹의 기본 원칙을 기반으로 자원을 표현하고 상태를 전이하는 방식.
| 제약조건 | 설명 | 핵심 효과 |
|---|---|---|
| 1. 클라이언트-서버 구조 | 프론트엔드와 백엔드 명확히 분리 | UI와 처리 로직 분리 |
| 2. 무상태(Stateless) | 요청마다 모든 정보 포함 | 수평 확장 용이 |
| 3. 캐시 처리 가능(Cacheable) | 응답에 캐시 여부 명시 | 성능 최적화 |
| 4. 계층화된 시스템 | 중간 서버 (게이트웨이, CDN 등) 가능 | 보안, 확장성 향상 |
| 5. 일관된 인터페이스 | 통합된 방식으로 리소스 접근 | REST의 핵심 |
| 6. 코드 온 디맨드 (선택적) | JS 등 실행 코드 전송 가능 | 유연성 (거의 사용 안함) |
| 요소 | 예시 | 설명 |
|---|---|---|
| URI | /users/123 | 리소스 식별 (명사형) |
| HTTP Method | GET / POST / PUT / DELETE | CRUD 동작 정의 |
| Status Code | 200, 201, 204, 400, 404, 500 등 | 처리 결과 명시 |
| Representation | JSON / XML 등 | 리소스의 형태 |
| Header | Content-Type, Authorization 등 | 메타 정보 전달 |
| Query Parameter | ?sort=desc&page=2 | 리소스 필터링, 페이지네이션 |
| 장점 | 설명 |
|---|---|
| 단순함 | HTTP만 이해하면 누구나 설계·사용 가능 |
| URL 직관성 | 자원 중심 구조로 이해 쉬움 |
| 캐시 및 CDN 활용 용이 | HTTP 인프라 자원 그대로 활용 |
| 프론트엔드 친화적 | JSON 사용 → JS 연동 쉬움 |
| 툴링 생태계 풍부 | Swagger/OpenAPI, Postman 등 도구 발달 |
| 한계 | 설명 | 대응 |
|---|---|---|
| 과다 / 과소 페이로드 | 필요한 데이터만 받기 어려움 | GraphQL 등장 |
| 버전 관리 혼란 | URI or Header 등 다양한 방식 → 일관성 없음 | 명확한 정책 필요 |
| 상태 관리 어려움 | Stateless 구조로 복잡한 워크플로우 불리함 | Token · 상태 저장 서버 도입 |
| 표현력 한계 | 복잡한 쿼리 구조 어려움 | OData, GraphQL, 필터 DSL 등으로 보완 |
REST 🆚 RESTful
RESTful : REST아키텍처 스타일의 제약조건을 잘 지켜서 설계된 API를 의미함.
| 비교 항목 | REST | RESTful |
|---|---|---|
| 정체성 | 아키텍처 스타일 (이론적) | 이를 따른 구체적인 API 구현 (실천적) |
| 출처 | 2000년 Roy Fielding의 박사논문 | REST 개념을 적용한 웹 API 설계 방식 |
| 적용 범위 | HTTP에 국한되지 않음 (HTTP는 구현 방식 중 하나) | 대부분 HTTP 기반 API로 구현 |
| 사용 맥락 | “REST 기반이다”는 이론적 설명 | “RESTful하게 만들었다”는 설계의 적합성 평가 |

| 특징 | 설명 |
|---|---|
| 단일 엔드포인트 | /graphql 하나로 모든 데이터 접근 |
| 쿼리 기반 요청 | 클라이언트가 필요한 필드만 선택 |
| 타입 시스템 내장 | schema로 API의 타입과 구조 정의 (SDL) |
| 계층적 요청 | 한 번의 쿼리로 관계형 데이터를 계층적으로 요청 가능 |
| 실시간 처리 | Subscription으로 웹소켓 기반 실시간 처리 가능 |
장단점
보완

배경
| 특징 | 설명 |
|---|---|
| IDL 기반 개발 | .proto 파일로 서비스 및 메시지 정의 |
| 바이너리 직렬화 | JSON보다 5~10배 작고 빠른 Protobuf 사용 |
| HTTP/2 기반 | 멀티플렉싱, 스트리밍, 헤더 압축 가능 |
| 양방향 스트리밍 지원 | 실시간 처리에 유리 (서버↔클라이언트 쌍방) |
| 자동 코드 생성 | 언어별 Stub/Client 자동 생성 |