Swagger를 사용과 css 적용 에러
swagger로 api 문서를 관리하면서 다음과 같은 문제가 발생했다.
여기서 ** net::ERR_ABORTED 404**는 해당 주소에 정적파일이 존재하지 않았기에 일어난 것으로 보인다. Swagger가 해당 문제를 일으키는지 확인하기 전에, 다음의 상황을 체크해보자.
- spring security는 정적 리소스 또한 인증을 필요로 한다. 이를 해결 했는지 확인해보자.
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().antMatchers("/images/**", "/js/**", "/webjars/**","/css/**");
}
정적리소스 또한 인증을 하는 상황이라면, 다음과 같이 빈을 등록하는 것으로 인증을 하지 않을 수 있다.
- html 등등 정적 리소스를 필요로하는 파일에서 경로를 제대로 지정해줬는지 확인해보자. <- 대부분의 문제가 여기에 속한다.
이 모든 과정을 거쳐도 안된다면?
-> Tomcat 내부의 문제거나 정적리소스를 처리하는 Handler의 문제일 수 있다. 본인의 경우에는 Handler와 관련된 문제였으며 그 이유는 다음과 같았다.
위의 사진은 문제가 생겼던 프로젝트의 SwaggerConfig 이다.
처음 사용해보는 Swagger 였던 만큼 swagger를 자세하게 커스텀하기 보다는 rest api의 검증 기능을 사용하는 것을 목표로 하였다. 이때 @EnableWebMvc가 바로 문제를 일으킨 범인이었다.
@EnableWebMvc의 역할?
스프링 WebApplicationContex 내부의 bean들을 커스터마이징 하기 위해 사용한다.
간단히 말하면, Spring이나 springboot에서 처리하는 방식이 아닌 다른 방식으로 컨트롤러를 호출하는 등의 상황에서, Spring MVC를 커스텀하기 위해 사용한다는 뜻이다.
이때 @EnableWebMvc는 DelegatingWebMvcConfiguration을 import 하는데,이를 InteliJ에서 보면 다음과 같다.
DelegatingWebMvcConfiguration을 완벽히 이해하지는 못했지만, 중요한 것은 내부의 빈들이 전부 초기화 된다는 것이다.
따라서 WebMvcConfigurer를 implements 하고, 정적리소스를 처리해주는 Handler를 오버라이딩하면 해결된다!
package com.haedal.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Configuration
@EnableWebMvc
public class SwaggerConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
@Bean
public Docket api() {
return new Docket(DocumentationType.OAS_30) .select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}
다음과 같이 SwaggerConfig를 수정해주면,ERR_ABORTED 404를 해결할 수 있다.