[kotlin] Flow를 사용하여 네트워킹 작업 처리하기

최근 안드로이드 앱에서 네트워킹 작업을 처리하는 데 있어서 Kotlin Flow를 사용하는 경우가 늘어나고 있습니다. Kotlin Flow는 비동기적인 데이터 스트림 처리를 지원하며, 네트워킹과 같은 I/O 작업을 보다 간편하게 처리할 수 있게 해줍니다.

이번 포스트에서는 Kotlin Flow를 사용하여 안드로이드 앱에서 네트워킹 작업을 어떻게 처리하는지 살펴보겠습니다.

Flow란?

Kotlin Flow는 비동기적인 데이터 스트림을 처리하기 위한 새로운 비동기 시퀀스스트림입니다. Flow는 데이터를 한 번에 하나씩 방출하거나 가져와서 처리할 수 있도록 해주며, 이는 네트워킹과 같은 I/O 작업을 처리하는 데 적합합니다.

네트워킹 작업을 위한 Flow 사용하기

아래는 Kotlin의 Flow를 사용하여 네트워킹 작업을 처리하는 간단한 예제 코드입니다.

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.collect
import okhttp3.*
import java.io.IOException

class NetworkRepository {
    suspend fun fetchData(): Flow<Result<String>> = flow {
        val client = OkHttpClient()
        val request = Request.Builder()
            .url("https://api.example.com/data")
            .build()

        try {
            val response = client.newCall(request).execute()
            val data = response.body?.string()
            if (response.isSuccessful && data != null) {
                emit(Result.success(data))
            } else {
                emit(Result.failure(IOException("Failed to fetch data")))
            }
        } catch (e: IOException) {
            emit(Result.failure(e))
        }
    }
}

// 호출 방법
val repository = NetworkRepository()
repository.fetchData().collect { result ->
    when (result) {
        is Result.Success -> {
            // 데이터를 성공적으로 가져왔을 때 처리 로직
        }
        is Result.Failure -> {
            // 데이터 가져오기에 실패했을 때 처리 로직
        }
    }
}

위의 코드에서는 NetworkRepository 클래스에 fetchData 함수를 정의하여 데이터를 가져오는 네트워킹 작업을 처리합니다. fetchData 함수는 Flow<Result<String>>를 반환하며, 해당 Flow를 collect하여 성공 또는 실패에 따른 처리 로직을 수행할 수 있습니다.

마치며

Kotlin Flow를 사용하여 안드로이드 앱에서 네트워킹 작업을 처리하는 방법에 대해 알아보았습니다. Kotlin Flow는 네트워킹과 같은 비동기 작업을 처리하는 데 매우 유용하며, 코드를 간결하게 작성하고 가독성 있게 유지할 수 있는 장점을 가지고 있습니다.

Kotlin Flow를 통해 안드로이드 앱에서 네트워킹 작업을 처리하는 방법에 대해 더 배우고 싶다면, Kotlin Flow 공식 문서를 참고하시기 바랍니다.