네트워크 API 통신할 때 suspend 함수 vs Flow

2025. 2. 19. 16:42개발/개념 및 기법

728x90
반응형

현재 나는 Nia(Now In Android) 프로젝트를 보면서 신규 프로젝트 구조를 설계하고 있다.

이걸 보는데 flow와 suspend 함수가 마구 뒤섞여져 있었다.

그럼 나는 어떤걸 기준으로 작업을 진행해야 할까?

1️⃣ suspend 함수란?

suspend 함수는 코루틴(Coroutine)에서 사용되는 특수한 함수이다.

코루틴에 대한 설명은 👉 https://anovice-dp.tistory.com/348

suspend 함수는 일시중단(suspending)이 가능한 함수이다.

즉, 실행을 멈췄다가 다시 재개할 수 있다.

✅ 주요 특징

  1. 비동기 작업을 쉽게 표현
    • suspend 함수는 일반적인 함수처럼 보이지만, 내부적으로 비동기 작업을 수행
    • 네트워크 요청, DB 쿼리 같이 시간이 오래 걸리는 작업에 유리
  2. 직관적인 코드
    • async-await 패턴처럼 동기 코드처럼 읽히면서도 비동기적으로 실행되기에 콜백 지옥을 피할 수 있음
  3. 일반 함수에서 직접 호출 불가
    • 반드시 suspend 함수나 코루틴 내에서만 호출 가능
suspend fun fetchUser(): User {
    return api.getUser() // 단일 값 반환
}

2️⃣ Flow란?

Flow는 Kotlin의 비동기 스트림(Asynchronoous Stream) 처리 방식이다.

여러 개의 데이터를 순차적으로 방출(emit)하는 비동기 데이터 흐름을 만들 때 사용한다.

✅ 주요 특징

  1. 비동기적으로 여러 개의 데이터를 처리
    • suspend 함수는 한 번 호출하면 단일 값만 반환하지만 Flow는 여러 개의 값을 순차적으로 방출(emit) 가능
    • 데이터가 실시간으로 변하는 채팅 메세지 등을 처리하기 유용 (웹소켓과 같은 무한 스트림에서 사용)
  2. 콜드 스트림 (Cold Stream)
    • Flow는 기본적으로 구독(subscribe) 되기 전까지 실행되지 않음.
    • 즉, 데이터 요청이 들어와야 동작하는 지연 실행 방식
  3. 코루틴에서 동작
    • Flow는 코루틴에서 실행되는 비동기 데이터 스트림
fun fetchUsers(): Flow<User> = flow {
    emit(api.getUser()) // 한 번 방출
    delay(5000) 
    emit(api.getUser()) // 5초 후 다시 방출
}

3️⃣ Suspend와 Flow를 사용하는 경우

✅ suspend 사용이 유용한 경우

  • API 요청 후 한 번만 응답을 받아서 UI 업데이트
    • ex. 로그인 API 호출 후 결과값으로 UI 업데이트

✅ Flow 사용이 유용한 경우

  • 실시간 데이터를 감지 필요
    • 채팅과 같은 무한 스트림 처리
728x90
반응형