웹 API를 기술하기 위한 확장 가능한 타입 수준 DSL인 Servant의 설계와 동기를 소개하고, API 타입을 서버, 클라이언트, 문서 등으로 해석하는 방법과 Haskell의 핵심 기능을 통해 이를 확장하는 기법을 설명합니다.
이 글에서는 웹 API를 기술하기 위한 확장 가능한 타입 수준 DSL인 Servant의 설계와 그 동기를 설명합니다. Servant의 API는 Haskell 타입입니다. 하나의 API 타입은 여러 방식으로 해석될 수 있습니다. 예를 들어 요청을 처리하고 해석하여 적절한 핸들러로 분배하는 서버로서, API의 엔드포인트를 올바르게 질의하는 클라이언트로서, 체계적인 API 문서로서 등으로 해석할 수 있습니다.
Servant는 완전히 확장 가능합니다. API 언어에 새로운 구성을 추가할 수 있고, 새로운 해석을 정의할 수도 있습니다. 이를 가능하게 하는 핵심 Haskell 기능은 데이터 카인드(data kinds), (오픈) 타입 패밀리, (오픈) 타입 클래스입니다. 우리가 사용하는 기법은 범용 제네릭 프로그래밍을 연상시킵니다. 그러나 대부분의 제네릭 프로그래밍 라이브러리가 다양한 도메인의 방대한 종류의 데이터 타입에 대해 프로그램을 자동으로 유도하는 데 관심이 있는 반면, 우리는 API를 서술하는 DSL에서 사용되는 소수의 데이터 타입 계열에만 관심을 둡니다.