Spring boot로 제작한 프로젝트의 마무리 단계에서 swagger를 활용해 OpenAPI를 작성해 보려고 한다. OpenAPI에 대해 찾아보려니 헷갈리는 부분에 대해 명확히 짚고 넘어가고자 한다.
이 두 용어는 공백 한끗차이이다. 하지만 전혀 다른 뜻을 가지고 있으며 앞으로 설명할 때 OpenAPI는 OAS: OpenAPI Specification 라고 말하겠다.
OAS는 RESTful API 기반으로 정의된 규칙에 맞게 API spec을 json이나 yaml 방식으로 표현하는 용어이다. 직접 소스코드나 문서를 보지 않고 서비스를 이해할 수 있다는 장점이 있다.
Open API는 개방된 API로 누구나 사용할 수 있도록 API의 엔드포인트를 개방해둔 것으로 누구나 해당 API를 요청하여 데이터를 제공 받을 수 있다.

Swagger에 대해 찾아보면 version에 따라 부르는 이름들이 달라 헷갈린다. 왜그러냐하면 Swagger는 2010년대 초 Tam Wordink라는 사람이 Wordnik 기업 자체 API용 UI로 개발하였고 2015년 초에는 SmartBear라는 회사에서 Swagger를 인수하였다. 2015년 말에 OpenAPI Initiative에 Swagger를 기부하면서 OpenAPI Specification(OAS)로 이름이 변경되었다. 그래서 2.0을 표기할 때에는 "swagger": "2.0", 3.0을 표기할 때에는 "openapi": "3.0"이라고 한다. 즉, Swagger는 OAS를 작성하기 위한 하나의 tool이며 중간에 이러한 과정때문에 사람들이 많이들 혼용해서 사용하는 것 같다.
이제 계속해서 나오는 용어 API에 대해 자세히 알아보자. API는 Application Programming Interface로 다양한 애플리케이션과 서비스가 서로 소통하고 데이터를 교환하는 방식이다. 예를들면 프론트엔드 개발자와 백엔드 개발자가 서로 데이터를 주고 받을 때 사용하는 방식이 API이다. 특징으로는 다음과 같다.
개발을 시작하기에 앞서 프론트엔드 개발자와 백엔드 개발자가 어떤 식으로 데이터를 주고 받을지 고민해볼 것이다. 우선 API의 종류에 대해 찾아보고 해당 프로젝트에 어울리는 API를 선택하면 될 것 같다.
REST (Representational State Transfer)는 HTTP 프로토콜을 기반으로 한 웹 API 디자인 패턴이다.
GET /users/1 HTTP/1.1
Host: example.com
Content-Type: application/json{
"id": 1,
"name": "홍길동",
"email": "hong@example.com"
}SOAP (Simple Object Access Protocol)는 XML 기반의 프로토콜로, 주로 엔터프라이즈 시스템에서 사용된다.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<getUser>
<id>1</id>
</getUser>
</soapenv:Body>
</soapenv:Envelope><soapenv:Envelope>
<soapenv:Body>
<getUserResponse>
<name>홍길동</name>
<email>hong@example.com</email>
</getUserResponse>
</soapenv:Body>
</soapenv:Envelope>GraphQL은 Facebook에서 개발한 쿼리 언어로, 클라이언트가 원하는 데이터만 요청할 수 있는 유연한 API이다.
query {
user(id: 1) {
name
email
}
}{
"data": {
"user": {
"name": "홍길동",
"email": "hong@example.com"
}
}
}gRPC는 Google에서 개발한 고성능 원격 프로시저 호출(Remote Procedure Call) 프레임워크이다.
특징
예제 (gRPC 서비스 정의 및 요청)
syntax = "proto3";
service UserService {
rpc GetUser (UserRequest) returns (UserResponse);
}
message UserRequest {
int32 id = 1;
}
message UserResponse {
string name = 1;
string email = 2;
}
어떤 종류의 API를 사용할지 정했으면 프로젝트 구성원들과 함께 API 규칙을 정하여야 한다. 무작정 API 규칙을 정하는 것보다 각각의 API 설계 원칙에 고려하여 규칙을 작성하는 것이 현명한 판단이 될 것이다.
REST에는 여섯가지의 기본 원칙이 있으며, 이 원칙을 준수한 인터페이스는 RESTful 하다고 표현한다.
Response cache-control 헤더를 활용하여 해당 응답이 캐싱 가능한지 여부를 제공해야 한다.REST는 시스템 전체를 단순화하고 가시성을 개선하기 위해 4가지 인터페이스 규칙을 정의한다.
Identification of Resources (자원의 식별)
GET /users/1 (ID가 1인 사용자를 조회)Manipulation of Resources Through Representations (자원의 표현을 통한 조작)
PUT /users/1 요청 시 사용자 정보를 JSON 형식으로 제공하여 수정 가능하게 함.Self-Descriptive Messages (자체 설명적 메시지)
Content-Type 헤더를 활용하여 응답 데이터의 형식을 명확히 지정.Hypermedia as the Engine of Application State (HATEOAS, 하이퍼미디어 기반 상태 전이)
GET /users/1 응답에 해당 사용자의 프로필 수정 링크 포함.블로그 API에서 다룰 주요 리소스는 다음과 같다.
RESTful 원칙을 따르는 엔드포인트는 아래와 같이 정의된다.
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
GET | /posts | 모든 게시글 조회 |
GET | /posts/{id} | 특정 게시글 조회 |
POST | /posts | 새 게시글 작성 |
PUT | /posts/{id} | 게시글 수정 |
DELETE | /posts/{id} | 게시글 삭제 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
GET | /posts/{id}/comments | 특정 게시글의 모든 댓글 조회 |
POST | /posts/{id}/comments | 특정 게시글에 새 댓글 작성 |
PUT | /comments/{id} | 댓글 수정 |
DELETE | /comments/{id} | 댓글 삭제 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
GET | /users/{id} | 특정 사용자 정보 조회 |
POST | /users | 새 사용자 등록 |
PUT | /users/{id} | 사용자 정보 수정 |
GET | /users/{id}/posts | 특정 사용자의 모든 게시글 조회 |
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
GET | /categories | 모든 카테고리 조회 |
GET | /categories/{id}/posts | 특정 카테고리의 모든 게시글 조회 |
이러한 API 설계를 기반으로 블로그 서비스의 RESTful API를 구축할 수 있다.
Swagger로 OpenAPI를 작성하려다 보니 자연스럽게 REST API 설계까지 깊이 있게 공부하게 되었다. 결국 하나의 도구나 기술을 제대로 활용하려면 그에 필요한 배경 지식까지 폭넓게 이해해야 한다는 점을 다시금 깨달았다. 하지만 그만큼 API 설계를 더 확실하게 이해할 수 있었고, 왜 이렇게 설계해야 하는지에 대한 이유도 더욱 명확해졌다.
이번 학습을 통해 API에 대한 개념을 탄탄히 다질 수 있었고, 앞으로의 개발 과정에서도 더 체계적으로 API를 설계할 수 있을 것 같다.