OAS(OpenAPI Specification)
소프트웨어 마에스트로 14기 팀 프로젝트에서 나는 백엔드 파트를 담당하여 Spring Boot를 통한 API 서버 개발을 하게 되었다. 이를 위해 학습 차 게시글을 작성하게 되었다.
정의
RESTful API를 기정의된 규칙에 맞게 API spec을 json
혹은 yaml
로 표현하는 방식을 의미한다. 직접 소스코드나 문서를 보지 않고 서비스를 이해할 수 있다는 장점이 있다. 한 문장으로 정리하면, RESTful API 디자인에 대한 정의(Specification) 표준이다.
예전에는 Swagger 2.0과 같은 이름으로 불렸다가 현재는 3.0 버전으로 올라오면서 OpenAPI 3.0 Specification으로 칭한다.
OpenAPI & Swagger
- OpenAPI : 이전 Swagger Specification으로 알려진 Specification 자체 (RESTful API 디자인에 대한 정의)
- Swagger : OpenAPI를 Implement하기 위한 도구 (SmartBear사의 tool)
구조
2015년 Swagger Specification을 OpenAPI Initiative에 기부하면서 OpenAPI Specification(OAS)로 명칭이 바뀌었고, 그 이후 첫번째 major release가 OAS3.0이라고 한다.
Version
# 2.0
"swagger": "2.0"
# 3.0
"openapi": "3.0.0"
Multiple Servers
# 2.0
"host": "petstore.swagger.io",
"basePath": "/v1",
"schemes": [
"http"
]
# 3.0
"servers": [
{
"url": "https://{username}.gigantic-server.com:{port}/{basePath}",
"description": "The production API server",
"variables": {
"username": {
"default": "demo",
"description": "this value is assigned by the service provider, in this example `gigantic-server.com`"
},
"port": {
"enum": [
"8443",
"443"
],
"default": "8443"
},
"basePath": {
"default": "v2"
}
}
}
]
2.0에서는 API Endpoint URL을 3가지(host, basePath, schemes)로 정의하였고, 이때문에 하나의 endpoint URL만 정의할 수 있었다. 하지만 3.0에서는 멀티 URL을 지원하게 되면서, 각 URL마다 username, port, basepath를 variables 필드에 가지고 있을 수 있게 되었다.
Components
# 2.0
paths:
/users/{userId}:
get:
summary: Get a user by ID
parameters: ...
responses:
"200":
description: A single user.
content:
application/json:
schema:
type: object
properties:
id:
type: integer
name:
type: string
/users:
get:
summary: Get all users
responses:
"200":
description: A list of users.
content:
application/json:
schema:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
# 3.0
paths:
/users/{userId}:
get:
summary: Get a user by ID
parameters:
...
responses:
'200':
description: A single user.
content:
application/json:
schema:
$ref: '#/components/schemas/User'
/users:
get:
summary: Get all users
responses:
'200':
description: A list of users.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
components:
schemas:
User:
type: object
properties:
id:
type: integer
name:
type: string
이전 2.0에서는 일부 중복되는 부분이 있어도 그대로 쓸 수 밖에 없었다면,(각 path의 schema 아래부분) 3.0에서는 중복되는 부분을 components로 빼고 path에서는 참조할 수 있게 되었다.