From 9d4dc6509e8f762f19aec6d00a315e7a4bbb35be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EB=AF=B8?= Date: Thu, 6 Aug 2026 15:55:40 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20springdoc-openapi=EB=A1=9C=20Swagger=20?= =?UTF-8?q?API=20=EB=AC=B8=EC=84=9C=20=EC=9E=90=EB=8F=99=ED=99=94=20?= =?UTF-8?q?=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 REST 컨트롤러/DTO에 springdoc-openapi-ui를 붙여 /swagger-ui/index.html에서 전체 API 스펙(26개 엔드포인트)을 자동 생성한다. accessToken/refreshToken 커스텀 헤더 인증 방식에 맞춰 Swagger UI의 Authorize에서 두 헤더 값을 직접 입력해 테스트할 수 있도록 SecurityScheme을 구성했다. --- build.gradle | 3 ++ .../server/config/swagger/SwaggerConfig.java | 43 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/main/java/org/runnect/server/config/swagger/SwaggerConfig.java diff --git a/build.gradle b/build.gradle index 84f1a4a..8ed774a 100644 --- a/build.gradle +++ b/build.gradle @@ -75,6 +75,9 @@ dependencies { // Sentry implementation 'io.sentry:sentry-spring-boot-starter:4.3.0' + // Swagger (OpenAPI) + implementation 'org.springdoc:springdoc-openapi-ui:1.7.0' + } tasks.named('test') { diff --git a/src/main/java/org/runnect/server/config/swagger/SwaggerConfig.java b/src/main/java/org/runnect/server/config/swagger/SwaggerConfig.java new file mode 100644 index 0000000..0aa5572 --- /dev/null +++ b/src/main/java/org/runnect/server/config/swagger/SwaggerConfig.java @@ -0,0 +1,43 @@ +package org.runnect.server.config.swagger; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + + private static final String ACCESS_TOKEN_HEADER = "accessToken"; + private static final String REFRESH_TOKEN_HEADER = "refreshToken"; + + @Bean + public OpenAPI openAPI() { + SecurityScheme accessTokenScheme = new SecurityScheme() + .type(SecurityScheme.Type.APIKEY) + .in(SecurityScheme.In.HEADER) + .name(ACCESS_TOKEN_HEADER); + + SecurityScheme refreshTokenScheme = new SecurityScheme() + .type(SecurityScheme.Type.APIKEY) + .in(SecurityScheme.In.HEADER) + .name(REFRESH_TOKEN_HEADER); + + SecurityRequirement securityRequirement = new SecurityRequirement() + .addList(ACCESS_TOKEN_HEADER) + .addList(REFRESH_TOKEN_HEADER); + + return new OpenAPI() + .info(new Info() + .title("Runnect API") + .description("Runnect 서버 API 문서") + .version("v1")) + .components(new Components() + .addSecuritySchemes(ACCESS_TOKEN_HEADER, accessTokenScheme) + .addSecuritySchemes(REFRESH_TOKEN_HEADER, refreshTokenScheme)) + .addSecurityItem(securityRequirement); + } +}