OpenAPI
1. 개요
1. 개요
OpenAPI는 RESTful API를 설명하기 위한 표준이며, 기계가 읽을 수 있는 인터페이스 파일 형식이다. 이 명세는 OpenAPI Initiative (OAI)에서 관리하는 개방형 표준으로, API의 구조와 동작을 YAML 또는 JSON 형식의 문서로 정의한다. 이를 통해 소프트웨어 개발자와 도구가 소스 코드나 추가 문서 없이도 웹 서비스의 기능을 이해하고 상호작용할 수 있다.
OpenAPI 명세의 주요 용도는 API 설계, API 문서화, 코드 생성, 그리고 테스트 자동화이다. 하나의 OpenAPI 문서를 단일 정보원으로 활용하여, 상호작용 가능한 문서를 생성하거나, 서버 및 클라이언트 측 소프트웨어 개발 키트 (SDK) 코드를 자동으로 만들 수 있다. 이는 API의 전체 생명주기 동안 일관된 정보 전달을 보장한다.
이 기술은 프로그래밍 언어에 종속되지 않으며, HTTP 기반 API를 설명하는 데 중점을 둔다. OpenAPI 문서는 정적으로 작성되거나, 실행 중인 애플리케이션으로부터 동적으로 생성될 수 있다. 이를 통해 기존 API를 재작성하지 않고도 그 기능을 표준화된 방식으로 기술할 수 있어, 개발자 간의 협업과 통합 과정을 크게 단순화한다.
2. 역사
2. 역사
OpenAPI의 역사는 2011년 워드닉(Wordnik)의 개발자 토니 탐(Tony Tam)이 시작한 스웨거(Swagger) 프로젝트에서 비롯된다. 당시 그는 REST API를 문서화하고 클라이언트 코드를 생성하기 위한 도구 모음의 일부로 '스웨거 스펙'을 만들었다. 이 스펙은 YAML 또는 JSON 형식으로 API의 구조를 기술하는 방법을 정의했으며, 빠르게 개발자 커뮤니티 사이에서 인기를 얻었다.
2015년, 스웨거 스펙의 관리권을 보유한 스마트베어 소프트웨어(SmartBear Software)는 이 기술 명세를 오픈소스 커뮤니티에 기부하는 중요한 결정을 내렸다. 이로 인해 리눅스 재단(Linux Foundation) 산하에 OpenAPI 이니셔티브(OpenAPI Initiative, OAI)가 설립되었다. 이 컨소시엄에는 구글, 마이크로소프트, IBM 등 주요 기술 기업들이 참여했으며, 스펙의 공식 명칭은 '스웨거 스펙'에서 'OpenAPI 스펙'(OAS)으로 변경되었다. 이는 해당 표준이 특정 벤더에 종속되지 않는 개방형 표준으로 발전했음을 의미한다.
이후 OpenAPI 스펙은 지속적으로 개정되어 왔다. 초기 버전인 Swagger 2.0을 거쳐, 2017년에는 구조적 개선이 이루어진 OpenAPI 3.0이 발표되었다. 2021년에는 JSON 스키마(JSON Schema)와의 완전한 호환성을 도입하는 등 주요 기능이 추가된 OpenAPI 3.1이 공개되었다. 한편, 스마트베어는 '스웨거'라는 브랜드 이름을 스웨거 UI(Swagger UI), 스웨거 에디터(Swagger Editor) 등 OpenAPI 스펙을 활용하는 도구군의 이름으로 계속 사용하고 있다.
3. 주요 구성 요소
3. 주요 구성 요소
3.1. 정보 (Info)
3.1. 정보 (Info)
정보 객체는 OpenAPI 문서의 메타데이터를 정의하는 필수 구성 요소이다. 이 객체는 API의 기본적인 식별 정보와 설명을 담고 있으며, 문서의 최상위 레벨에 위치한다. 정보 객체는 API를 사용하는 개발자나 자동화 도구가 해당 API의 목적, 버전, 연락처 등을 빠르게 이해할 수 있도록 돕는다.
정보 객체에는 여러 필드가 포함된다. title과 version 필드는 반드시 필요하며, 각각 API의 이름과 현재 버전을 명시한다. description 필드를 통해 API의 전체적인 기능과 용도를 자세히 설명할 수 있다. 또한 contact 객체를 사용해 개발팀의 연락처 정보를, license 객체를 통해 API의 사용 조건을 정의할 수 있다. 이러한 메타데이터는 Swagger UI나 Redoc 같은 문서화 도구에서 시각적으로 잘 표현되어 API 소비자에게 명확한 정보를 전달한다.
정보 객체는 API의 수명 주기 관리에서도 중요한 역할을 한다. 버전 정보를 명시함으로써 클라이언트 라이브러리 생성이나 테스트 자동화 시 올바른 버전의 스펙을 참조하도록 보장한다. 이는 소프트웨어 개발 과정에서 발생할 수 있는 버전 불일치 문제를 방지하는 데 기여한다. 따라서 정보 객체는 단순한 설명을 넘어, API 설계와 유지보수의 실용적인 기준점을 제공한다.
3.2. 서버 (Servers)
3.2. 서버 (Servers)
서버 객체는 OpenAPI 문서에서 API가 호스팅되는 하나 이상의 서버 URL을 정의한다. 이는 API 소비자가 요청을 보낼 올바른 기본 주소를 알 수 있도록 하는 데 필수적이다. 단일 서버 URL을 지정하거나, 프로덕션, 스테이징, 개발 등 다양한 환경에 대한 여러 서버 목록을 제공할 수 있다. 또한 각 서버에 대한 설명을 추가하여 사용자가 상황에 맞는 서버를 선택할 수 있게 한다.
서버 URL에는 템플릿 변수를 사용하여 동적으로 구성할 수 있다. 예를 들어, {username}.example.com과 같은 패턴을 정의하고, 해당 변수에 대한 기본값이나 열거형 값을 설정할 수 있다. 이 기능은 테넌트별 서버나 지역별 엔드포인트를 설명할 때 유용하다. 또한, 서버 객체는 선택적으로 보안 요구사항이나 프로토콜과 같은 추가적인 연결 정보를 포함할 수 있다.
서버 객체는 경로 수준이나 개별 작업 수준에서도 재정의될 수 있다. 이는 특정 엔드포인트만 다른 서버에서 호스팅되는 마이크로서비스 아키텍처나 프록시를 통한 특별한 경로를 설명할 때 활용된다. 이렇게 함으로써 API 설계자는 전체 API와 그 하위 요소들에 대한 네트워크 위치 정보를 유연하게 제공할 수 있다.
3.3. 경로 (Paths)
3.3. 경로 (Paths)
경로(Paths)는 OpenAPI 명세의 핵심 구성 요소이다. 이 객체는 API가 제공하는 모든 엔드포인트와 각 엔드포인트에서 사용 가능한 HTTP 메서드를 정의한다. 각 경로는 URL 패턴으로 표현되며, 해당 경로에서 수행할 수 있는 GET, POST, PUT, DELETE 등의 작업(Operation)을 포함한다.
각 작업은 해당 API 호출에 필요한 세부 사항을 기술한다. 여기에는 요청 매개변수(쿼리 매개변수, 경로 매개변수, 헤더 등), 요청 본문의 스키마, 가능한 HTTP 상태 코드별 응답 형식, 그리고 필요한 인증 방식 등이 포함된다. 경로 템플릿(예: /users/{userId})을 사용하면 동적인 URL 세그먼트를 경로 매개변수로 정의할 수 있어 RESTful 리소스 구조를 명확하게 표현할 수 있다.
이러한 구조화된 정의는 Swagger UI나 Redoc 같은 도구가 자동으로 대화형 API 문서를 생성하는 데 사용된다. 또한, 경로 객체에 명시된 정보는 서버 스텁이나 클라이언트 SDK를 자동 생성하는 코드 생성 도구의 입력으로 활용되어, API 설계와 실제 구현 사이의 일관성을 보장한다.
3.4. 구성 요소 (Components)
3.4. 구성 요소 (Components)
구성 요소(Components)는 OpenAPI 명세의 핵심적인 재사용 가능한 객체들을 정의하는 섹션이다. 이 섹션은 경로 객체나 작업 객체 내에서 반복적으로 사용되는 스키마, 응답, 매개변수, 예시, 요청 본문, 헤더, 보안 구성, 링크, 콜백 등의 정의를 한 곳에 모아 중복을 제거하고 문서의 일관성을 유지하도록 설계되었다. $ref 키워드를 사용하여 이러한 정의를 참조함으로써, 동일한 데이터 모델이나 응답 구조를 여러 엔드포인트에서 일관되게 사용할 수 있다.
구성 요소 객체는 크게 schemas, responses, parameters, examples, requestBodies, headers, securitySchemes, links, callbacks 등의 하위 필드를 가진다. 이 중 schemas는 API가 주고받는 데이터의 구조를 JSON 스키마 형식으로 정의하며, 요청 본문이나 응답의 content 필드에서 참조된다. securitySchemes는 API 키, OAuth 2.0, OpenID Connect 등 인증 및 권한 부여 방식을 정의한다.
이러한 모듈화 접근 방식은 API 설계와 유지보수를 크게 단순화한다. 예를 들어, 사용자 정보를 표현하는 User 스키마를 한 번 정의하면, 사용자 조회, 생성, 수정 등 관련된 모든 엔드포인트에서 동일한 정의를 참조할 수 있다. 이는 문서의 가독성을 높일 뿐만 아니라, 코드 생성 도구가 더 효율적으로 클라이언트 라이브러리나 서버 스텁을 생성하는 데도 기여한다.
4. 사양 버전
4. 사양 버전
4.1. Swagger 2.0
4.1. Swagger 2.0
Swagger 2.0은 OpenAPI 명세의 공식적인 전신이다. 2011년 Tony Tam이 Wordnik에서 개발한 Swagger Specification으로 시작하여, 2014년에 발표된 2.0 버전은 당시 RESTful API를 설명하는 사실상의 표준 형식으로 자리 잡았다. 이 명세는 JSON 또는 YAML 형식으로 작성된 단일 문서를 통해 API의 엔드포인트(Paths), HTTP 메서드, 요청 및 응답 구조, 인증 방식을 체계적으로 정의한다. Swagger 2.0 문서는 기계가 읽을 수 있어 API 문서화 도구나 코드 생성 도구의 입력 소스로 활용될 수 있다.
Swagger 2.0의 핵심 구조는 swagger(버전 정의), info(API 메타정보), host, basePath, schemes, paths(API 경로 및 작업), definitions(데이터 모델) 등의 최상위 필드로 구성된다. 특히 paths 객체 아래에 각 엔드포인트와 HTTP 메서드를 정의하고, definitions 객체에서 JSON Schema를 사용하여 재사용 가능한 데이터 모델을 기술하는 방식이 특징이다. 이 구조는 개발자가 API의 전체적인 계약을 명확히 이해하고, 클라이언트와 서버 팀 간의 소통을 원활하게 하는 데 기여했다.
2015년에 Swagger 2.0 명세는 SmartBear Software에 의해 OpenAPI Initiative(OAI)에 기증되었고, 이후 공개 표준으로 발전하게 된다. 이로 인해 Swagger 2.0은 최초의 공식 OpenAPI Specification(OAS) 버전이 되었으며, 이후 모든 개선 사항은 OpenAPI 3.x라는 이름 아래에 통합되었다. 따라서 Swagger 2.0은 역사적으로 중요한 버전이며, 여전히 많은 레거시 API와 도구에서 사용되고 있다.
4.2. OpenAPI 3.x
4.2. OpenAPI 3.x
OpenAPI 3.x는 2017년에 도입된 주요 버전으로, 이전의 Swagger 2.0 사양을 대체하며 구조와 기능 면에서 상당한 개선을 이루었다. 이 버전군은 OpenAPI Initiative에 의해 관리되며, REST API를 설명하는 데 있어 더욱 모듈화되고 표현력이 풍부한 표준을 제공한다. 핵심적인 변화 중 하나는 API의 기본 URL과 환경을 정의하는 서버 (Servers) 객체의 도입이다. 이를 통해 단일 API 정의 파일로 프로덕션, 스테이징, 개발 서버 등 다양한 배포 환경을 명시할 수 있게 되었다.
또한, OpenAPI 3.x는 재사용 가능한 컴포넌트를 중앙에서 관리하는 구성 요소 (Components) 객체를 강화했다. 스키마, 매개변수, 응답, 보안 방식, 예시 등을 이 섹션에 정의하고, 경로 (Paths) 섹션에서 $ref를 사용해 참조하는 방식으로 문서의 중복을 크게 줄이고 유지보수성을 높였다. 요청 본문과 응답 본문을 설명하는 방식도 개선되어, 단일 연산에서 여러 미디어 타입을 지원할 수 있게 되었다.
OpenAPI 3.0 이후, 2021년에 발표된 OpenAPI 3.1은 JSON Schema 2020-12와의 완전한 호환성을 주요 특징으로 한다. 이로 인해 JSON Schema의 최신 기능을 OpenAPI 문서 내에서 그대로 활용할 수 있게 되어 데이터 모델 정의의 유연성과 정확성이 크게 향상되었다. 또한, 웹훅에 대한 공식적인 지원이 추가되어 이벤트 기반 아키텍처를 더 잘 설명할 수 있게 되었다. 이러한 발전은 OpenAPI 사양이 API 설계부터 문서화, 코드 생성, 테스트에 이르는 전체 API 라이프사이클을 지원하는 핵심 도구로서의 위치를 확고히 하는 데 기여했다.
5. 도구 및 생태계
5. 도구 및 생태계
5.1. Swagger 도구군
5.1. Swagger 도구군
Swagger 도구군은 OpenAPI 명세를 활용하여 API의 설계, 문서화, 테스트, 클라이언트 및 서버 코드 생성 등 전반적인 API 생명주기를 지원하는 소프트웨어 제품군이다. 이 도구군은 원래 Swagger 프로젝트의 일부로 개발되었으며, 현재는 SmartBear 소프트웨어가 유지 관리하고 있다. Swagger 도구군은 OpenAPI Initiative에서 관리하는 공식 명세와는 별개로, 그 명세를 실용적으로 구현하고 활용하기 위한 도구들을 제공한다.
주요 도구로는 Swagger Editor, Swagger UI, Swagger Codegen이 있다. Swagger Editor는 YAML 또는 JSON 형식으로 OpenAPI 문서를 작성하고 실시간으로 구문 오류를 검증할 수 있는 웹 기반 편집기이다. Swagger UI는 작성된 OpenAPI 문서를 기반으로 시각적이고 상호작용이 가능한 API 문서를 자동으로 생성해 주는 도구로, 개발자가 브라우저에서 직접 엔드포인트를 테스트해 볼 수 있는 기능을 제공한다. Swagger Codegen은 OpenAPI 문서로부터 다양한 프로그래밍 언어의 서버 스텁 코드나 클라이언트 SDK를 생성하는 코드 생성기이다.
이러한 도구들은 API 우선 설계 방식에서 핵심적인 역할을 한다. 개발팀은 Swagger Editor를 사용해 API 인터페이스를 먼저 설계하고, Swagger Codegen으로 서버측의 기본 골격 코드를 생성한 후 구현을 진행할 수 있다. 동시에 Swagger UI를 통해 생성된 문서는 내부 팀원이나 외부 개발자에게 항상 최신 상태의 정확한 API 정보를 제공한다. 이 생태계는 ASP.NET Core의 Swashbuckle이나 Node.js의 다양한 라이브러리와 같은 통합 패키지를 통해 다양한 개발 환경에서도 광범위하게 사용되고 있다.
5.2. 대체 도구 및 라이브러리
5.2. 대체 도구 및 라이브러리
Swagger 도구군 외에도 OpenAPI 생태계에는 다양한 대체 도구와 라이브러리가 존재한다. 이들은 특정 프로그래밍 언어나 프레임워크에 특화되어 있거나, 특정 기능(예: 타입 안전성, 런타임 검증)에 초점을 맞춰 개발자에게 더 많은 선택지를 제공한다.
예를 들어, ASP.NET Core 생태계에서는 Swashbuckle이 널리 사용되며, 이는 C# 코드에서 OpenAPI 문서를 자동 생성하고 Swagger UI를 내장하는 데 유용하다. Node.js와 TypeScript 환경에서는 openapi-typescript와 같은 도구가 OpenAPI 명세로부터 직접 TypeScript 타입 정의를 생성하여, 클라이언트 코드의 타입 안전성을 보장한다. 이렇게 생성된 타입은 openapi-fetch나 Orval과 같은 라이브러리와 함께 사용되어 완전한 타입 안전 API 클라이언트를 구축하는 데 활용된다.
다른 언어들도 유사한 도구 생태계를 갖추고 있다. Java의 경우 Spring Boot와 통합되는 Springdoc OpenAPI 라이브러리가 있으며, Python에서는 drf-spectacular(Django REST Framework용)이나 fastapi(자체적으로 OpenAPI 생성을 내장) 같은 도구가 있다. 또한 Postman이나 Stoplight Studio와 같은 통합 개발 환경(IDE) 및 API 플랫폼들은 시각적 편집기와 테스팅 기능을 통해 OpenAPI 설계와 문서화 작업 흐름을 지원한다.
이러한 대체 도구들은 코드 우선(Code-first) 또는 설계 우선(Design-first) 접근 방식 모두를 지원하며, 개발 팀의 워크플로우와 기술 스택에 맞는 유연성을 제공한다. 결과적으로, OpenAPI 명세는 다양한 도구 체인을 통해 API 수명주기 전반에 걸쳐 일관된 정보의 흐름과 자동화의 기반이 될 수 있다.
6. 사용 사례
6. 사용 사례
6.1. API 문서화
6.1. API 문서화
OpenAPI의 가장 일반적인 사용 사례는 API 문서화이다. OpenAPI 문서는 YAML 또는 JSON 형식으로 작성된 기계가 읽을 수 있는 API 명세를, 인간이 쉽게 이해할 수 있는 형태의 대화형 문서로 자동 변환하는 데 사용된다. 이를 통해 개발자는 웹 브라우저에서 직접 API의 모든 엔드포인트, HTTP 메서드, 요청 및 응답 형식, 인증 방식을 탐색하고, 심지어 실제 API 호출을 테스트해볼 수 있다.
이러한 문서화는 주로 Swagger UI나 Redoc과 같은 도구를 통해 이루어진다. 개발자는 서버에서 제공하는 OpenAPI 문서(JSON 파일)의 URL만 이러한 도구에 제공하면, 도구가 명세를 해석하여 시각적으로 구성된 문서를 생성한다. 생성된 문서는 각 경로와 작업을 계층적으로 보여주며, 요청 매개변수와 응답 코드별 예시 스키마를 포함한다. 이는 API 제공자가 별도로 정적 문서를 작성하고 수동으로 유지보수하는 번거로움을 크게 줄여준다.
OpenAPI 기반 문서화의 핵심 장점은 명세와 문서가 완전히 동기화된다는 점이다. API의 인터페이스가 변경되면 이를 반영한 OpenAPI 문서를 업데이트하기만 하면, 연결된 모든 문서화 도구의 출력이 자동으로 최신 상태로 갱신된다. 이는 소프트웨어 개발 수명 주기 전반에 걸쳐 정확하고 일관된 문서를 유지하는 데 필수적이며, 내부 개발팀 뿐만 아니라 외부 제삼자 개발자에게도 명확한 API 계약을 제공하는 데 기여한다.
6.2. 클라이언트/서버 코드 생성
6.2. 클라이언트/서버 코드 생성
OpenAPI 명세서는 API 설계와 문서화를 넘어, 클라이언트와 서버 측의 코드 생성을 자동화하는 데 핵심적인 역할을 한다. 이는 OpenAPI 명세서가 기계가 읽을 수 있는 표준 형식으로 API의 모든 세부사항을 정의하기 때문에 가능하다. 코드 생성 도구는 이 명세서를 입력으로 받아, 특정 프로그래밍 언어에 맞는 서버 스텁이나 클라이언트 SDK를 생성한다. 이를 통해 개발자는 반복적인 보일러플레이트 코드 작성에서 벗어나, 비즈니스 로직 구현에 집중할 수 있다.
주요 코드 생성 방식은 두 가지로 구분된다. 첫째는 서버 스텁 생성이다. 이는 API 설계(API-first) 단계에서 작성된 OpenAPI 명세서를 기반으로, 웹 서버의 기본 골격 코드를 자동으로 만들어낸다. 생성된 코드는 컨트롤러 클래스의 틀과 라우팅, 요청 및 응답 객체의 구조를 포함하며, 개발자는 이를 확장하여 실제 로직을 구현하면 된다. 둘째는 클라이언트 SDK 생성이다. API를 사용하는 프론트엔드 애플리케이션이나 다른 서비스는 명세서로부터 타입스크립트, 자바, 파이썬 등 다양한 언어의 클라이언트 라이브러리를 생성할 수 있다. 이 SDK는 API 호출을 추상화하여, 개발자가 엔드포인트 URL이나 HTTP 메서드를 직접 하드코딩하지 않고도 안전하게 API를 호출할 수 있게 한다.
코드 생성의 가장 큰 장점은 단일 진실 공급원으로서의 명세서를 통해 프론트엔드와 백엔드 간의 불일치를 방지한다는 점이다. API 인터페이스가 변경되면 명세서를 업데이트하고 코드를 재생성함으로써, 양측의 코드와 문서화가 항상 동기화되도록 보장할 수 있다. 이는 통합 테스트 비용을 줄이고, 개발 생산성을 크게 향상시킨다. Swagger Codegen, OpenAPI Generator, Orval 등 다양한 오픈소스 및 상용 도구들이 이러한 코드 생성 기능을 지원하며, CI/CD 파이프라인에 통합하여 자동화하는 것이 일반적인 관행이다.
6.3. API 테스팅
6.3. API 테스팅
OpenAPI 스펙은 API 테스팅을 자동화하고 효율적으로 수행하는 데 핵심적인 역할을 한다. API의 모든 엔드포인트, 요청 형식, 응답 구조, 상태 코드 등이 기계가 읽을 수 있는 형태로 정의되어 있기 때문에, 이 정보를 기반으로 테스트 케이스를 자동 생성하거나 테스트 도구와 연동하는 것이 가능해진다.
주요 테스팅 활용 방식은 다음과 같다. 첫째, 계약 테스트에 사용된다. OpenAPI 문서는 API의 계약 사항을 명시적으로 정의하므로, 실제 구현이 이 계약을 준수하는지 검증하는 테스트를 자동으로 생성할 수 있다. 둘째, 모의 서버 생성에 활용된다. Swagger UI나 Postman 같은 도구들은 OpenAPI 스펙을 로드하여 실제 서버가 배포되기 전에도 요청과 응답을 시뮬레이션할 수 있는 인터랙티브 환경을 제공한다. 이는 프론트엔드 개발자나 API 소비자가 초기 단계부터 통합을 테스트할 수 있게 한다.
또한, OpenAPI 스펙을 사용하면 정적 분석 도구를 통해 API 설계의 일관성이나 보안 취약점을 사전에 점검할 수 있다. 예를 들어, 필수 인증이 누락된 경로를 찾거나, 잘못된 데이터 타입이 사용되었는지 검사하는 것이 가능하다. 이러한 테스트와 검증은 CI/CD 파이프라인에 통합되어, 코드 변경 시마다 API의 정합성을 자동으로 보장하는 데 기여한다.
결과적으로, OpenAPI를 통한 테스팅은 수동 테스트에 의존하는 오류를 줄이고, 소프트웨어 개발 생명주기 전반에 걸쳐 품질을 유지하는 데 필수적인 도구로 자리 잡았다. 이는 마이크로서비스 아키텍처나 클라우드 네이티브 애플리케이션처럼 수많은 API가 상호작용하는 복잡한 시스템에서 특히 그 가치가 크다.
7. 관련 기술
7. 관련 기술
7.1. REST API
7.1. REST API
OpenAPI는 REST API를 설명하기 위한 표준화된 형식이다. 구체적으로, HTTP 기반의 RESTful 웹 서비스 인터페이스를 기계가 읽을 수 있는 형태로 정의하는 명세서이다. 이 명세는 YAML 또는 JSON 형식으로 작성되며, API의 모든 엔드포인트, 요청 및 응답 형식, 인증 방법, 데이터 모델 등을 기술한다. 이를 통해 개발자는 소스 코드나 추가 문서 없이도 API의 기능과 사용법을 명확하게 이해할 수 있다.
OpenAPI 명세의 주요 활용 분야는 API 문서화, 클라이언트 및 서버 코드 생성, 그리고 API 테스팅이다. 하나의 OpenAPI 파일을 소스로 삼아 Swagger UI나 Redoc 같은 도구를 사용하면 대화형 API 문서를 자동으로 생성할 수 있다. 또한, OpenAPI Generator 같은 도구를 이용하면 다양한 프로그래밍 언어로 서버 스텁이나 클라이언트 SDK를 생성할 수 있어 개발 생산성을 크게 향상시킨다.
이 명세는 원래 Swagger Specification으로 시작되었으며, 2015년 Linux Foundation 산하의 OpenAPI Initiative에 기여되어 공개 표준으로 발전했다. 따라서 OpenAPI는 표준 명세를, Swagger는 이 명세를 활용하는 도구군을 가리키는 경우가 많다. OpenAPI 명세는 API 우선 설계 방식과 코드 우선 설계 방식 모두를 지원하며, 소프트웨어 개발 수명주기 전반에 걸쳐 일관된 정보 전달의 근간이 된다.
7.2. AsyncAPI
7.2. AsyncAPI
AsyncAPI는 이벤트 기반 아키텍처와 메시지 기반 시스템을 위한 API 설명 표준이다. OpenAPI가 HTTP 기반의 동기식 REST API를 설명하는 데 초점을 맞춘다면, AsyncAPI는 메시지 브로커를 통해 통신하는 비동기식 API를 정의하기 위해 만들어졌다. 이는 마이크로서비스, 사물인터넷, 실시간 애플리케이션과 같은 현대적 시스템에서 널리 사용되는 이벤트 드리븐 통신 패턴을 표준화하는 데 목적이 있다.
AsyncAPI는 OpenAPI와 유사한 구조와 철학을 공유한다. YAML 또는 JSON 형식으로 작성되며, 서버 정보, 채널, 메시지, 구성 요소 등 핵심 요소를 정의한다. 이를 통해 카프카, RabbitMQ, MQTT와 같은 다양한 메시징 프로토콜을 사용하는 시스템의 인터페이스를 기계가 읽을 수 있는 형식으로 명시할 수 있다. 이 표준화된 설명 파일은 API 문서화, 클라이언트 코드 생성, 서버 스텁 생성 등 OpenAPI 생태계와 유사한 이점을 비동기 API 영역에서 제공한다.
AsyncAPI와 OpenAPI는 상호 보완적인 관계에 있다. 많은 조직이 동기식 REST API와 비동기식 이벤트 스트림을 함께 사용하는 하이브리드 아키텍처를 채택하고 있다. 두 표준을 함께 사용하면 시스템의 전체 통신 계약을 포괄적으로 정의할 수 있어, 개발자 경험과 API 수명 주기 관리를 향상시킨다. 이는 API 우선 설계 원칙을 이벤트 기반 시스템으로 확장하는 데 기여한다.
7.3. JSON Schema
7.3. JSON Schema
OpenAPI 사양은 API의 요청과 응답에 포함되는 데이터의 구조를 정의하기 위해 JSON Schema를 광범위하게 활용한다. JSON Schema는 JSON 데이터의 유효성을 검증하기 위한 선언적 언어로, 데이터 타입, 형식, 필수 속성, 허용 범위 등을 정의할 수 있다. OpenAPI 3.0부터는 JSON Schema의 핵심 부분을 지원하며, OpenAPI 3.1 버전에서는 JSON Schema 2020-12와의 완전한 호환성을 목표로 하여 사양의 일부로 통합되었다.
OpenAPI 문서 내에서 schema 객체는 경로(Paths) 항목의 매개변수(Parameters)나 요청 본문(Request Body), 응답(Responses)의 데이터 형식을 기술할 때 사용된다. 특히 components 섹션 아래에 공통 스키마(Schemas)를 정의하고, $ref 키워드를 통해 여러 곳에서 재사용하는 것이 일반적이다. 이를 통해 데이터 모델의 일관성을 유지하고 문서의 중복을 줄일 수 있다. JSON Schema를 사용함으로써 개발자는 API가 기대하는 데이터 형식을 명확히 이해할 수 있으며, 다양한 도구를 이용해 자동으로 유효성 검사(Validation)나 모의 객체(Mock Object) 생성을 수행할 수 있다.
8. 여담
8. 여담
OpenAPI는 API 설계와 문서화의 표준으로 자리 잡았지만, 그 여정에는 몇 가지 흥미로운 점이 있다. 이 기술은 원래 Swagger라는 이름으로 시작했다. 2011년 Wordnik의 개발자 토니 탐이 내부 API 문서화 도구로 만든 것이 시초였다. 이 프로젝트는 빠르게 인기를 얻어 2015년 SmartBear Software에 인수되었고, 이후 리눅스 재단 산하의 OpenAPI Initiative에 기증되면서 오픈 표준으로 전환되었다. 이때 사양의 공식 명칭이 'Swagger Specification'에서 'OpenAPI Specification'으로 변경되었다. 이 역사 때문에 많은 사람들이 'OpenAPI'와 'Swagger'를 혼동하는데, OpenAPI는 표준 사양 그 자체를, Swagger는 이 사양을 지원하는 SmartBear의 도구군을 가리킨다.
OpenAPI 사양의 진화는 API 우선 설계 철학의 부상과 밀접한 관련이 있다. 이 접근법은 구현 코드를 작성하기 전에 먼저 API의 인터페이스를 설계하고 문서화하는 것을 강조한다. OpenAPI 문서는 이러한 설계 단계에서 구체적인 산출물이 되어, 프론트엔드와 백엔드 팀이 동일한 계약서를 바탕으로 병렬 개발을 진행할 수 있게 한다. 이는 개발 생산성을 크게 향상시키는 동시에, 인터페이스 불일치로 인한 통합 문제를 사전에 방지한다.
이 기술의 영향력은 단순한 문서화를 넘어선다. 하나의 OpenAPI 문서 파일에서 API 문서 생성, 서버 및 클라이언트 코드 자동 생성, 테스트 케이스 작성, API 관리 플랫폼 설정에 이르기까지 API 라이프사이클 전반을 지원하는 생태계의 중심에 있다. 특히 마이크로서비스 아키텍처가 보편화되면서 서비스 간 명확한 계약을 정의하는 도구로서 그 가치가 더욱 부각되었다. 비록 REST API를 주요 대상으로 하지만, 그래프QL이나 gRPC 같은 다른 API 스타일을 위한 경쟁 사양들도 등장하면서, 웹 API 생태계 내에서 표준화에 대한 지속적인 논의를 촉발시키고 있다.
