Spring REST Docs로 API 문서 만들기


지금까지 API 문서는 주로 Swagger, Postman을 사용해서 만들었다.

API 문서를 만들면서 테스트 코드도 확인하고 로직도 다시 확인할 수 있어서
크게 불편하거나 귀찮았던 적은 없었지만 Swagger는 코드에 포함되니 그 부분이 거슬린다고 생각했었다.

마침 Spring REST Docs라는 것을 알게 되어 적용해 봤다.


Spring REST Docs 적용

gradle 설정

id 'org.asciidoctor.jvm.convert' version '3.3.2'

gradle 7 이상은 위 버전으로 설정해야 한다.


ext {
    snippetsDir = file('build/generated-snippets')
}

생성된 스니펫의 출력 위치 정의


asciidoctor {
    dependsOn test
    configurations 'asciidoctorExtensions'
    inputs.dir snippetsDir
    sources {
        include("**/index.adoc", "**/common/*.adoc")
    }
    baseDirFollowsSourceFile()
}


asciidoctorExtensions 'org.springframework.restdocs:spring-restdocs-asciidoctor'
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'


task copyDocument(type: Copy) {
    dependsOn asciidoctor
    from file("build/docs/asciidoc")
    into file("src/main/resources/static/docs")
}

build {
    dependsOn copyDocument
}




Test 코드 작성 (Junit5)

public interface ApiDocumentUtil {
	
	static OperationRequestPreprocessor getDocumentRequest() {
		// Request Spec을 정렬해서 출력해줌
		return preprocessRequest(prettyPrint());
	}

	static OperationResponsePreprocessor getDocumentResponse() {
		// Response Spec을 정렬해서 출력해줌
		return preprocessResponse(prettyPrint());
	}

}


.andDo(document("get-item", // 스니펫 폴더명
    ApiDocumentUtil.getDocumentRequest(), 
    ApiDocumentUtil.getDocumentResponse(),
    responseFields( // response fiels 정의, 같은 형태로 request도 정의 가능하다. 
        fieldWithPath("name").description("상품 이름"),
        fieldWithPath("price").description("가격"),
        fieldWithPath("stockQuantity").description("재고 수량"),
        fieldWithPath("createdAt").description("제품 등록 일자"),
        fieldWithPath("updatedAt").description("제품 정보 수정 일자")
    )));


== 상품 조회 

==== /api/items/{id} (GET)

.response
include::{snippets}/get-item/response-fields.adoc[]

.test request
include::{snippets}/get-item/http-request.adoc[]

.test response
include::{snippets}/get-item/http-response.adoc[]

더 자세한 작성법은 https://narusas.github.io/2018/03/21/Asciidoc-basic.html 여기서 확인할 수 있다.




참고