Swagger์ Spring Restdocs์ ์ฐ์ํ ์กฐํฉ (by OpenAPI Spec)
ใ๏ปฟMSA ํ๊ฒฝ์์์ API ๋ฌธ์ํ๋ ์ด๋ค ์์ผ๋ก ๊ตฌ์ฑํ๋ ๊ฑธ๊น? ์์ปจ๋, ๋ชจ๋์ด 10๊ฐ ์๋ค๊ณ ํ๋ฉด ๊ฐ ๋ชจ๋๋ง๋ค API ๋ฌธ์๊ฐ ๋ง๋ค์ด์ง ํ ๊ณ API ๋ฌธ์๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๊ณตํ๊ธฐ ์ํด์ ๊ฐ๊ฐ์ (10๊ฐ์) URL๋ฅผ ์ ๋ฌํด์ผ ํ ํ ๋ฐ ์ด๊ฒ ๊ณผ์ฐ ํจ์จ์ ์ผ๊น? ๋ฌผ๋ก ๊ธฐ๋ฅ๋ณ๋ก URL์ด ๋ถ๋ฆฌ๋๋ค๋ ์ฅ์ ์ด ์๊ณ ๊ตณ์ด ๋ชจ์๋ณด์๋ฉด ๊ฐ API ๋ฌธ์๋ฅผ ๋ค์ ํ๋ฒ ํฌ๋กค๋ง ํ์ฌ ๊ฒ์ํ ์ ์๋๋ก ์ ๊ณตํ๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ด ๋ ์ ์๋ค. ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ๋ฒ๋ค์ ์๊ตฌ ์ฌํญ์ ์ํ ๋ณ๋์ ์์ ์ ํ๊ฒ ๋๋ ์ผ์ ์ํ ์ผ์ด ๋๋ ๊ฒ ๊ฐ์ ๋ญ๊ฐ ์์ฌ์ ๋ค. ์ข์ ๋ฐฉ๋ฒ์ด ์์๊น?
๊ณ ๋ฏผ์ ์์
ใํ์ฐฝ ๊ถ๊ธ์ฆ์ด ๋จธ๋ฆฟ์์์ ์ง์์ง์ง ์์์๋ Spring ํ๊ตญ ์คํ๋ง ์ฌ์ฉ์ ๋ชจ์ ํ์ด์ค๋ถ ๊ทธ๋ฃน์ ๋ฌธ์๋ ํด๊ฐ๋ฉฐ ๋ฐฉ๋ฒ์ ์ฐพ์๊ฐ๊ณ ์์๋ค.

ใ๏ปฟํ์์ ํจ๊ป ๊ฐ๋ฐ์์ ์ธ์์ ์์ํ ๋ฉ์ง ์น๊ตฌ๋ค์๊ฒ ์ ํํ ์ฌํด 6์ ์ด์ ๊ณ ๋ฏผ์ ํธ์ด๋์ผ๋ฉฐ ์ข์ ๋ฐฉ๋ฒ์ด ์์์ง์ ๋ํ ๋ ผ์๋ฅผ ํ๋ ์ ์ด ์๋ค. ๊ทธ๋ฐ๋ฐ ์น๊ตฌ ์ค ํ ๋ช ์ด ์๊ณ ์์๋ ๊ทธ ์ด์์ ๋ํด์ ๋ค์ ๊บผ๋ด๋ฉฐ URL ํ๋๋ฅผ ๋์ ธ์ค๋ค. ์ฐธ ๊ณ ๋ง์ด ์น๊ตฌ๋ค.

ใ๏ปฟ์ฌํด NHN FORWARD์์ ์งํํ๋ ์ธ์ ์ค์์ MSA ํ๊ฒฝ์์ API ๋ฌธ์ ๊ด๋ฆฌํ๊ธฐ: ์์ฑ๋ถํฐ ๋ฐฐํฌ๊น์ง๋ผ๋ ์ ๋ชฉ์ ๋ด์ฉ์ด์๊ณ , ์ ํํ๊ฒ ํ์๊ฐ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ ์ฝ! ์ง์ด์ ํด๊ฒฐํด ์ค ์ฌ๋ก์๋ค. ์ญ์ ์ธ์์ ์์ฒญ๋ ๊ณ ์๋ค์ด ๋ด๊ฐ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ๋ค์ ์ด๋ฏธ(ํน์ ์ดํ์๋ผ๋) ๊ณ ๋ฏผํ๊ณ ํด๊ฒฐํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๋ ๊ฒ์ ๋๋ผ๊ณ ๊ณต์ ์ ํ์ด ์ด๋ ๊ฒ๋ ๋๋จํ๊ตฌ๋ ํ๋ฉฐ ๋๋ผ์์ ๊ธ์น ๋ชปํ์๋ค.๏ปฟ
ใ๏ปฟ์ด๋ฒ ํฌ์คํ ์์๋ OpenAPI Spec ์ ํ์ฉํ์ฌ Spring Restdocs๋ก ๋ง๋ค์ด์ง๋ ๋ฌธ์๋ฅผ Swagger UI์์ ๋ณด๋ ํ๋ฆ์ ์ค์ ๋ก ๊ตฌํํด ๋ณด๊ณ ์ ํ๋ค. ์ฆ, Swagger ๋ Spring Restdocs ๋ญ๋ก ๋ง๋ค๋ ๊ฐ์ OpenAPI Spec์ ๋ง์ถฐ์๋ง ๋ง๋ ๋ค๋ฉด ํ๊ณณ์์ ๋ณผ ์ ์๊ฒ ๋ค๋ ํฌ๋ง์ด ๋ณด์๋ค. ๋ฉฐ์น ์ ์์ฑํ OpenAPI ์ Swagger-ui ํฌ์คํ ์ ๋ณธ ๋ ์๋ค์ ์ง๊ธ์ ํฌ์คํ ์ ์์ฑํ๊ธฐ ์ํ ๋ฐ๊ฑฐ๋ฆ์ด์๋ค๋ ์ฌ์ค์ ๋์น์ฑ์ ์๋ ์์ ๊ฒ ๊ฐ๋ค.
๏ปฟ์ข์ ๋ด์ฉ์ ๊ณต์ ํด ์ฃผ์ (์ ์ ๊ณ ๋ฏผ์ ์๋ฒฝํ๊ฒ ํด๊ฒฐํด ์ฃผ์ ) NHN FORWARD ๋ฐํ์๋ถ๊ป ์ด ํฌ์คํ ์ ๋น์ด ๊ฐ์ฌ์ ์ธ์ฌ๋ฅผ ๋ณด๋ ๋๋ค. :) ๋น์ฅ ํ ๋ด์๋ ์ ์ฉํด๋ด์ผ๊ฒ ์ด์!!
๏ปฟSpring Restdocs์์ OpenAPI Spec ์ถ์ถ
ใ๏ปฟ๋๊ฐ ๋ ์น์ ํ๊ฒ ์คํ์์ค๋ก ๋ง๋ค์ด๋จ๋ค. https://github.com/ePages-de/restdocs-api-spec ์์ ๊ด๋ จ ๋ด์ฉ์ ํ์ธํ ์๊ฐ ์๋๋ฐ ํด๋น ๋งํฌ์์๋ gradle ๋ฒ์ ์ด๊ณ https://github.com/BerkleyTechnologyServices/restdocs-spec ๋ maven ๋ฒ์ ์ด๋ผ๊ณ ํ๋ค. ๋ง์นจ ํ์์ Github์ Maven ๋ฒ์ ์ผ๋ก SpringRestdocs๋ฅผ ์ธํ ํด๋ Repository ๊ฐ ์์ด์ ์ด๋ฅผ ํ์ฉํด๋ณด๊ณ ์ ํ๋ค.๏ปฟ
pom.xml ์ถ๊ฐ
ใ๏ปฟ๊ด๋ จ dependency๋ฅผ ์ถ๊ฐํ์. jcenter๋ผ๊ณ bintray.com ์์ ์ด์๋๋ Maven Repository์ ์ฌ๋ ค์ง ์คํ์์ค์ด๋ repository ๋ ์ถ๊ฐํด ์ฃผ์.
<properties>
<restdocs-api-spec.version>0.10.0</restdocs-api-spec.version>
<restdocs-spec.version>0.19</restdocs-spec.version>
</properties>
<repositories>
<repository>
<id>jcenter</id>
<url>https://jcenter.bintray.com</url>
</repository>
</repositories>
<dependency>
<groupId>com.epages</groupId>
<artifactId>restdocs-api-spec</artifactId>
<version>${restdocs-api-spec.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.epages</groupId>
<artifactId>restdocs-api-spec-mockmvc</artifactId>
<version>${restdocs-api-spec.version}</version>
<scope>test</scope>
</dependency>
๏ปฟ์์ dependency์์ ์ ๊ณตํด ์ฃผ๋ ๋ชจ๋๋ก ํ ์คํธ์ SpringRestdocs๋ฅผ ๋ง๋ค์๋ค๋ฉด OpenAPI Spec ์ ๋ง๋ค์ด ์ฃผ๋ plugin ๋ํ ์ถ๊ฐํด ์ฃผ์
<pluginRepositories>
<pluginRepository>
<id>jcenter</id>
<url>https://jcenter.bintray.com</url>
</pluginRepository>
</pluginRepositories>
<plugin>
<groupId>com.github.berkleytechnologyservices.restdocs-spec</groupId>
<artifactId>restdocs-spec-maven-plugin</artifactId>
<version>${restdocs-spec.version}</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<specification>OPENAPI_V3</specification>
<format>JSON</format>
<outputDirectory>${project.build.directory}/classes/static/docs</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
๏ปฟ์ plugin ์ค์ ์ ๋ณด๋ฉด format ์ JSON์ผ๋ก ํ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ YAML๋ก๋ ๋ง๋ค ์ ์๋ค. ์์ธํ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์์์ ๋ช ์ํ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด๋ณด๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.