문제 상황
4시간 넘게 나를 속 썩였던 에러
분명 스프링 시큐리티를 달기 전에는 잘 됐는데, 시큐리티를 달자마자 귀신같이 동작하지 않았다.
필터에서 당연히 스웨거 url 은 허용을 해두었으나, 스웨거에 접속하면 위와 같은 화면이 보인다.
크롬 개발자 도구를 보면
/v3/api-docs 경로로의 GET 요청에 실패했다고 한다.
스프링 어플리케이션 로그를 보면
java.lang.NoSuchMethodError: 'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)'
at org.springdoc.core.service.GenericResponseService.lambda$getGenericMapResponse$8(GenericResponseService.java:706) ~[springdoc-openapi-starter-common-2.6.0.jar:2.6.0]
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178) ~[na:na]
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627) ~[na:na]
at org.springdoc.core.service.GenericResponseService.getGenericMapResponse(GenericResponseService.java:708) ~[springdoc-openapi-starter-common-2.6.0.jar:2.6.0]
at org.springdoc.core.service.GenericResponseService.build(GenericResponseService.java:247) ~[springdoc-openapi-starter-common-2.6.0.jar:2.6.0]
at org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:499) ~[springdoc-openapi-starter-common-2.6.0.jar:2.6.0]
at org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:676) ~[springdoc-openapi-starter-common-2.6.0.jar:2.6.0]
at org.springdoc.webmvc.api.OpenApiResource.lambda$calculatePath$11(OpenApiResource.java:220) ~[springdoc-openapi-starter-webmvc-api-2.6.0.jar:2.6.0]
at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[na:na]
at org.springdoc.webmvc.api.OpenApiResource.calculatePath(OpenApiResource.java:201) ~[springdoc-openapi-starter-webmvc-api-2.6.0.jar:2.6.0]
at org.springdoc.webmvc.api.OpenApiResource.lambda$getPaths$2(OpenApiResource.java:171) ~[springdoc-openapi-starter-webmvc-api-2.6.0.jar:2.6.0]
이렇게 NoSuchMethodError 가 나온다.
대충 로그를 봤을 때는 /v3/api-docs 경로에 해당하는 요청을 받았으나, 이 요청을 처리할 수 있는 컨트롤러가 없다는 에러로 이해했다.
분명 스웨거가 받아서 처리해야 할 텐데, 왜 이 요청이 컨트롤러를 찾는 단계까지 왔을까..
시큐리티가 문제인가 싶어서 모든 요청에 대해 시큐리티 허용을 걸어도 403에서 500으로 바뀌었을 뿐 에러는 바뀌지 않았다.
그래서 스웨거 설정을 해야 하나 싶어서 공식문서, 구글 문서, 스택 오버플로우 가리지 않고 다 뒤졌다.
그때 중간 중간 버전이 안 맞아서 그럴 수도 있다는 말을 봤다.
문제가 발생한 프로젝트는 자바 21 을 사용하고 있었기에 혹시 싶어서 swagger java 21 로 검색해봤으나, 내가 사용중인 스웨거 버전(2.6.0)은 그보다 높은 버전이었다.
그래서 이건 문제가 아니겠지 싶었는데..
진짜 도저히 모르겠어서 maven 레포지토리에 스웨거 의존성을 검색해보니 더 최신 버전 2.7.0 이 존재하길래 밑져야 본전이라는 마음으로 버전을 바꿔봤다.
잘된다 ㅠㅠㅠ
혹시나 싶어서 다시 2.6.0 으로 내려서 gradle reload 하고 다시 실행했는데 여전히 잘 되길래 버전이 문제가 아닌가 싶었는데, 프로젝트 폴더에서 build, gradle 폴더를 다 지우고 다시 gradle reload 한 뒤 실행하면 같은 문제가 재발한다.
2.7.0 에서 새로 내려받는 무언가의 존재 여부로 이 문제의 발생 여부가 갈리는 것 같다.
혹시 같은 문제를 마주치는 분들을 위해 정보를 남기자면..
자바는 21, 스프링 부트 3.4.1 에서는 스웨거 2.7.0 을 사용해야 문제가 없는 것 같다..
그래도 덕분에 스웨거를 조금 더 자세히 공부하는 계기가 되었다.. 럭키비키잖아..
'WEB(BE) > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] application.yml 데이터베이스 연결 정보 입력 (0) | 2025.01.06 |
---|---|
[Spring Boot] profile 개념과 profile 분리 (0) | 2025.01.04 |