스웨거를 적용하면서 만난 문제들을 정리해본다!
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0")
@Configuration
@RequiredArgsConstructor
public class SpringDocConfiguration {
private final ApplicationContext applicationContext;
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info().title("Ggorangjirang API").version("1.0.0").description("API description"));
}
@Bean
public GroupedOpenApi api() {
return GroupedOpenApi.builder()
.group("Ggorangjirang")
.pathsToMatch("/**")
.build();
}
/**
모든 경로를 기준으로 API가 만들어진다. pathsToMatch를 이용해 노출한 엔드포인트를 설정할 수 있다.@Tag(name = "유저 인증 API", description = "회원 가입, 토큰 발행, 로그인")
@Operation(summary = "회원 가입 요청 API")
@ApiResponses(
value = {
@ApiResponse(responseCode = "204", description = "로그인 성공"),
@ApiResponse(responseCode = "P1", description = "400, 파라미터가 비어 있거나 NULL인 경우"),
@ApiResponse(responseCode = "U4", description = "400, 이메일이 중복된 경우"),
@ApiResponse(responseCode = "U5", description = "401, 패스워드가 일치하지 않는 경우"),
@ApiResponse(responseCode = "U6", description = "400, 패스워드가 4자리 미만인 경우"),
})
@PostMapping("/api/v1/auth/register")
"/swagger-ui/**",
"/v3/api-docs/**")
location ~ ^/(swagger-ui|v3) {
proxy_pass http://spring-app:8080;
}
http.authorizeHttpRequests(
(auth) ->
auth.requestMatchers(
"/swagger-ui/**",
"/v3/api-docs/**")
.permitAll()
@OpenAPIDefinition(servers = {
@Server(url = "https://ggorangjirang.duckdns.org", description = "GRJR"),
@Server(url = "http://localhost:8080", description = "local server")
})
@Configuration
public class SpringDocConfiguration {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info().title("Ggorangjirang API").version("1.0.0").description("API description"))
.addSecurityItem(new SecurityRequirement().addList("bearer"))
.components(
new io.swagger.v3.oas.models.Components()
.addSecuritySchemes(
"bearer",
new SecurityScheme()
.name("Authorization")
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT")
.in(SecurityScheme.In.HEADER)
.description(
"JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"")));
}
.addSecurityItem(new SecurityRequirement().addList("AccessTokenKey"))
.components(
new io.swagger.v3.oas.models.Components()
.addSecuritySchemes(
"AccessTokenKey",
new SecurityScheme()
.type(SecurityScheme.Type.APIKEY)
.in(SecurityScheme.In.HEADER)
.description();
springdoc.show-login-endpoint=true
설정만으로 해당 엔드포인트를 노출시킬 수 있다. 하지만, 별도의 커스텀이 되지 않는다. package org.springdoc.core.configuration;
; 에 구현되어 있는 springSecurityLoginEndpointCustomiser를 커스터마이징해야 한다. @Lazy(false)
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({Filter.class})
class SpringSecurityLoginEndpointConfiguration {
SpringSecurityLoginEndpointConfiguration() {
}
@Bean
@ConditionalOnProperty({"springdoc.show-login-endpoint"})
@Lazy(false)
OpenApiCustomizer springSecurityLoginEndpointCustomiser(ApplicationContext applicationContext) { ... }
OpenApiCustomizer springSecurityLoginEndpointCustomiser() {}
커스텀하여 빈을 만들어둔 후에 아래와 같이 설정에 추가하면 로그인 필터 앤드포인트가 스웨거에 노출된다. private final ApplicationContext applicationContext;
@Bean
public GroupedOpenApi api() {
return GroupedOpenApi.builder()
.group("Ggorangjirang")
.pathsToMatch("/**")
.addOpenApiCustomizer(springSecurityLoginEndpointCustomiser())
.build();
}