Webflux + Swagger 적용하기
2023. 1. 17. 17:55ㆍBackEnd(Java)/Webflux
Webflux 환경에서 Swagger를 적용해보자!
1. Webflux에서 Swagger를 사용하기 위해서는 build.gradle에 스웨거 사용을 위해 추가를 한다.(각자 버전에 맞게 설정)
implementation "io.springfox:springfox-swagger2:${swaggerVersion}"
implementation "io.springfox:springfox-swagger-ui:${swaggerVersion}"
implementation "io.springfox:springfox-spring-webflux:${swaggerVersion}"
implementation "io.springfox:springfox-bean-validators:${swaggerVersion}"
2. 스웨거를 설정을 위한 Configureation 클래스를 하나 만들어 WebFluxConfigurer를 implements 한 후 스웨거 설정을 한다.
(아래 코드 참고)
@Configuration
@EnableSwagger2WebFlux
public class SwaggerConfig implements WebFluxConfigurer{
private static final String API_NAME = "test API";
private static final String API_VERSION = "0.0.1";
private static final String API_DESCRIPTION = "test API 명세서";
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.test"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo())
.genericModelSubstitutes(Optional.class, Mono.class, Flux.class);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//swagger-ui.html 리소스 등록
registry.addResourceHandler("/swagger-ui.html**").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(API_NAME)
.version(API_VERSION)
.description(API_DESCRIPTION)
.build();
}
}
3. 만약 스프링 시큐리티를 사용중이라면 권한을 꼭!! 추가해야한다. 아니면 500 ERROR 발생함
pathMatchers에 꼭 스웨거 설정 4개를 등록하여 permitAll을 해줘야 접근이 가능함!(아래 코드 참고)
(시큪리티쪽 추가안해서 1시간동안 해맸다 ㅠ)
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
@RequiredArgsConstructor
public class SecurityConfiguration {
private final ReactiveAuthenticationManager authenticationManager;
private final ServerSecurityContextRepository securityContextRepository;
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
// Disable default security.
http.httpBasic().disable();
http.formLogin().disable();
http.csrf().disable();
http.logout().disable();
// Add custom security.
http.authenticationManager(this.authenticationManager);
http.securityContextRepository(this.securityContextRepository);
// Disable authentication for `/auth/**` routes.
http.authorizeExchange().pathMatchers("/api/**",
"/swagger-ui.html", //스웨거 설정(아래 4개)
"/swagger-resources/**",
"/webjars/**",
"/v2/api-docs"
).permitAll();
http.authorizeExchange().anyExchange().authenticated();
return http.build();
}
}
4. 완성!!
참고자료
반응형