스프링에서 코틀린 코루틴 사용하기
코틀린은 언어적으로 코루틴을 지원하지만, 코루틴의 고급 기능들을 사용하기 위해서는 젯브레인에서 제공하는 코루틴 라이브러리에 대한 별도의 의존성을 추가로 설정해야 한다. 이는 스프링도 예외가 아니다.
먼저 별도의 의존성을 설정하지 않고, 코루틴을 사용해보면 어떤 일이 일어나는지 살펴보자. 이를 확인하기 위해 다음과 같이 컨트롤러를 만든다.
@Controller
class HomePageController() {
@GetMapping("/bloginfo/kotlinworld")
suspend fun getBlogInfo(): ResponseEntity<BlogInfo> {
val blogInfo = BlogInfo("조세영의 Kotlin World", 3)
return ResponseEntity.ok(blogInfo)
}
}
Controller의 getBlogInfo 함수는 일시 중단 함수(suspend fun)으로 선언돼 있어, 코루틴으로 처리된다. 이제, 다음 HTTP Request를 사용해 이 path로 GET 요청을 날려보자.
GET http://localhost:8081/bloginfo/kotlinworld
그러면 다음과 같은 500 애러가 나는 것을 볼 수 있다.
그리고, 스프링 앱의 로그를 보면 다음과 같은 오류가 나는 것을 볼 수 있다.
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]
...
이유는 코루틴 라이브러리에 대한 의존성 설정이 안됐기 때문이다. 이 때문에 CoroutineScope을 구현하는 찾지 못해 생기는 문제이다.
스프링 애플리케이션에 코루틴 라이브러리 의존성 설정하기
젯브레인스에서 만든 코루틴 라이브러리에 대한 의존성을 설정하려면 build.gradle.kts 파일에 kotlinx-coroutines-core, kotlinx-coroutines-reactor에 대한 의존성을 추가하면 된다.
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.2") // 코루틴 라이브러리
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.7.2") // 코루틴 reactor 라이브러리
...
}
이후 프로젝트를 Rebuild 하거나, Gradle Sync를 실행한다.
Gradle Sync는 우측 Gradle 탭을 누른 후 Reload All Gradle Projects를 누르면 실행된다.
코루틴을 사용하는 함수에 HTTP 요청 날려보기
이제 다시 같은 경로로 HTTP Request를 날려보면, 정상 응답이 오는 것을 볼 수 있다.