
클라이언트 - 서버, 서버 - 서버 간 통신을 통해 프로그램이 동작하기 위해 필요한 것이 바로 API(Application Programming Interface)다.
API 스펙을 통해 필요한 요청 데이터와 응답 데이터를 정의하고 문서화를 통해 API 정보를 규격화 해둬야 한다.
그러나, 프로그램의 규모가 커지게 되면 문서화를 위한 비용이 그만큼 커지게 된다.
또한, 정확한 API 정보가 업데이트가 되어 있지 않아 잘못된 API 스펙으로 구현이 될 수도 있다.
위와 같은 문제를 방지하고자, API 문서의 자동화가 필요함을 느꼈고 Spring Rest Docs를 개인 프로젝트에 도입하게 되었다.
id 'java'
id 'org.springframework.boot' version '3.1.1'
id 'io.spring.dependency-management' version '1.1.4'
id "org.asciidoctor.jvm.convert" version "3.3.2" //(1)
}
group = 'gpt.service'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
asciidoctorExtensions //(2)
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
ext {
snippetsDir = file('build/generated-snippets') // (3)
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
asciidoctorExtensions 'org.springframework.restdocs:spring-restdocs-asciidoctor' //(4)
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' //(5)
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
outputs.dir snippetsDir //(6)
}
asciidoctor { //(7)
configurations 'asciidoctorExtensions' //(7)-(1)
baseDirFollowsSourceFile() //(7)-(2)
inputs.dir snippetsDir //(7)-(3)
dependsOn test //(7)-(4)
}
task copyDocument(type: Copy) { // (8)
dependsOn asciidoctor
from file("build/docs/asciidoc")
into file("src/main/resources/static")
}
bootJar { (9)
dependsOn copyDocument
}
asciidoctor는 adoc 파일을 html로 변환해주는 역할을 한다.
= GPT Service API 문서
:doctype: book
:source-highlighter: highlightjs
:toc: left
:toclevels: 2
:seclinks:
include::test.adoc[]
./gradlew asciidoctor
위의 모든 과정을 마치면 http://localhost:8080/index.html로 접근 시 API 정보 페이지를 볼 수 있게 된다.
https://docs.spring.io/spring-restdocs/docs/current/reference/htmlsingle/
https://hudi.blog/spring-rest-docs/
https://maily.so/grabnews/posts/b2341a