Spring 기반의 애플리케이션을 위한 문서화 도구
Spring REST Docs는 실제 테스트 케이스를 기반으로 작동
Spring REST Docs는 Asciidoctor를 사용하여 문서를 작성하고,
테스트 중에 API의 요청과 응답을 자동으로 캡처하여 문서화한다
간단 요약
개발자가 API의 변경 사항을 쉽게 문서화하고, API 사용자에게 정확한 정보를 제공한다.
Controller 패키지를 테스트를 한뒤, 테스트가 성공했을때만 API 문서를 작성해주는 도구다.
📎 **`Swagger` 와의 차이**Swagger는 Spring MVC의 테스트를 실행하지 않고 문서를 생성하기 때문에 실제로 API가 동작하는지 확인할 수 없다.
Swagger는 API의 스펙을 정의하는 것이 목적
Spring Rest Docs는 API의 스펙을 정의하고 테스트하는 것이 목적이다.
또한 Swagger 는 비지니스 로직 코드와 문서를 분리하기 어렵다.
Spring REST Docs는 Asciidoctor와 통합되어 API 문서를 생성한다.
REST Docs는 테스트를 통해 API 사용 방법을 설명하는 문서 스니펫을 생성하고, 이러한 스니펫들을 Asciidoctor 문서에 포함시킨다.
Asciidoctor는 AsciiDoc 문서 포맷을 HTML, PDF 등 다양한 형식으로 변환할 수 있는 강력한 도구이다.
Spring Rest Docs에서 Asciidoctor가 하는 역할
Spring REST Docs와 Asciidoctor를 사용하여 API 문서를 자동으로 생성하고, 생성된 문서를 Spring Boot 애플리케이션의 일부로 만들어 배포하는 과정을 자동화하는 코드…
/******* Start Spring Rest Docs *******/ //(Gradle 빌드 스크립트의 일부로, Kotlin DSL)
val asciidoctorExt: Configuration by configurations.creating // Asciidoctor 확장을 위한 Gradle 설정을 정의
val snippetsDir by extra { "$buildDir/generated-snippets" } // 스니펫(snippets)을 저장할 디렉토리의 경로
tasks {
withType<KotlinCompile> { // 컴파일러 설정을 정의
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "17"
}
}
withType<Test> { // JUnit 플랫폼을 사용하여 테스트를 실행하는 설정
useJUnitPlatform()
}
test {
useJUnitPlatform() // Asciidoctor 작업을 설정하여, 스니펫을 포함한 문서를 생성
outputs.dir(snippetsDir)
}
asciidoctor {
doFirst {
project.delete(files("src/main/resources/static/docs"))
}
inputs.dir(snippetsDir)
configurations("asciidoctorExt")
dependsOn(test)
baseDirFollowsSourceFile()
}
register<Copy>("copyDocs") { // Asciidoctor 작업에 의해 생성된 문서를 애플리케이션의 정적 리소스 디렉토리로 복사
dependsOn(asciidoctor)
from("${asciidoctor.get().outputDir}")
into("src/main/resources/static/docs")
}
bootJar { /Spring Boot의 실행 가능한 JAR 파일을 생성하는 작업에 Asciidoctor 문서를 포함
dependsOn(asciidoctor)
from("${asciidoctor.get().outputDir}") {
into("static/docs")
}
}
build { // copyDocs 작업에 의존하도록 설정하여, 빌드 프로세스 중에 문서가 복사되고 포함되도록
dependsOn("copyDocs")
}
}
/******* End Spring Rest Docs *******/
asciidoctorExt("org.springframework.restdocs:spring-restdocs-asciidoctor")
testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc")
1. 초기 설정 복잡성
2. 테스트 작성 필요성
3. 유지 관리
4. 테스트 기반 접근의 한계
5. 특정 기술 스택에 의존
6. 동적인 내용의 한계