최근 프로젝트를 진행하다 보니, 백엔드 자체의 로직 구현보다 환경설정 내에서 오류가 생기는 경우가 제법 많았다. 자주 보는 오류 중, swagger를 설정하면서 보이는 오류를 두 가지 정리하고자 한다.
스웨거에 접속하기 위해서 아래의 링크로 접속했을 시, 우리가 알던 스웨거 창이 아니라 위와 같은 로그인 화면으로 리다이렉트되며 뜨는 경우가 있다.
http://localhost:9999/swagger-ui.html
해당 로그인 창에서 Username에 user를 입력하고, Password에 서버 실행시, 콘솔창에 뜬 비밀번호(아래 캡처 참고)를 입력하면 스웨거 페이지로 이동이 가능하다.
// SecurityConfig.java 설정
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
@EnableMethodSecurity
public class SecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.cors().configurationSource(corsConfigurationSource())
.and().csrf().disable().sessionManagement().
sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeHttpRequests().antMatchers(
// Swagger 허용 URL
"/v2/api-docs", "/v3/api-docs", "/v3/api-docs/**", "/swagger-resources",
"/swagger-resources/**", "/configuration/ui", "/configuration/security", "/swagger-ui/**",
"/webjars/**", "/swagger-ui.html")
.permitAll().anyRequest().authenticated();
return http.build();
}
}
올바르게 스웨거에 접속했다고 생각했지만, 다음과 같은 창이 뜨며 내용이 제대로 나타나지 않을 때가 있다.
그 때는, SwaggerConfiguration.java 파일에 다음과 같이 addResourceHandlers를 추가해주면 된다.
@EnableSwagger2
@Configuration
public class SwaggerConfig implements WebMvcConfigurer {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
해당 과정을 거치면 위 사진과 같이 스웨거가 제대로 출력된다.