From 708534570a24e5b4cc5e124cd16fb3283a631050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jaewoo=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Thu, 11 Jan 2024 17:08:39 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20swagger=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../palnet/kac/app/config/SwaggerConfig.java | 97 +++++++++++++++++++ .../main/resources/application-swagger.yml | 44 +++++++++ 2 files changed, 141 insertions(+) create mode 100644 app/kac-app/src/main/java/kr/co/palnet/kac/app/config/SwaggerConfig.java create mode 100644 app/kac-app/src/main/resources/application-swagger.yml diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/SwaggerConfig.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/SwaggerConfig.java new file mode 100644 index 0000000..a99e062 --- /dev/null +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/config/SwaggerConfig.java @@ -0,0 +1,97 @@ +package kr.co.palnet.kac.app.config; + +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 lombok.extern.slf4j.Slf4j; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +import java.util.List; + +@Slf4j +@Configuration +public class SwaggerConfig { + +// @Bean +// public Docket api() { +// return new Docket(DocumentationType.OAS_30) // open api spec 3.0 +// .apiInfo(new ApiInfoBuilder().version("1.0").title("PAV").build()) +// .forCodeGeneration(true).securitySchemes(Arrays.asList(apiKey())) +// .select() +// .apis(RequestHandlerSelectors.any()) +// .paths(PathSelectors.any()) +// .build() +// .apiInfo(apiInfo()) +// .directModelSubstitute(Date.class, String.class) +// .directModelSubstitute(LocalDate.class, String.class) +// .directModelSubstitute(LocalDateTime.class, String.class) +// .directModelSubstitute(Pageable.class, SwaggerPageable.class) +// .securityContexts(Arrays.asList(securityContext())) +// .securitySchemes(Arrays.asList(apiKey())); +// } +// +// +// private ApiInfo apiInfo() { +// return new ApiInfoBuilder() +// .title("PAV API") +// .description("----") +// .version("1.0") +// .build(); +// } +// +// //ApiKey 정의 +// private ApiKey apiKey() { +// return new ApiKey("Authorization", "Authorization", "header"); +// } +// +// //JWT SecurityContext 구성 +// private SecurityContext securityContext() { +// return SecurityContext.builder().securityReferences(defaultAuth()).build(); +// } +// +// private List defaultAuth() { +// AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEveryThing"); +// AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; +// authorizationScopes[0] = authorizationScope; +// return Arrays.asList(new SecurityReference("Authorization", authorizationScopes)); +// } + + private static final String BEARER_TOKEN_PREFIX = "palnet"; + + @Bean + public OpenAPI openAPI() { + final String securitySchemeName = "BearerAuth"; + + SecurityRequirement securityRequirement = new SecurityRequirement().addList(securitySchemeName, List.of("read", "write")); + + Components components = new Components() + .addSecuritySchemes(securitySchemeName, new SecurityScheme() + .type(SecurityScheme.Type.APIKEY) + .in(SecurityScheme.In.HEADER) + .name("Authorization") + .description("prefix add 'palnet ' + token") + ); + + // Swagger UI 접속 후, 딱 한 번만 accessToken을 입력해주면 모든 API에 토큰 인증 작업이 적용됩니다. + return new OpenAPI() + .addSecurityItem(securityRequirement) + .components(components) + .info(new Info() + .title("PAV API") + .version("1.0") + .description("PAV API") + ); + + } + +} + diff --git a/app/kac-app/src/main/resources/application-swagger.yml b/app/kac-app/src/main/resources/application-swagger.yml new file mode 100644 index 0000000..8d7c6d9 --- /dev/null +++ b/app/kac-app/src/main/resources/application-swagger.yml @@ -0,0 +1,44 @@ +springdoc: + api-docs: + path: /api-docs + groups: + enabled: true +# 해당 패턴에 매칭되는 controller만 swagger-ui에 노출한다. +# paths-to-match: +# - /api/** +# paths-to-exclude: +# - /api/v1/utm +# - /api/bas/flight/** +# - /api/ctr/cntrl/contains +# - /api/file/** + swagger-ui: + # 각 API의 그룹 표시 순서 + # path, query, body, response 순으로 출력 + path: /index.html + display-request-duration: true + + groups-order: DESC + + # 태그 정렬 순서. + # alpha: 알파벳 순 정렬 + # method: OpenAPI specification file에 원하는 태그 정렬 방식 직접 기재 + tags-sorter: alpha + + # 컨트롤러 정렬 순서. + # method는 delete - get - patch - post - put 순으로 정렬된다. + # alpha를 사용해 알파벳 순으로 정렬할 수 있다. + operations-sorter: method + + # Spring Actuator의 endpoint까지 보여줄 것인지? + show-actuator: false + + # request media type 의 기본 값 + default-consumes-media-type: application/json + + # response media type 의 기본 값 + default-produces-media-type: application/json + + # Swagger UI에서 기본적으로 펼쳐져 보이는 경로의 수 + doc-expansion : none + +