ReDoc

ReDoc은 OpenAPI(이전의 Swagger) 명세를 기반으로 한 오픈 소스 API 문서 생성 도구이다. 2016년에 Rebilly에 의해 개발된 이 도구는 단일 HTML 파일로 깔끔하고 반응형 있는 API 문서를 생성하는 데 특화되어 있다.

ReDoc의 핵심 가치는 세 가지이다:

  • 개발자 친화적 인터페이스: 사용하기 쉽고 탐색하기 쉬운 문서 제공
  • 시각적 매력: 미학적으로 세련된 문서 생성
  • 유연성과 맞춤화: 다양한 요구에 맞게 조정 가능

ReDoc의 주요 기능

단일 페이지 디자인

ReDoc은 단일 페이지 애플리케이션(SPA) 접근 방식을 취한다. 이는 사용자가 페이지를 전환하지 않고도 모든 API 문서에 접근할 수 있음을 의미한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<!-- 기본적인 ReDoc 통합 -->
<!DOCTYPE html>
<html>
  <head>
    <title>API 문서</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
  </head>
  <body>
    <redoc spec-url="https://petstore.swagger.io/v2/swagger.json"></redoc>
    <script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"></script>
  </body>
</html>

세 패널 레이아웃

ReDoc의 인터페이스는 세 개의 주요 패널로 구성된다:

  • 왼쪽: 탐색 메뉴로, 모든 엔드포인트와 모델의 개요 제공
  • 중앙: 선택한 엔드포인트에 대한 자세한 설명
  • 오른쪽: 요청 및 응답 스키마와 예제

이 레이아웃은 개발자가 API를 이해하고 사용하는 데 필요한 모든 정보를 한눈에 볼 수 있게 해준다.

반응형 디자인

ReDoc은 모바일 기기부터 대형 데스크톱 화면까지 모든 화면 크기에 맞게 조정된다. 이는 개발자가 이동 중에도 API 문서를 쉽게 참조할 수 있게 해준다.

코드 샘플 지원

OpenAPI 명세에 정의된 코드 샘플(x-code-samples 확장)을 지원하여 다양한 프로그래밍 언어로 API를 어떻게 사용하는지 보여줄 수 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# OpenAPI 명세의 코드 샘플 예제
paths:
  /users:
    get:
      summary: 사용자 목록 조회
      x-code-samples:
        - lang: JavaScript
          source: |
            fetch('https://api.example.com/users')
              .then(response => response.json())
              .then(data => console.log(data));
        - lang: Python
          source: |
            import requests
            response = requests.get('https://api.example.com/users')
            data = response.json()
            print(data)

검색 기능

ReDoc은 강력한 검색 기능을 제공하여 사용자가 엔드포인트, 매개변수, 모델 등을 빠르게 찾을 수 있게 한다.

테마 맞춤화

로고, 색상, 폰트 등을 통해 문서를 회사 브랜드와 일치시킬 수 있다.

1
2
3
4
5
6
<redoc 
  spec-url="https://petstore.swagger.io/v2/swagger.json"
  theme-options="{'logo': {'gutter': '20px', 'url': 'https://example.com/logo.png'},
                 'colors': {'primary': {'main': '#32329f'}}, 
                 'typography': {'fontFamily': 'Arial, sans-serif'}}">
</redoc>

ReDoc 설치 및 사용 방법

CDN 사용 (가장 간단한 방법)

1
2
<redoc spec-url="경로/swagger.json"></redoc>
<script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"></script>

NPM을 통한 설치

1
2
3
4
5
# NPM 설치
npm install redoc --save

# 또는 Yarn 사용
yarn add redoc

React 애플리케이션에서 사용:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import { RedocStandalone } from 'redoc';

const ApiDocs = () => (
  <RedocStandalone
    specUrl="path/to/swagger.json"
    options={{
      nativeScrollbars: true,
      theme: { colors: { primary: { main: '#00abff' } } }
    }}
  />
);

export default ApiDocs;

CLI 도구 사용

ReDoc CLI를 사용하면 정적 HTML 파일을 생성할 수 있다:

1
2
3
4
5
# ReDoc CLI 설치
npm install -g redoc-cli

# HTML 파일 생성
redoc-cli bundle openapi.yaml -o index.html

ReDoc과 OpenAPI/Swagger 통합

ReDoc은 OpenAPI 명세(버전 2.0, 3.0 및 3.1)와 원활하게 작동한다. 명세는 YAML 또는 JSON 형식일 수 있으며, 로컬 파일이나 URL을 통해 제공될 수 있다.

OpenAPI 명세 요소 활용

ReDoc은 다음과 같은 OpenAPI 명세 요소를 특별히 활용한다:

  • 태그(tags): 엔드포인트 그룹화 및 탐색 메뉴 구성
  • 설명(descriptions): Markdown 지원으로 풍부한 텍스트 형식
  • x-tagGroups: 여러 태그를 상위 그룹으로 구성
  • x-code-samples: 다양한 언어의 코드 예제 표시

예제:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
openapi: 3.0.0
info:
  title: 샘플 API
  version: 1.0.0
  description: |
    # 소개
    이 API는 사용자 관리를 위한 엔드포인트를 제공합니다.
    
    ## 인증
    모든 요청에는 Bearer 토큰이 필요합니다.
x-tagGroups:
  - name: 핵심 리소스
    tags:
      - 사용자
      - 인증
tags:
  - name: 사용자
    description: 사용자 관리 엔드포인트
paths:
  /users:
    get:
      tags:
        - 사용자
      summary: 모든 사용자 조회
      x-code-samples:
        - lang: curl
          source: curl -H "Authorization: Bearer TOKEN" https://api.example.com/users

ReDoc 고급 기능 및 맞춤화

스타일 맞춤화

ReDoc은 theme-options 속성을 통해 광범위한 스타일 맞춤화를 제공한다:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
const options = {
  theme: {
    typography: {
      fontSize: '16px',
      headings: { fontFamily: 'Montserrat, sans-serif' }
    },
    sidebar: {
      backgroundColor: '#f5f5f5',
      textColor: '#333333'
    },
    // 기타 스타일 옵션
  }
};

확장성 및 플러그인

ReDoc은 플러그인 시스템을 통해 확장될 수 있으며, 커스텀 컴포넌트도 통합할 수 있다.

서버 렌더링

검색 엔진 최적화(SEO)와 성능을 위한 서버 사이드 렌더링(SSR) 지원:

1
2
3
4
5
6
7
8
import { renderToString } from 'react-dom/server';
import { createStore } from 'redoc';
import { Redoc, RedocRawOptions } from '@redoc/react';

const renderStaticRedoc = async (spec, options = {}) => {
  const store = await createStore(spec, options);
  return renderToString(<Redoc store={store} />);
};

ReDoc vs. 다른 API 문서화 도구

ReDoc vs. Swagger UI

  • ReDoc: 더 깔끔하고 미학적인 디자인, 더 나은 렌더링 성능, 단일 페이지 레이아웃
  • Swagger UI: 상호작용 기능 강조, API 테스트 콘솔 내장, 넓은 사용자 기반

ReDoc vs. Stoplight Elements

  • ReDoc: 더 간단한 설정, 더 가벼운 크기
  • Stoplight Elements: 더 많은 맞춤화 옵션, 더 현대적인 UI

ReDoc vs. Slate

  • ReDoc: OpenAPI 명세 기반, 명세로부터 자동 생성
  • Slate: 보다 일반적인 문서화 도구, 더 많은 수동 작업 필요하지만 더 큰 유연성 제공

ReDoc의 실제 사용 사례

  1. GitHub API
    GitHub은 자사의 API 문서화에 ReDoc을 활용하여 개발자들에게 명확하고 탐색하기 쉬운 인터페이스를 제공한다.
  2. 금융 및 결제 API
    Stripe와 같은 금융 서비스 API는 ReDoc을 사용하여 복잡한 금융 개념과 데이터 구조를 명확하게 설명한다.
  3. IoT 및 하드웨어 API
    IoT 플랫폼은 ReDoc을 사용하여 다양한 디바이스 및 센서 인터페이스를 문서화한다.

ReDoc 모범 사례

  1. 명확한 태그 구조
    효과적인 탐색을 위한 잘 구성된 태그 시스템을 설계한다:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    x-tagGroups:
      - name: 핵심 API
        tags:
          - 인증
          - 사용자
      - name: 고급 기능
        tags:
          - 분석
          - 보고서
    
  2. 풍부한 Markdown 설명
    Markdown을 활용하여 정보가 풍부하고 시각적으로 매력적인 설명을 제공한다:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    info:
      description: |
        # API 시작하기
    
        ## 인증
        모든 요청에는 `Authorization` 헤더가 필요합니다.
    
        ```
        Authorization: Bearer YOUR_API_KEY
        ```
    
        ## 속도 제한
        API는 분당 100개의 요청으로 제한됩니다.
    
  3. 철저한 예제
    각 엔드포인트에 대해 요청 및 응답 예제를 제공한다:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    paths:
      /users:
        post:
          requestBody:
            content:
              application/json:
                examples:
                  사용자_생성:
                    value:
                      name: "홍길동"
                      email: "hong@example.com"
          responses:
            '201':
              content:
                application/json:
                  examples:
                    성공:
                      value:
                        id: "123"
                        name: "홍길동"
                        email: "hong@example.com"
    

ReDoc의 제한 사항 및 해결 방법

  1. 상호작용 부족
    ReDoc은 Swagger UI와 달리 내장된 API 테스트 콘솔을 제공하지 않는다. 해결책으로 Swagger UI와 ReDoc을 함께 제공하거나, 별도의 API 플레이그라운드를 연결할 수 있다.

  2. 대규모 API의 성능
    매우 큰 API 명세의 경우 성능이 저하될 수 있다.
    이를 해결하기 위해:

    • 명세를 여러 파일로 분할하고 $ref를 사용하여 참조
    • 더 강력한 하드웨어에서 빌드 진행
    • 정적 HTML 파일 생성 후 제공
  3. 맞춤화 한계
    일부 고급 맞춤화 요구 사항은 ReDoc의 기본 옵션으로 충족되지 않을 수 있다. 해결책으로 소스 코드를 포크하여 수정하거나, React 컴포넌트로 ReDoc을 래핑하여 추가 기능을 제공할 수 있다.

ReDoc 개발 및 커뮤니티

ReDoc은 활발한 오픈 소스 프로젝트로, GitHub(https://github.com/Redocly/redoc)에서 개발되고 있다. 버그 보고, 기능 요청 및 풀 리퀘스트를 통해 프로젝트에 기여할 수 있다.

현재 ReDoc은 Redocly라는 회사에서 유지 관리하고 있으며, 이 회사는 무료 오픈 소스 버전 외에도 엔터프라이즈급 API 문서화 솔루션을 제공한다.


용어 정리

용어설명

참고 및 출처