API 명세를 도와주는 도구! 꼭 swagger가 아니더라도 팀단위로 개발을 진행할 때 반드시 필요한 도구라고 할 수있다! 어떻게 보면 기본적인 도구이다.
보통 API 명세라고 하면 백 엔드 프로그램과 프론트 엔드 프로그램 사이에서 정확히 어떠한 방식으로 데이터를 주고 받을 지에 대한 명세하는 것 을 의미한다.
이 때 api 명세 방법으로 스웨거를 이용하면 다음과 같은 이점이 있다.
+) Open API?
REST API를 위한 표준 API 명세 규격
최근에는 REST API로 많이 개발을 하는데, 전체 API 명세를 어떻게 하면 되는지 알려주고 있다.
swagger에서도 open api를 지원하고 있다.
Swagger를 이용하는 방식 두가지
나는 우리 프로젝트에서 2번 방법으로 swagger를 적용했다. 사실 첫번째 방법과 고민을 했었는데, 따로 관리를 하는게 코드가 깔끔할 것 같아서였다. 정답은 딱히 없는 것 같다. 하지만 앞으로나는 항상 이런식으로 할 것 같다.
자 그럼, 천천히 방법을 다시 정리해보자.
swagger 초기 세팅을 요약하자면 다음과 같다.
다음 명령으로 express 프로젝트에서 swagger를 실행하는 데 필요한 모듈을 깔아준다.
npm i swagger-cli swagger-ui-express
swagger-cli
의 기능은 간단히 말해 우리가 파일로 만든 api docs를 검증하고 하나의 파일로 합쳐주는 것이다. 자세한건 여기서 보자.
- Validate Swagger/OpenAPI files in JSON or YAML format
- Supports multi-file API definitions via $ref pointers:
$ref
를 이용해서 문서를 분리할 수 있게 해준다.- Bundle multiple Swagger/OpenAPI files into one combined file: 위처럼 분리된 파일들을 하나로 합쳐준다.
그리고 swagger-ui-express
는 우리가 작성한 yaml/json파일들을 읽어서 swagger-ui로 변환해 웹페이지에서 편하게 볼 수 있도록 해준다. 자세한건 여기
yaml파일은 이번에 CD 파이프라인을 만들면서 처음으로 다룬 형식인데, json으로 100% 호환이 가능하다. json보다 작성하기가 훨씬 쉽다. 가독성은 별로지만,,😫 자세한 문법은 다음 사이트에서 보면 좋을 것 같다. (나는 yaml syntex check extension을 따로 설치했는데 문법 틀리면 바로 error가 떠서 좋았다.)
swagger specification을 보면서하면 정말 쉽다! 한번 정독하고 나서 하면 시간이 얼마 안걸린다. 하다가 모르는 게 있으면 여기서 검색해보면 굳굳 👉🏻 here
내가 작성했던 api 명세서를 하나 가져왔다.
post:
summary: 로그인하여 토큰을 받습니다.
consumes:
- application/json
requestBody:
x-name: body
required: true
content:
application/json:
schema:
required:
- name
- socialId
- socialType
properties:
name:
type: string
socialId:
type: string
socialType:
type: string
email:
type: string
profileImageUrl:
type: string
responses:
200:
description: 요청 성공
content:
application/json:
schema:
type: object
properties:
status:
type: number
example: 200
data:
type: object
properties:
token:
type: string
isNewUser:
type: boolean
message:
type: string
example: 요청 성공
400:
$ref: '../openapi.yaml#/components/responses/BadRequest'
500:
$ref: '../openapi.yaml#/components/responses/InternalServerError'
진짜 왕왕 쉽고 편하다.
이렇게 작성하고 나면 스웨거가 어떻게 해주냐고?
우리는 서버에서 /api-docs
라는 uri로 요청을 보내면 swagger ui를 보내줄 것이다. 우리가 마지막으로 할일은 swaggerui모듈에게 이 요청을 처리하도록 맡기는 것!(라우팅)
// app.ts
app.use('/api-docs', swaggerUI.serve, swaggerUI.setup(swaggerSpec));
걍 서버 시작할 때 이렇게 라우팅 한 줄 추가해주면 된다. 그러면 우리가 작성했던 yaml을 읽어서 다음과 같은 ui를 제공해준다.
미쵸따.
우리가 매번 야믈파일을 합칠 때마다
npx swagger-cli bundle ./src/swagger/openapi.yaml --outfile build/swagger.yaml --type yaml
이걸 실행하려면 너무 번거로우니까 script에 명령어를 추가한다. 나는 다음과 같이 했다.
"api-docs": "swagger-cli bundle ./src/swagger/openapi.yaml --outfile build/swagger.yaml --type yaml"
우리는 이제 터미널에서 npm run api-docs 만 해주면 자동으로 우리가 작성해둔 야믈 파일들의 validation과 bundling이 진행되는 것이다.
그리고 나서 프로젝트를 실행시켜본다: npm run start
그럼 localhost:[포트번호]/api-docs
에서 우리가 작성한 api들의 명세서들을 swagger가 제공해주는 ui로 예쁘게 볼 수 있고, 바로 그 자리에서 요청을 보내 응답을 확인해볼 수도 있다.🥳
끄읏. 가영아 하다가 모르는 거 있으면 swagger specification 보면서 하렴