함수 내부에 코루틴에서 사용되는 중단점을 사용하려면 suspend 키워드를 붙여줘야 한다. 이렇게 만들어진 함수는 코루틴 컨텍스트 내에서만 사용할 수 있다.
suspend 함수는 async{}, launch{} 과는 다르다. suspend 는 코루틴 컨텍스트 내에서 블로킹으로 호출되지만 async{}, launch{} 는 논블로킹으로 호출된다.
그런데 난 런타임시 자꾸 kotlinx.coroutines.reactive.AwaitKt 를 찾을 수 없다는 에러가 뜬다...처음에 됐던거 같은데 착각이었나.. 그 뒤로 계속안된다.
org.jetbrains.kotlinx:kotlinx-coroutines-core 의존성은 분명추가가 되어있는데 말이다... 서칭해도 사례를 찾을 수 없어 일단 stream 으로 받아서 처리하는 방식으로 원복했다...
결국 가장 중요한 의존성이 없어서 그랬다... gradle 기준 필요한 의존성은 아래와 같다.
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
implementation("org.springframework.boot:spring-boot-starter-webflux")
일반적으로 intellij 의 initializr 로 프로젝트를 만들었다면 kotlin-reflect, kotlin-stdlib-jdk8 는 기본적으로 포함되어 있을 것이다. 여기에 coroutine 을 사용하기 위해 kotlinx-coroutines-core 를 추가하고 webclient 를 사용하기 위해 spring-boot-starter-webflux 를 추가하게 된다. 여기까지만 해도 webclient 를 stream 으로 받아서 동기처리하는 데에는 아무런 문제가 없다.
그런데 awaitBody 난 bodyToFlow를 사용하려면 kotlinx-coroutines-reactor 이 반드시 필요하다. 난 이게 없어서 안됐던 거였다..
https://araikuma.tistory.com/840
https://araikuma.tistory.com/834
https://spring.getdocs.org/en-US/spring-framework-docs/docs/spring-web-reactive/webflux-client/webflux-client-synchronous.html
https://www.baeldung.com/kotlin/spring-boot-kotlin-coroutines