Spring/Webflux

스프링 웹플럭스의 코루틴 지원

개발정리 2024. 1. 29. 14:43

코루틴

  • 코루틴(Coroutine)은 코틀린에서 비동기-논브로킹 프로그래밍을 명령어 스타일로 작성할 수 있도록 도와주는 라이브러리이다.
  • 코루틴은 멀티 플랫폼을 지원하여 코틀린을 사용하는 안드로이드, 서버 등 여러 환경에서 사용할 수 있다.
  • 코루틴은 일시 중단 가능한 함수(suspend function)을 통해 스레드가 실행을 잠시 중단했다가 중단한 지점부터 다시 재개(resume) 할 수 있다.

 

코루틴을 사용한 구조적 동시성 예시

suspend fun combineApi() = coroutineScope {
	val res1 = async { getApi1() }
    val res2 = async { getApi2() }
    return ApiResult (
    	res1.await()
        res2.await()
    )
}

 

 

 

리액티브가 코루틴으로 변환되는 방식

//Mono -> suspend
fun handler(): Mono<Void> -> suspend fun handler()

//Flux -> Flow
fun handler(): Flux<T> -> fun handler(): Flow<T>

 

 

 

코루틴을 적용한 컨트롤러 코드

class UserController (
    private val userService: UserService,
    private val userDetailService: UserDetailService
) {
    @GetMapping("/{id}")
    suspend fun get(@PathVariable id: Long) : User {
        return userService.getById(id)
    }
    
    @GetMapping("/users")
    suspend fun gets() = withContext(Dispatcher.IO) {
        val usersDeffered = async { userService.gets() }
        val userDetailsDeffered = async { userDetailService.gets() }
        
        return UserList(usersDeffered.await(), userDetailsDeffered.await())
    }
}