Spring/Error
[Spring] java.lang.ClassNotFoundException: kotlinx.coroutines.CoroutineScope 애러 해결법
Dev.Cho
2024. 4. 19. 07:16
애러 원인
해당 애러는 Spring에서 코루틴과 관련된 코드를 사용하고 있는데, 코루틴 라이브러리에 대한 의존성이 설정되지 않아 발생한다.
예를 들어 다음과 같이 컨트롤러를 만들면, 코틀린에는 기본적으로 일시 중단 함수가 내장되어 있기 때문에 컴파일러에서 오류가 발생하지 않지만, 스프링 프레임웍 내부적으로 CoroutineScope에서 코루틴을 실행해 해당 일시 중단 함수를 실행하기 때문에 오류가 발생한다.
@Controller
class CoroutineTestController() {
@GetMapping("/coroutine/call")
suspend fun callCoroutine(): ResponseEntity<String> { // 일시 중단 함수 사용
return ResponseEntity.ok("Coroutine Called")
}
}
이를 확인하기 위해 /coroutine/call 경로로 HTTP 요청을 날려보자. 그러면 응답코드가 500(Internal Server Error)이 오는 것을 볼 수 있다. 이는 서버 코드에서 처리를 하다 오류가 난 것을 뜻한다.
여기서 스프링 로그를 확인하면 ClassNotFoundException이 발생한 것을 볼 수 있다.
java.lang.ClassNotFoundException: kotlinx.coroutines.CoroutineScope
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
...
이는 젯브레인의 kotlinx.coroutines 라이브러리가 추가되지 않아 생기는 오류이다.
해결 방법
이를 해결하기 위해서는 젯브레인의 코루틴 라이브러리 두 가지를 build.gradle.kts 파일에 추가해야 한다. 이때 버전은 1.4.0 이상이어야 한다.
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${coroutinesVersion}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:${coroutinesVersion}")
}
글 작성일 기준 최신 버전은 1.7.2 여서 다음과 같이 추가했다.
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.2")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.7.2")
...
}
*참고로 kotlinx-coroutines-reactor은 내부적으로 사용하는 곳이 있는 것으로 보인다. 추가하지 않으면 다음과 같은 오류가 뜬다.
java.lang.ClassNotFoundException: org.reactivestreams.Publisher at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na] ...
이제 Gradle Sync를 진행해 라이브러리를 받아온 후 다시 애플리케이션을 실행하고, 이전에 실행한 HTTP 요청을 그대로 실행해 보자. 그러면 다음과 같이 일시 중단 함수가 실행돼 200번 응답이 오는 것을 볼 수 있다.
반응형