안녕하세요 오늘은 BESPIN GLOBAL Data실 이언하님이 작성해주신 ‘OpenAPI 3.0 스펙 작성 가이드’ 에 대해 소개해드리도록 하겠습니다.
목차
- OpenAPI 3.0 스펙 작성 가이드
- 가이드라인
- Security First
- Schemas
- Examples
- 명명 규칙
- 개체 정의는 Body 요소 선언에서 피해야 한다.
- 암시적 개체 정의가 수집 선언에서 사용될 때 본문 요소의 선언에서 피해야 한다.
- OpenAPI Generator Usage
- 참고 자료
1. OpenAPI 3.0 스펙 작성 가이드
- OpenAPI 3.0 스펙은 매우 느슨한 스펙으로 설계자에게 스펙 작성을 위한 많은 옵션을 제공합니다.
- 대부분의 경우 개발자가 주석을 사용하여 코드를 작성하고 이후에 스펙을 생성합니다.
- 엔터프라이즈 스케일을 염두해 두고 설계 우선 접근을 권장합니다.
- 결과물는 단순한 문서가 아니라 새 프로젝트를 스캐폴드하는 데 사용할 수 있고 런타임 중에 로드되어 JWT 보안 범위를 확인하고
- 공격으로부터 비즈니스 계층을 보호하기 위한 요청을 검증하는 데 사용할 수 있는 스펙입니다.
- MSA는 큰 서비스를 기능 및 모델에 따라 작은 단위로 쪼개어 개발/운영하는 아키텍처입니다.
- MSA 환경에서는 수많은 API가 생성될 것이며, API가 잘 정의되어 있지 않다면,
- 서비스 개발 및 운영에 큰 이슈가 발생할 수 있습니다.
2.가이드라인
- 설계자, 분석가, 개발자가 명확하고 쉽게 읽을 수 있어야 한다.
- 설명 태그에 설명이 제공되어 잘 문서화되어 있어야 한다.
- OpenAPI 스펙(이 글을 쓰는 시점의 v3.0)을 준수해야 한다.
- 깨끗하고 쉽게 사용할 수 있는 개체 모델에 적합한 디자인을 사용해야 한다.
3. Security First
- API 디자이너는 기능에 중점을 두고 나중에 보안을 추가하는 경우가 많습니다.
- 설계 중에 모든 엔드포인트에 대해 보안이 고려되도록 보안 우선 접근 방식을 따르는 것이 좋습니다.
- 새 스펙을 작성하기 전에 기존 스펙에서 복사할 수 있습니다.
- Petstore 는 좋은 출발점입니다. model-config 저장소에는 디자인 스타일을 학습하는 데 도움이 되는 다른 OpenAPI 스펙도 있습니다 .
- Petstore 스펙 내에서 구성 요소 아래에 보안을 정의하는 다음 블록을 찾을 수 있습니다.
- 이 섹션은 스펙에서 선택 사항이지만 여기서는 필수 사항입니다.
components:
securitySchemes:
petstore_auth:
type: oauth2
description: This API uses OAuth 2 with the client credential grant flow.
flows:
clientCredentials:
tokenUrl: 'https://localhost:6882/token'
scopes:
'write:pets': modify pets in your account
'read:pets': read your pets
- securitySchemes가 정의되면 각 엔드포인트에 대한 보안 범위를 지정할 수 있습니다.
- 새 엔드포인트를 추가할 때 질문을 할 수 있습니다.
- 새 범위를 만들어야 합니까 아니면 securitySchemes에 정의된 범위에서 기존 범위를 하나 이상 선택해야 합니까?
- 보안 정의가 포함된 엔드포인트/작업 정의는 다음과 같습니다.
'/pets/{petId}':
get:
summary: Info for a specific pet
operationId: showPetById
tags:
- pets
parameters:
- name: petId
in: path
required: true
description: The id of the pet to retrieve
schema:
type: string
security:
- petstore_auth:
- 'read:pets'
responses:
'200':
description: Expected response to a valid request
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
example:
id: 1
name: Jessica Right
tag: pet
- 위의 설계는 Spring 프레임워크가 JWT 토큰의 범위를 실행 시 각 엔드포인트에 대해 정의된 스코프와 비교하도록 보장합니다.
- 이는 소비자에게 엔드포인트에 따라 권한을 부여할 수 있는 유연성을 제공합니다.
4. Schemas
- 스펙에 모델은 각 엔드포인트에 대한 요청/응답 본문을 정의합니다.
- 모델을 정의하는 데에는 두 가지 위치가 있습니다.
- 각 엔드포인트에서 평탄화/산란화되거나 구성 요소에서 스키마로 추출됩니다.
- 각 엔드포인트에 모델 정의가 분산되어 있을 때 이름이 없고 여러 엔드포인트에서 동일한 모델이 중복될 수 있습니다.
- 최초 생성 시에서 body0, body1, body2 등의 이름을 가진 일부 클래스를 생성하는 것은 말이 되지 않기 때문에 POJO 클래스를 생성하지 않습니다.
- body0는 get request, body2는 put request일 가능성이 있습니다.
- 둘 다 동일한 속성 집합을 다루고 있으므로 동일합니다.
- get 핸들러에서는 body0를 사용해야 하지만 put 핸들러에서는 body2를 사용해야 한다는 것을 개발자가 어떻게 기억할까요?
- 두 클래스가 클래스 이름을 제외하고 필드와 메서드가 다르다는 것을 알면 충격을 받을 것입니다.
- 적절한 이름을 가진 POJO 클래스를 생성하고 중복을 방지하려면, 공통 데이터 개체를 구성 요소 아래의 스키마 섹션으로 추출하는 것이 좋습니다.
- Petstore 스펙의 예시가 있습니다.
schemas:
Pet:
required:
- id
- name
properties:
id:
type: integer
format: int64
name:
type: string
tag:
type: string
- 위의 Pet 정의는 OpenAPI Generator에서 Pet이라는 자바 클래스를 생성하는데 사용됩니다.
- Pet을 정의하면 스키마 정의를 위해 각 포인트에 $ref를 넣을 수 있습니다.
- 여기 Pet 스키마 정의를 활용한 응답 예가 있습니다.
responses: '200':
description: Expected response to a valid request
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
examples:
response:
value:
id: 1
name: Jessica Right
tag: pet
- 여기 배열을 사용한 다른 응답 예가 있습니다.
- 두 엔드포인트 모두 동일한 Pet 스키마를 공유하고 있으며 생성된 코드에서 해당 핸들러는 Pet이라는 동일한 POJO 클래스를 공유합니다.
responses: '200':
description: An paged array of pets
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Pet'
example:
- id: 1
name: catten
tag: cat
- id: 2
name: doggy
tag: dog
5. Examples
- OpenAPI 스펙은 각 엔드포인트에 대한 예제 응답을 정의할 수 있는 기회를 제공하여, API 소비자가 엔드포인트에 액세스할 때 예상되는 내용을 쉽게 이해할 수 있도록 합니다.
- 또한 OpenAPI Generator에서 사양에 정의된 예제를 기반으로 모의 응답을 생성할 수 있는 기능이 있습니다.
- 예제를 정의한 후 생성된 프로젝트는 공급자가 API 구현을 완료할 때까지 기다리지 않고 소비자가 즉시 작업을 시작할 수 있도록 모의 응답으로 구축 및 시작할 수 있습니다.
- 이 주제에 대한 자세한 내용은 OpenAPI 3.0 Mock을 참조하시기 바랍니다.
6. 명명 규칙
- 스키마 이름은 Java 클래스 이름으로 변환되므로 Java의 명명 규칙을 따르는 것이 좋습니다.
- 요소는 항상 대문자로 시작해야 하며, 항상 대문자로 시작하는 생성된 코드의 클래스 정의를 존중해야 합니다.
properties: error:
$ref: 'org/APPERR0001/1.0.1/errors.yaml#/error'
...
vs
...
properties:
error:
$ref: 'org/APPERR0001/1.0.1/errors.yaml#/Error'
- 요소는 밑줄, @ 기호 또는 기타를 사용하지 않아야 합니다. OpenAPI 일반 지침에서는 영숫자만 사용할 것을 권장하며, 이는 올바른 프로그래밍 언어 코드를 생성하지만, 허용된 프로그래밍 지침을 위반합니다.
"@nameID": $ref: "org/APIDOMAIN0001/0.0.1/elementDefs.yaml#/NameID"
"@accessCode":
$ref: "org/APIDOMAIN0001/0.0.1/elementDefs.yaml#/Access_Code"
...
filterList:
type: array
items:
$ref: "org/APIDOMAIN0001/0.0.1/elementDefs.yaml#/APIFilter_Type"
...
vs
...
nameID:
$ref: "org/APIDOMAIN0001/0.0.2/elementDefs.yaml#/NameID"
accessCode:
$ref: "org/APIDOMAIN0001/0.0.2/elementDefs.yaml#/AccessCode"
...
filterList:
type: array
items:
$ref: "org/APIDOMAIN0001/0.0.2/elementDefs.yaml#/APIFilterType"
7. 개체 정의는 Body 요소 선언에서 피해야 한다.
- 개체는 공유 정의를 위해 규격의 구성요소/도식 섹션이나 외부 문서로 이동해야 합니다.
- 본문에는 “type: object”와 같은 선언이 포함되지 않아야 합니다.
- Ex.: selection element 원본 버전:
... selection:
description: Identifies the selection to retrieve information for. Only one of the child elements of this structure are to be provided.
type: object
properties:
id:
$ref: "org/APIDOMAIN0001/0.0.1/elementDefs.yaml#/ID"
card:
$ref: "org/APIDOMAIN0001/0.0.1/elementDefs.yaml#/AlternativeID"
...
- 업데이트된 버전:
... selection:
$ref: "#/components/schemas/Selection"
...
schemas:
Selection:
type: object
description: Identifies the selection to retrieve information for. Only one of the child elements of this structure are to be provided.
properties:
id:
$ref: "org/APIDOMAIN0001/0.0.2/elementDefs.yaml#/ID"
card:
$ref: "org/APIDOMAIN0001/0.0.2/elementDefs.yaml#/AlternativeID"
...
8. 암시적 개체 정의가 수집 선언에서 사용될 때 본문 요소의 선언에서 피해야 한다.
- 개체는 명세서의 components/schemas 섹션 또는 외부 문서에서 공유 정의를 위해 정의되어야 하며,
- 암시적 개체의 선언 대신 본문의 컬렉션에서 참조되어야 합니다.
- 본문에는 암시적 개체 정의가 포함된 수집 선언이 포함되지 않아야 합니다.
- 즉, Java 인라인 선언과 동등합니다.
- Ex.: names element 원본 버전:
names:
description: Contact information.
type: array
items:
properties:
"id":
$ref: "org/APIDOMAIN0001/0.0.1/elementDefs.yaml#/ID"
name:
description: A name can contain up to two lines of name information.
type: array
items:
$ref: "org/APIDOMAIN0001/0.0.1/elementDefs.yaml#/Name"
...
- 업데이트된 버전:
... names:
type: array
items:
$ref: "#/components/schemas/RetrieveNames"
...
schemas:
RetrieveNames:
description: Contact information.
type: object
properties:
id:
$ref: "org/APIDOMAIN0001/0.0.2/elementDefs.yaml#/ID"
name:
description: A name can contain up to two lines of name information.
type: array
items:
$ref: "org/APIDOMAIN0001/0.0.2/elementDefs.yaml#/Name"
...
9. OpenAPI Generator Usage
9.1. 설치
- https://openapi-generator.tech/docs/installation
- OpenAPI 생성기를 사용하는 방법에는 여러 가지가 있습니다. 자세한 내용은 위 링크를 확인해 보시고
- 여기에서는 Windows 환경에서 jar를 다운로드 받아 실힝해는 예제로 진행하도록 하겠습니다.
- Windows 사용자 의 경우 wget을 설치해야 하거나 PowerShell(3.0+)에서 Invoke-WebRequest를 사용할 수 있습니다.
- 예:
PS C:>Invoke-WebRequest -OutFile openapi-generator-cli.jar https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/6.6.0/openapi-generator-cli-6.6.0.jar
9.2. 사용법
- help 옵션은 CLI에서 사용할 수 있는 모든 명령을 나열합니다.
C:> java -jar openapi-generator-cli.jar help
The most commonly used openapi-generator-cli commands are:
author Utilities for authoring generators or customizing templates.
batch Generate code in batch via external configs.
config-help Config help for chosen lang
generate Generate code with the specified generator.
help Display help information about openapi-generator
list Lists the available generators
meta MetaGenerator. Generator for creating a new template set and configuration for Codegen. The output will be based on the language you specify, and includes default templates to include.
validate Validate specification
version Show version information used in tooling
See 'openapi-generator-cli help <command>' for more information on a specific
command.
PS C:>
9.3. 유효성 확인
- validate 명령을 사용하면 입력 스펙의 유효성을 검사할 수 있으면, 선태적으로 오류 수정 또는 기타 개선 사항에 대한 권장 사항을 제공해 줍니다.
PS C:> java -jar openapi-generator-cli.jar help validateNAME
openapi-generator-cli validate - Validate specification
SYNOPSIS
openapi-generator-cli validate
(-i <spec file> | --input-spec <spec file>) [--recommend]
OPTIONS
-i <spec file>, --input-spec <spec file>
location of the OpenAPI spec, as URL or file (required)
--recommend
- 사용 예시는 다음과 같습니다.(petstore-v3.0.yaml 사용 )
PS C:> java -jar openapi-generator-cli.jar validate -i .petstore-v3.0.yaml --recommendValidating spec (.petstore-v3.0.yaml)
No validation issues detected.
PS C:>
9.4. 소스 생성
- generate 명령은 생성기 도구 세트의 핵심입니다. 따라서 이전 명령보다 더 많은 옵션을 사용할 수 있습니다.
- 아래에는 간략한 옵션이 나와 있지만 전체 설명을 확장할 수도 있습니다.
PS C:> java -jar openapi-generator-cli.jar help generateNAME
openapi-generator-cli generate - Generate code with the specified
generator.
SYNOPSIS
openapi-generator-cli generate
[(-a <authorization> | --auth <authorization>)]
[--api-name-suffix <api name suffix>] [--api-package <api package>]
[--artifact-id <artifact id>] [--artifact-version <artifact version>]
[(-c <configuration file> | --config <configuration file>)] [--dry-run]
[(-e <templating engine> | --engine <templating engine>)]
[--enable-post-process-file]
[(-g <generator name> | --generator-name <generator name>)]
[--generate-alias-as-model] [--git-host <git host>]
[--git-repo-id <git repo id>] [--git-user-id <git user id>]
[--global-property <global properties>...] [--group-id <group id>]
[--http-user-agent <http user agent>]
[(-i <spec file> | --input-spec <spec file>)]
[--ignore-file-override <ignore file override location>]
[--import-mappings <import mappings>...]
[--inline-schema-name-defaults <inline schema name defaults>...]
[--inline-schema-name-mappings <inline schema name mappings>...]
[--input-spec-root-directory <Folder with spec(s)>]
[--instantiation-types <instantiation types>...]
[--invoker-package <invoker package>]
[--language-specific-primitives <language specific primitives>...]
[--legacy-discriminator-behavior] [--library <library>]
[--log-to-stderr] [--merged-spec-filename <Name of resulted merged specs file (used along with --input-spec-root-directory option)>]
[--minimal-update] [--model-name-prefix <model name prefix>]
[--model-name-suffix <model name suffix>]
[--model-package <model package>]
[(-o <output directory> | --output <output directory>)]
[--openapi-normalizer <OpenAPI normalizer rules>...] [(-p <additional properties> | --additional-properties <additional properties>)...]
[--package-name <package name>] [--release-note <release note>]
[--remove-operation-id-prefix]
[--reserved-words-mappings <reserved word mappings>...]
[(-s | --skip-overwrite)] [--schema-mappings <schema mappings>...]
[--server-variables <server variables>...] [--skip-operation-example]
[--skip-validate-spec] [--strict-spec <true/false strict behavior>]
[(-t <template directory> | --template-dir <template directory>)]
[--type-mappings <type mappings>...] [(-v | --verbose)]
- 사용 예시는 다음과 같습니다.(petstore-v3.0.yaml 사용 )
PS C:Utility> java -jar openapi-generator-cli.jar generate -g java --additional-properties=prependFormOrBodyParameters=true -o PetStore -i .petstore-v3.0.yaml[main] INFO o.o.codegen.DefaultGenerator - Generating with dryRun=false
[main] INFO o.o.codegen.DefaultGenerator - OpenAPI Generator: java (client)
[main] INFO o.o.codegen.DefaultGenerator - Generator 'java' is considered stable.
[main] INFO o.o.c.languages.AbstractJavaCodegen - Environment variable JAVA_POST_PROCESS_FILE not defined so the Java code may not be properly formatted. To define it, try 'export JAVA_POST_PROCESS_FILE="/usr/local/bin/clang-format -i"' (Linux/Mac)
[main] INFO o.o.c.languages.AbstractJavaCodegen - NOTE: To enable file post-processing, 'enablePostProcessFile' must be set to `true` (--enable-post-process-file for CLI).
[main] INFO o.o.c.languages.AbstractJavaCodegen - Processing operation listPets
[main] INFO o.o.c.languages.AbstractJavaCodegen - Processing operation createPets
[main] INFO o.o.c.languages.AbstractJavaCodegen - Processing operation showPetById
[main] INFO o.o.codegen.DefaultGenerator - Model Pets not generated since it's an alias to array (without property) and `generateAliasAsModel` is set to false (default)
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientmodelError.java
[main] INFO o.o.codegen.TemplateManager - Skipped C:UtilityPetStoresrctestjavaorgopenapitoolsclientmodelErrorTest.java (Test files never overwrite an existing file of the same name.)
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoredocsError.md
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientmodelPet.java
[main] INFO o.o.codegen.TemplateManager - Skipped C:UtilityPetStoresrctestjavaorgopenapitoolsclientmodelPetTest.java (Test files never overwrite an existing file of the same name.)
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoredocsPet.md
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientapiPetsApi.java
[main] INFO o.o.codegen.TemplateManager - Skipped C:UtilityPetStoresrctestjavaorgopenapitoolsclientapiPetsApiTest.java (Test files never overwrite an existing file of the same name.)
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoredocsPetsApi.md
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStorepom.xml
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoreREADME.md
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStorebuild.gradle
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStorebuild.sbt
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresettings.gradle
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoregradle.properties
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainAndroidManifest.xml
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStore.travis.yml
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientApiClient.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientServerConfiguration.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientServerVariable.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStore.githubworkflowsmaven.yml
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoreapiopenapi.yaml
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientStringUtil.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientauthHttpBasicAuth.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientauthHttpBearerAuth.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientauthApiKeyAuth.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoregradlew
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoregradlew.bat
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoregradlewrappergradle-wrapper.properties
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoregradlewrappergradle-wrapper.jar
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoregit_push.sh
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStore.gitignore
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientApiException.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientConfiguration.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientPair.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientauthAuthentication.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientApiCallback.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientApiResponse.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientJSON.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientProgressRequestBody.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientProgressResponseBody.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientGzipRequestInterceptor.java
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStoresrcmainjavaorgopenapitoolsclientmodelAbstractOpenApiSchema.java
[main] INFO o.o.codegen.TemplateManager - Skipped C:UtilityPetStore.openapi-generator-ignore (Skipped by supportingFiles options supplied by user.)
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStore.openapi-generatorVERSION
[main] INFO o.o.codegen.TemplateManager - writing file C:UtilityPetStore.openapi-generatorFILES
################################################################################
# Thanks for using OpenAPI Generator. #
# Please consider donation to help us maintain this project ? #
# https://opencollective.com/openapi_generator/donate #
################################################################################
PS C:Utility>
- 생성된 소스 결과 확인은 다음과 같습니다.
PS C:Utility> cd .PetStorePS C:UtilityPetStore> ls
디렉터리: C:UtilityPetStore
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2023-10-23 오전 11:14 .github
d----- 2023-10-23 오전 11:14 .openapi-generator
d----- 2023-10-23 오전 11:14 api
d----- 2023-10-23 오전 11:14 docs
d----- 2023-10-23 오전 11:14 gradle
d----- 2023-10-23 오전 11:14 src
-a---- 2023-10-23 오후 1:41 291 .gitignore
-a---- 2023-10-23 오전 11:14 1040 .openapi-generator-ignore
-a---- 2023-10-23 오후 1:41 410 .travis.yml
-a---- 2023-10-23 오후 1:41 5010 build.gradle
-a---- 2023-10-23 오후 1:41 1318 build.sbt
-a---- 2023-10-23 오후 1:41 1830 git_push.sh
-a---- 2023-10-23 오후 1:41 436 gradle.properties
-a---- 2023-10-23 오후 1:41 8092 gradlew
-a---- 2023-10-23 오후 1:41 2696 gradlew.bat
-a---- 2023-10-23 오후 1:41 14428 pom.xml
-a---- 2023-10-23 오후 1:41 3473 README.md
-a---- 2023-10-23 오후 1:41 40 settings.gradle
PS C:UtilityPetStore>
10. 참고 자료
- OpenAPI 스펙 : https://spec.openapis.org/oas/v3.1.0
- OpenAPI Generator : https://openapi-generator.tech/
- Light : https://doc.networknt.com/
- Swagger OpenAPI Specification : https://swagger.io/specification/v3/
여기까지 ‘OpenAPI 3.0 스펙 작성 가이드’에 대해 소개해드렸습니다. 유익한 정보가 되셨길 바랍니다. 감사합니다.
Written by 이 언하 / Data실
BESPIN GLOBAL
0