Swagger๋ ๊ฐ๋ฐ์๊ฐ REST ์น ์๋น์ค๋ฅผ ์ค๊ณ, ๋น๋, ๋ฌธ์ํ, ์๋นํ๋ ์ผ์ ๋์์ฃผ๋ ๋ํ ๋๊ตฌ ์ํ๊ณ์ ์ง์์ ๋ฐ๋ ์คํ ์์ค ์ํํธ์จ์ด ํ๋ ์์ํฌ์ด๋ค.
Swagger๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐํ API๋ฅผ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ Swagger๊ฐ ์์ฑํ ํ์ด์ง์ ์ ์ํ์ฌ ๋๋ฌ๋ณด๊ณ ํ ์คํธ ํด๋ณด๋ฉฐ ์ง์ ์ปจํธ๋กค ๋ฐ ๊ฐ๋ฐ์ ํธ๋ฆฌํ๊ฒ ์ ์ฉํ ์ ์๋๋ก ๋ง๋ ํ๋ ์์ํฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
SpringFox ์ SpringDoc์ ๋ ๋ค SpringFramework๋ก ๊ฐ๋ฐํ๋ ํ๋ก์ ํธ์ Swgger ๋ฌธ์๋ฅผ ๊ฐํธํ๊ฒ ์์ฑํ ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Anntation๋ค์ด ์ฝ๊ฐ์ฉ ๋ค๋ฅผ๋ฟ ๊ธฐ๋ฅ์ ๊ฑฐ์ ๋์ผํ๋ค.
SpringFox๋ Maven Repository ๊ธฐ์ค 2020๋
7์ ๊ธฐ์ค์ผ๋ก ์
๋ฐ์ดํธ๊ฐ ๋๊ฒผ์ผ๋ฉฐ, SpringDoc์ 2023๋
5์๊น์ง ์
๋ฐ์ดํธ๊ฐ ์งํ๋์ด์๊ธฐ ๋๋ฌธ์ SpringDoc๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ์๋ค.
๋ํ SpringDoc์ด ๊ทธ๋ฃน๊ฐ API์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค๊ณ ํ๋๋ฐ, ํฌ๊ฒ ์๋ฏธ ์๋๊ฑฐ ๊ฐ์ผ๋ฏ๋ก ์ ๊ฒฝ์ฐ์ง ์์๋ ๋ ๊ฒ ๊ฐ๋ค.
<!-- Swagger 3 SpringDoc Dependency-->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.7.0</version>
</dependency>
@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI openAPI(@Value("${springdoc.version}") String version,
@Value("${springdoc.title}") String title,
@Value("${springdoc.description}") String description) {
Info info = new Info()
.title(title)
.version(version)
.description(description);
return new OpenAPI()
.components(new Components())
.info(info);
}
}
springdoc:
version: v1.0.0
title: Swagger 3.0 - SpringDoc Title
description: Swagger 3.0 - SpringDoc Description
packages-to-scan: com.boot.controller
swagger-ui:
path: /api-docs
default-consumes-media-type: application/json; charset=UTF-8
default-produces-media-type: application/json; charset=UTF-8
@Tag(name = "Template", description = "Template Description")
public interface ITemplateController {
@Operation(summary = "Get Request Template", description = "HttpMethod.Get Method๋ฅผ ์ด์ฉํ HTTP Request")
@Parameters({
@Parameter(name = "name", description = "TestGetRequestPayload ์ Test Field", required = true)
})
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "successful operation", content = @Content(schema = @Schema(implementation = UserInfoResponsePayload.class))),
@ApiResponse(responseCode = "400", description = "bad request operation", content = @Content(schema = @Schema(implementation = ResponsePayload.class)))
})
ResponseEntity<ResponsePayload> httpMethodGet(@ParameterObject @ModelAttribute @Validated GetMethodRequestPayload payload, BindingResult error) throws CustomRunTimeException;
@Operation(summary = "Post Request Template", description = "HttpMethod.Post Method๋ฅผ ์ด์ฉํ HTTP Request")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "successful operation", content = @Content(schema = @Schema(implementation = PostMethodResponsePayload.class))),
@ApiResponse(responseCode = "201", description = "created operation", content = @Content(schema = @Schema(implementation = PostMethodResponsePayload.class))),
@ApiResponse(responseCode = "400", description = "bad request operation", content = @Content(schema = @Schema(implementation = ResponsePayload.class)))
})
ResponseEntity<ResponsePayload> httpMethodPost(@RequestBody @Validated PostMethodRequestPayload payload, BindingResult error) throws CustomRunTimeException;
@Operation(summary = "Put Request Template", description = "HttpMethod.Put Method๋ฅผ ์ด์ฉํ HTTP Request")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "successful operation", content = @Content(schema = @Schema(implementation = PostMethodResponsePayload.class))),
@ApiResponse(responseCode = "201", description = "created operation", content = @Content(schema = @Schema(implementation = PostMethodResponsePayload.class))),
@ApiResponse(responseCode = "400", description = "bad request operation", content = @Content(schema = @Schema(implementation = ResponsePayload.class)))
})
ResponseEntity<ResponsePayload> httpMethodPut(@RequestBody @Validated PostMethodRequestPayload payload, BindingResult error) throws CustomRunTimeException;
@Operation(summary = "Delete Request Template", description = "HttpMethod.Delete Method๋ฅผ ์ด์ฉํ HTTP Request")
@Parameters({
@Parameter(name = "tempString", description = "TestPostRequestPayload ์ tempString Field", required = true)
})
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "successful operation", content = @Content(schema = @Schema(implementation = PostMethodResponsePayload.class))),
@ApiResponse(responseCode = "400", description = "bad request operation", content = @Content(schema = @Schema(implementation = ResponsePayload.class)))
})
ResponseEntity<ResponsePayload> httpMethodDelete(@ParameterObject @RequestBody @Validated PostMethodRequestPayload payload, BindingResult error) throws CustomRunTimeException;
}
Swagger์ ๋ํด์ ์ค๋ ๊ธฐ๋ณธ์ ์ธ ์ค์ ๋ฐฉ๋ฒ๊ณผ ๊ฒฐ๊ณผ์ ๋ํด์ ๊ธฐ๋กํ์๋ค.
๋ค์์๋ Swagger์ Anntation์ ๋ํด์ ์์ธํ ๊ธฐ๋กํ๋ ค๊ณ ํ๋ค.
๋ฐฑ์๋์ ํ๋ก ํธ์๋์ ํ์
์ ์ํด์๋ ๋ฐ๋์ ํ์ํ ํ๋ ์์ํฌ๋ผ๊ณ ์๊ฐํ๋ค.