[F-Lab 66해빗 페이백 챌린지 ]

[F-Lab 페이백 모각코 51일차] SpringBoot 3 (3.1.2) + SpringDoc ( OAS3)

everydeveloper 2023. 8. 19. 20:19

Swagger를 추가할려고 하니

왠지 잘 안되었다.

 

Swagger 3를 스프링 부트3 에 적용하려다가 실패했다.

 

@Configuration을 선언하고 해당 클래스에 자바설정코드도 코딩해 놓았는데 빌드할때 클래스로드가 되지 않았다.

기존 코드는 게시판을 구현한 것이였는데 그중 코드를 RestAPI로 간단히 바꾸어놓았다.

API 클래스에 @RestController 선언해 놓고

기존 컨트롤러 클래스의 자바코드를 약간 RestAPI용으로 약간씩 바꾸어 놓았다.

 

자바언어로 된 Swagger 설정 파일과 위 변경 사항 그리고 해당 의존성 추가 한 것 외에는 다른 변경상황은 기억나지 않았기 떄문에

 

 

1 test completed, 1 failed

            Caused by: java.lang.ClassNotFoundException at BuiltinClassLoader.java:641

Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/kyj/F_LAB/everycodeacademy/build/reports/tests/test/index.html

 

빌드 할때 테스트 에러가 났다.

 

해당 문제 좀 알아보니 테스트 시 에러 확인 하는 웹페이지에 접속해서 에러 확인하니

 

 

java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@1984212d testClass = com.every.everycodeacademy.EverycodeacademyApplicationTests, locations = [], classes = [com.every.everycodeacademy.EverycodeacademyApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceLocations = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@535779e4, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@1f3f02ee, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@7b94089b, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@4eb386df, org.springframework.boot.test.context.SpringBootTestAnnotation@f5f979ab], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:143)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:127)
	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:191)
	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:130)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:241)
	at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:138)

 

이런 에러가 떳엇다.

 

좀 알아보니

Spring Boot 테스트를 실행할 Spring Application Context 로드하는 실패했다는 것을 나타냅니다.

라는 의미라는데

작동 하던 것이고 별로 바꾼 것도 없어서 더 당황스러웠다.

 

의존성과 충돌과 관련된것이라고 추릴 수 있었는데

 

내가 사용한 의존성은 SpringFox라는 라이브러리였는데

내가 사용한 버전은 3.x.x대여서 스프링부트3에서는 아직 호환되지 않는다고 하였다.

SpringFox을 사용하려면 2.x.x대를 사용하여야 한다고 하였다.

 

다운그레이드를 하긴 좀 그래서 좀 알아보니

 

인터넷에 고마우신 분이 먼저 나와 비슷한 경험을 하시고 해결 하신 경우를 찾을 수 있었다.

 

https://velog.io/@kjgi73k/Springboot3%EC%97%90-Swagger3%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0

 

Springboot 3.x에 Swagger를 적용시켜보자!

Springboot 3.0.1에서 Swagger 3.0.0을 적용 중 발생하는 에러들을 해결해 보자

velog.io

 

이 때 처음으로 

SpringDoc - webMVC 존재에 대해 인지를 하게 되었고 어 뭐지 라는 생각이 들었다.

 

이것은 @Configuration 즉 설정파일도 필요하지 않고

의존성과 해당 RestAPI에 애노테이션을 붙여놓으면 된다는 것이였다.

 

의존성을 변경하고 적용하고 설정파일을 주석 처리 후 애플리케이션을 IDE에서 실행시키니

index화면도 뜨고 Swagger UI 화면인

http://localhost:8080/swagger-ui/index.html으로 접속도 되었다.

 

SpringDoc은 무엇이길래 OpenAPI3.0도 되지??

SpringFox는 뭐지 라는 생각이 들었다.

 

예전에 한번 OpenAPI3.0 에 대해 알아본 적이 있었지만

다시 읽어보았다.

 

Swagger 3.0은 프레임 워크고

프레임워크다 보니 여러 기능이 있는데

그중 하나가 Swagger UI이다.

 

그리고 Swagger 3.0이 사용하는 API등을 표시 표현하는 규격/표준이

OpenAPI3.0이다.

 

내가 사용한 SpringDoc은 Swagger UI을 이용해 OpenAPI3.0 표시방법으로 사용자 자바코드 (RestAPI)를 사용자가 눈으로 보기 쉽게 해준다.

 

SpringFox는 아직 안 알아보았지만 비슷한 것이지 않을까 싶다.

 

 

 

 

참고 :

https://velog.io/@kjgi73k/Springboot3%EC%97%90-Swagger3%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0