swagger로 api 문서를 관리하면서 다음과 같은 문제가 발생했다.

여기서 ** net::ERR_ABORTED 404**는 해당 주소에 정적파일이 존재하지 않았기에 일어난 것으로 보인다. Swagger가 해당 문제를 일으키는지 확인하기 전에, 다음의 상황을 체크해보자.

  1. spring security는 정적 리소스 또한 인증을 필요로 한다. 이를 해결 했는지 확인해보자.
@Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().antMatchers("/images/**", "/js/**", "/webjars/**","/css/**");
    }

정적리소스 또한 인증을 하는 상황이라면, 다음과 같이 빈을 등록하는 것으로 인증을 하지 않을 수 있다.

  1. html 등등 정적 리소스를 필요로하는 파일에서 경로를 제대로 지정해줬는지 확인해보자. <- 대부분의 문제가 여기에 속한다.

이 모든 과정을 거쳐도 안된다면?

-> Tomcat 내부의 문제거나 정적리소스를 처리하는 Handler의 문제일 수 있다. 본인의 경우에는 Handler와 관련된 문제였으며 그 이유는 다음과 같았다.

위의 사진은 문제가 생겼던 프로젝트의 SwaggerConfig 이다.

처음 사용해보는 Swagger 였던 만큼 swagger를 자세하게 커스텀하기 보다는 rest api의 검증 기능을 사용하는 것을 목표로 하였다. 이때 @EnableWebMvc가 바로 문제를 일으킨 범인이었다.

@EnableWebMvc의 역할?

스프링 WebApplicationContex 내부의 bean들을 커스터마이징 하기 위해 사용한다.

간단히 말하면, Spring이나 springboot에서 처리하는 방식이 아닌 다른 방식으로 컨트롤러를 호출하는 등의 상황에서, Spring MVC를 커스텀하기 위해 사용한다는 뜻이다.

이때 @EnableWebMvcDelegatingWebMvcConfiguration을 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를 해결할 수 있다.