From 892889b2921bc7dc0d681071a413c2e1c21627e3 Mon Sep 17 00:00:00 2001 From: HYOJIN Date: Thu, 2 Apr 2026 13:37:48 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat(swagger):=20=EB=B0=B0=ED=8F=AC=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20Swagger=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=85=B8=EC=B6=9C=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=20(#135)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - prod 환경에서 Bypass API 그룹만 노출 (@ConditionalOnProperty) - 그룹별 개별 API 설명 추가 (addOpenApiCustomizer) - prod 환경 서버 목록 GC 도메인만 표시 - dev 서버 environment를 prod로 설정 (현재 운영 환경) --- .../batch/global/config/SwaggerConfig.java | 50 +++++++++++++++---- src/main/resources/application-dev.yml | 1 + 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/snp/batch/global/config/SwaggerConfig.java b/src/main/java/com/snp/batch/global/config/SwaggerConfig.java index 40a5945..adc754f 100644 --- a/src/main/java/com/snp/batch/global/config/SwaggerConfig.java +++ b/src/main/java/com/snp/batch/global/config/SwaggerConfig.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.models.info.License; import io.swagger.v3.oas.models.servers.Server; import org.springdoc.core.models.GroupedOpenApi; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -20,10 +21,9 @@ import java.util.List; * - API 문서 (JSON): http://localhost:8041/snp-api/v3/api-docs * - API 문서 (YAML): http://localhost:8041/snp-api/v3/api-docs.yaml * - * 주요 기능: - * - REST API 자동 문서화 - * - API 테스트 UI 제공 - * - OpenAPI 3.0 스펙 준수 + * 환경별 노출: + * - dev: 모든 API 그룹 노출 + * - prod: Bypass API 그룹만 노출 */ @Configuration public class SwaggerConfig { @@ -34,27 +34,45 @@ public class SwaggerConfig { @Value("${server.servlet.context-path:}") private String contextPath; + @Value("${app.environment:dev}") + private String environment; + @Bean + @ConditionalOnProperty(name = "app.environment", havingValue = "dev", matchIfMissing = true) public GroupedOpenApi batchManagementApi() { return GroupedOpenApi.builder() .group("1. Batch Management") .pathsToMatch("/api/batch/**") + .addOpenApiCustomizer(openApi -> openApi.info(new Info() + .title("Batch Management API") + .description("배치 Job 실행, 이력 조회, 스케줄 관리 API") + .version("v1.0.0"))) .build(); } @Bean + @ConditionalOnProperty(name = "app.environment", havingValue = "dev", matchIfMissing = true) public GroupedOpenApi bypassConfigApi() { return GroupedOpenApi.builder() .group("2. Bypass Config") .pathsToMatch("/api/bypass-config/**") + .addOpenApiCustomizer(openApi -> openApi.info(new Info() + .title("Bypass Config API") + .description("Bypass API 설정 및 코드 생성 관리 API") + .version("v1.0.0"))) .build(); } @Bean + @ConditionalOnProperty(name = "app.environment", havingValue = "dev", matchIfMissing = true) public GroupedOpenApi screeningGuideApi() { return GroupedOpenApi.builder() .group("4. Screening Guide") .pathsToMatch("/api/screening-guide/**") + .addOpenApiCustomizer(openApi -> openApi.info(new Info() + .title("Screening Guide API") + .description("Risk & Compliance Screening Guide 조회 API") + .version("v1.0.0"))) .build(); } @@ -64,14 +82,21 @@ public class SwaggerConfig { .group("3. Bypass API") .pathsToMatch("/api/**") .pathsToExclude("/api/batch/**", "/api/bypass-config/**", "/api/screening-guide/**") + .addOpenApiCustomizer(openApi -> openApi.info(new Info() + .title("Bypass API") + .description("외부 연동용 S&P 데이터 Bypass API") + .version("v1.0.0"))) .build(); } @Bean public OpenAPI openAPI() { - return new OpenAPI() - .info(apiInfo()) - .servers(List.of( + List servers = "prod".equals(environment) + ? List.of( + new Server() + .url("https://guide.gc-si.dev" + contextPath) + .description("GC 도메인")) + : List.of( new Server() .url("http://localhost:" + serverPort + contextPath) .description("로컬 개발 서버"), @@ -79,12 +104,15 @@ public class SwaggerConfig { .url("http://211.208.115.83:" + serverPort + contextPath) .description("중계 서버"), new Server() - .url("https://guide.gc-si.dev" + contextPath) - .description("GC 도메인") - )); + .url("https://guide.gc-si.dev" + contextPath) + .description("GC 도메인")); + + return new OpenAPI() + .info(defaultApiInfo()) + .servers(servers); } - private Info apiInfo() { + private Info defaultApiInfo() { return new Info() .title("SNP Batch REST API") .description(""" diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 2b55b9e..bc8870f 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -77,6 +77,7 @@ logging: # Custom Application Properties app: + environment: prod batch: chunk-size: 1000 schedule: From 81dfe21b460cba84b7a0e8722e59d0c651971dc0 Mon Sep 17 00:00:00 2001 From: HYOJIN Date: Thu, 2 Apr 2026 13:38:40 +0900 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20=EB=A6=B4=EB=A6=AC=EC=A6=88=20?= =?UTF-8?q?=EB=85=B8=ED=8A=B8=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/RELEASE-NOTES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/RELEASE-NOTES.md b/docs/RELEASE-NOTES.md index 2856889..e58571a 100644 --- a/docs/RELEASE-NOTES.md +++ b/docs/RELEASE-NOTES.md @@ -11,6 +11,10 @@ - Screening Guide 탭 분리 (Ship Compliance / Company Compliance) - Change History ↔ Screening Guide 간 언어 설정 공유 (localStorage) - 섹션 헤더에 Screening Guide 연결 링크 추가 +- 배포 환경에 따른 Swagger 페이지 노출 제한 (#135) + - prod 환경에서 Bypass API 그룹만 노출 + - 그룹별 개별 API 설명 추가 + - prod 환경 서버 목록 GC 도메인만 표시 ## [2026-04-01]