티스토리 뷰

지난번에 Springdoc 사용법 이래가지고 글도 쓰고 이렇게 쓰면 잘 된다고 했었다. 지금도 프로젝트 새로 만들어서 전에 썼던 글대로 진행을 하면 잘 된다. 하지만 이미 개발이 완료된 어떤 프로젝트가 있었는데 여기에 Springdoc을 적용하려 하니 위와 같은 문제가 발생한다. 

[WARN ][org.springframework.web.servlet.PageNotFound.noHandlerFound:line1275] - No mapping for GET /swagger-ui/index.html

다 안되는건 아니다. swagger-ui 관련된 기능만 안된다. 

 

http://localhost:8080/v3/api-docs/swagger-config -> 200 OK
http://localhost:8080/v3/api-docs -> 200 OK
http://localhost:8080/swagger-ui.html -> 302 -> http://localhost:8080/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config -> 404 Not found.

 

이렇게 api-docs 관련된 api 호출은 잘 되는데 swagger-ui 화면을 보고 싶은데 이 경우가 잘 안된다.

No mapping for GET /swagger-ui/index.html

자원들을 가져오지 못하는것 같다. 그럼 새로 만들어서 swagger만 적용한 프로젝트는 왜 잘 될까?

한참의 삽질 끝에 정확하진 않지만 어렴풋이 답을 얻을 수 있었다. 

원인은 바로 흔히 WebConfig 라고 하는 Web 설정에 문제가 있었다. 필자의 설정은 다음과 같다. 

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {

WebMvcConfigurationSupport 를 extends 하여 interceptor라던지 argumentResolver와 같은 설정을 하는데 이는 swagger-ui 와 호환되지 않는다는게 잠정적으로 내린 결론이다. 위와 같은 WebConfig를 만들지 않은 순수한 Springboot 프로젝트에서는 swagger-ui가 잘 되는 이유이기도 하다.

WebMvcConfigurationSupport 를 extends 하는 설정 방식은 그럼 버려야 하나? swagger-ui의 자원을 가져올 수 있도록 설정을 해주면 된다. 

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/swagger-ui/**")
            .addResourceLocations("classpath:/META-INF/resources/webjars/swagger-ui/3.52.5/");

}

이런 설정을 WebConfig 안에 넣어준다. 여기서 3.52.5는 swagger-ui의 버전이다. maven dependency 에서 확인할 수 있다. 

swagger-ui version 

그럼 된다... 다른 방법도 있다. 바로 WebMvcConfigurationSupport 를 extends 하지 않고 다음과 같이 하면 된다. 

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{

하지만 이건 springboot 조금 최신 버전을 써보면 알겠지만 deprecated 되었다. 기능적으로는 돌아가도 나중을 위해 WebMvcConfigurerAdapter 사용을 하지 말고 위처럼 WebMvcConfigurationSupport 를 extends 하여 addResourceHandlers 에 추가해서 사용하도록 하자. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31