DSL 인터페이스
DSL을 제공할 수 있도록 설계된 인터페이스들에 대해서 기술합니다.
전체 구조

Spring MVC는 핸들러를 통해 HTTP 요청과 응답을 매핑합니다. 그리고 HTTP 요청과 응답을 구성하는 컴포넌트들(쿼리 파라미터, 경로변수, 바디 등)은 핸들러의 어노테이션, 파라미터, 리턴타입으로 매핑합니다. 그리고 Spring REST Docs는 각 컴포넌트들을 구성하는 필드에 대해 설명을 작성하고, 이를 통합하여 문서화 할 수 있도록 도와줍니다.
Spring REST Docs에서는 각 컴포넌트들을 구성하는 필드에 대한 설명을 AbstractDescriptor로서 표현하고, 이를 Snippet으로 통합하고 있습니다.
그리고 통합된 Snippet은 문서의 식별자(identifier)와 함께 document함수를 통해
API 호출 결과를 핸들링하여 최종적으로 asciidoc 등의 형식으로 스니펫을 생성합니다.
이 라이브러리는 DSL을 제공함과 동시에 이러한 Spring REST Docs의 구조에 맞추기 위해
AbstractDescriptor에 대응되는 ApiField, Snippet에 대응되는 ApiComponent,
그리고 하나의 API에 대해 모든 Snippet을 통합하는 ApiSpec,
작성된 DSL을 Snippet으로 변환시켜주는 SnippetGenerator 총 4가지의 인터페이스를 만들어 놓았습니다.
그리고 DSL을 제공하진 않지만, 핸들러를 구성하는 요소들을 ApiField로 변환할 수 있도록
각 요소의 정보를 담는 HandlerElement라는 인터페이스도 있습니다.
하나의 HTTP API 예시를 들어 이 4가지 인터페이스에 대해 쉽게 파악해봅시다.
HTTP Message
Request
GET /some-api?id=abc&num=5 HTTP/1.1
Content-Type: application/json
Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 85
{
"data": "some data"
}
위와 같은 메시지로 통신되는 API가 있다고 해봅시다. 여기서 메시지를 구성하는 컴포넌트와 필드를 추출하면 아래와 같습니다.
| 컴포넌트 | 필드 |
|---|---|
| 쿼리 파라미터 | id, num |
| 응답 바디 | data |
ApiField는 위 표에 작성된 필드에 대해 문서를 작성할 수 있는 DSL 인터페이스 입니다.
그리고 이러한 ApiField타입의 프로퍼티를 각 컴포넌트 별로 통합해놓는 인터페이스가 바로 ApiComponent입니다.
그리고 생성된 ApiComponent가 어떤 컴포넌트인지에 따라 적합한 SnippetGenerator