Grape API 문서화를 위한 OasCore 통합 및 Open API Specification 3.1 지원

OasGrape: An Alternative for Generating Your API Documentation

작성자
발행일
2025년 08월 16일

핵심 요약

  • 1 Grape 프레임워크에서 Open API Specification(OAS) 3.1을 지원하는 OasCore 통합 솔루션이 제시되었습니다.
  • 2 기존 grape-swagger 젬의 OAS 2.0 한계와 UI 부재 문제를 극복하는 새로운 문서화 접근법을 소개합니다.
  • 3 Grape의 desc 및 detail 블록 내부에 OasCore 태그를 삽입하여 API 엔드포인트를 문서화하는 방식을 활용합니다.

도입

Ruby 기반의 강력한 API 개발 프레임워크인 Grape는 웹 애플리케이션의 API 구축에 널리 활용됩니다. 그러나 Grape API의 인터랙티브 문서화는 주로 grape-swagger 젬에 의존해왔으며, 이는 Open API Specification(OAS) 2.0만 지원하고 별도의 사용자 인터페이스(UI)를 제공하지 않아 많은 개발자에게 불편함을 야기했습니다. 본 글은 이러한 한계를 극복하고, Rails, Hanami, Rage 등 다른 프레임워크에서 성공적으로 적용된 OasCore를 Grape에 통합하여 OAS 3.1 및 내장 UI를 제공하는 새로운 솔루션을 제시합니다.

Grape API를 위한 OAS 3.1 문서화 솔루션을 구축하기 위한 과정은 두 가지 주요 단계로 진행되었습니다.

1. 사용 가능한 엔드포인트 확보

  • 라우트 추출: 애플리케이션 내의 모든 Grape 엔드포인트를 식별하는 것이 첫 번째 과제였습니다. 이를 위해 grape-rails-routes 젬의 코드를 참고하여 Grape::API를 상속하는 모든 클래스에서 라우트 정보를 추출하는 방법을 고안했습니다. ruby def extract_grape_routes grape_klasses = ObjectSpace.each_object(Class).select { |klass| klass < Grape::API } routes = grape_klasses.flat_map(&:routes).uniq { |r| r.path + r.request_method.to_s } routes = routes.map { |route| OasRouteBuilder.build_from_grape_route(route) } filter_routes(routes) end 이 코드를 통해 Grape 클래스에 정의된 모든 고유한 라우트 목록을 확보할 수 있었습니다.

  • 문서화 정보 접근의 난점: 그러나 Grape 엔드포인트의 실제 로직은 인스턴스 메서드가 아닌 Proc 형태로 정의되어 있어, 주석을 직접 파싱하여 문서화 정보를 추출하는 것은 거의 불가능하다는 문제에 직면했습니다.

2. Grape의 descdetail 활용

  • 솔루션: 위 문제에 대한 가장 간단하고 효과적인 해결책으로, Grape 자체에서 제공하는 desc 블록과 detail 태그를 활용하는 방식을 채택했습니다.

  • OasCore 태그 삽입: detail 태그 내부에 OasCore의 문서화 태그(예: @summary, @parameter, @response, @response_example 등)를 직접 포함시켜 OpenAPI 스펙을 정의합니다.

  • 예시: ruby desc "Returns a list of Users." do detail <<~OAS_GRAPE # @summary Returns a list of Users. # @parameter offset(query) [Integer] Used for pagination of response data. default: (0) minimum: (0) # @parameter limit(query) [Integer] Maximum number of items per page. default: (25) minimum: (1) maximum: (100) # # @parameter status(query) [Array<String>] Filter by status. enum: (active,inactive,deleted) # # @parameter X-front(header) [String] Header for identifying the front. minLength: (1) maxLength: (50) # # @response Success response(200) [Array<Hash{ id: Integer}>] # # @response_example Success(200) # # [ JSON # # [ # # { "id": 1, "name": "John", "email": "[email protected]" }, # # { "id": 2, "name": "Jane", "email": "[email protected]" } # # ] # # ] OAS_GRAPE end get do { users: @@users } end 이러한 접근 방식은 기존 OasCore 통합 방식과는 다소 차이가 있지만, Grape API를 위한 OAS 3.1 문서화 및 내장 UI 제공이라는 목표를 성공적으로 달성할 수 있게 합니다.

결론

본 글에서 제시된 OasCore를 Grape 프레임워크에 통합하는 솔루션은 기존 `grape-swagger`의 한계를 넘어선 Open API Specification 3.1 지원과 내장 UI를 제공합니다. 비록 엔드포인트 정의 방식의 특성상 Grape의 `desc` 및 `detail` 블록을 활용하여 OasCore 태그를 직접 삽입하는 방식이 채택되었지만, 이는 Grape API 개발자들이 복잡한 설정 없이도 강력하고 인터랙티브한 문서를 생성할 수 있는 가장 실용적인 방법입니다. 이 솔루션은 Grape를 사용하는 프로젝트의 API 문서화 효율성을 크게 향상시키고, 개발 워크플로우를 간소화하는 데 기여할 것입니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!