Springdoc OpenApi
Spring μ ν리μΌμ΄μ
μ μν OpenAPI 3.0 λ¬Έμλ₯Ό μλ μμ±νλ λΌμ΄λΈλ¬λ¦¬
REST API μ API λ¬Έμλ₯Ό μλν ν΄μ£Όλ λꡬμ
λλ€.
API κ°λ° λ¬Έμν λꡬ
API κ°λ° λ¬Έμν λꡬλ API μλν¬μΈνΈ, μμ², μλ΅ λ° κ΄λ ¨ μ 보λ₯Ό λ¬Έμννμ¬ κ°λ°μλ€μκ² API μ¬μ© λ°©λ²μ μ 곡νλ μννΈμ¨μ΄ λꡬμ
λλ€.
μ’ λ₯
β’
Swagger
Swagger (OpenAPI)
REST APIλ₯Ό μ€κ³, ꡬμΆ, λ¬Έμν λ° μ¬μ©νλ λ° λμμ΄ λ μ μλ OpenAPI μ¬μμ κΈ°λ°μΌλ‘ ꡬμΆλ μ€ν μμ€ λꡬ μΈνΈμ
λλ€.
https://swagger.io/docs/specification/about/
β’
API μ€κ³, λΉλ, λ¬Έμν λ° ν
μ€νΈλ₯Ό μν ν΅ν© ν΄.
β’
OpenAPI νμ€μ μ€μνλ©°, RESTful APIλ₯Ό μ½κ² λμμΈνκ³ κ΄λ¦¬ν μ μμ.
// Springdoc openapi
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0'
SQL
볡μ¬
SwaggerConfig.java
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
@Configuration
public class SwaggerConfig {
@Bean
public GroupedOpenApi publicApi() {
return GroupedOpenApi.builder()
.group("aloha") // κ·Έλ£Ήλͺ
μ€μ
.pathsToMatch("/**") // κ²½λ‘ μ€μ
.build();
}
@Bean
public OpenAPI springShopOpenAPI() {
return new OpenAPI()
.info(new Info().title("Test Proejct API")
.description("Test νλ‘μ νΈ API μ
λλ€.")
.version("v0.0.1"));
}
}
Java
볡μ¬
SpringDoc OpenAPI μ£Όμ μ΄λ Έν μ΄μ
μ΄λ
Έν
μ΄μ
| μ€λͺ
|
@Operation | APIμ μμ
(λ©μλ) μμ€μμ μΆκ°μ μΈ μ 보λ₯Ό μ 곡νλ μ΄λ
Έν
μ΄μ
μ
λλ€. HTTP λ©μλμ λν μ€λͺ
μ μ 곡νκ³ , λ¬Έμνλλ μλν¬μΈνΈμ λν μΆκ° μ€λͺ
μ λ¬ μ μμ΅λλ€. |
@ApiResponse | νΉμ HTTP μλ΅ μ½λμ λν μ€λͺ
μ μ 곡ν©λλ€. @ApiResponsesμ ν¨κ» μ¬μ©λλ©°, κ° μλ΅ μ½λμ λν μ€λͺ
, λ°ν νμ
λ±μ μ€μ ν μ μμ΅λλ€. |
μμ: @ApiResponse(responseCode = "200", description = "OK") | |
@Schema | λͺ¨λΈ ν΄λμ€μ νλμ λν λ©νλ°μ΄ν°λ₯Ό μ 곡νμ¬ OpenAPI μ€νμ λ§λ λ¬Έμλ₯Ό μμ±ν μ μκ² ν΄μ€λλ€. νλ μ΄λ¦, νμ
, μ€λͺ
λ±μ μΆκ°ν μ μμ΅λλ€. |
μμ: @Schema(description = "User ID") private String id; | |
@Tag | API μλν¬μΈνΈλ₯Ό νκ·Έλ‘ κ·Έλ£Ήννμ¬ λ¬Έμμμ κ΄λ ¨λ μλν¬μΈνΈλ₯Ό λ¬Άμ μ μκ² ν΄μ£Όλ μ΄λ
Έν
μ΄μ
μ
λλ€. |
μμ: @Tag(name = "User", description = "Operations related to user") | |
@RequestBody | μμ² λ³Έλ¬Έμ λν λ©νλ°μ΄ν°λ₯Ό λ¬Έμννλ λ° μ¬μ©λ©λλ€. APIμ μμ² λ³Έλ¬Έμ λν μ€λͺ
μ μΆκ°ν μ μμ΅λλ€. |
μμ: @RequestBody(description = "User object that needs to be added") | |
@RequestParam | 쿼리 νλΌλ―Έν°μ λν λ©νλ°μ΄ν°λ₯Ό λ¬Έμνν©λλ€. νλΌλ―Έν°μ μ€λͺ
, νμ μ¬λΆ λ±μ μ μν μ μμ΅λλ€. |
μμ: @RequestParam(description = "User ID", required = true) | |
@PathVariable | κ²½λ‘ λ³μμ λν λ©νλ°μ΄ν°λ₯Ό λ¬Έμνν©λλ€. API κ²½λ‘μμ λ³μλ‘ μ¬μ©λλ κ°μ λν μ€λͺ
μ μΆκ°ν μ μμ΅λλ€. |
μμ: @PathVariable(description = "ID of the user") | |
@Deprecated | APIκ° λ μ΄μ μ¬μ©λμ§ μμμ λνλ΄λ μ΄λ
Έν
μ΄μ
μ
λλ€. API λ¬Έμμ "Deprecated" λ©μμ§λ₯Ό μλμΌλ‘ μΆκ°ν μ μμ΅λλ€. |
μμ: @Deprecated @Operation(description = "This endpoint is deprecated and will be removed in the future") | |
@Hidden | OpenAPI λ¬Έμμμ ν΄λΉ μλν¬μΈνΈλ₯Ό μ¨κΈ°κ³ μΆμ λ μ¬μ©ν©λλ€. ν΄λΉ APIκ° λ¬Έμμ νμλμ§ μκ² ν μ μμ΅λλ€. |
μμ: @Hidden |