여러 영상들이나 문제들을 볼 때 Flow를 많이 보았습니다. 그렇지만 그 당시 Flow를 잘 몰랐기에 해당내용을 이해하기 쉽지 않았습니다. 그래서 오늘은 이 Flow를 알아볼까 합니다.
리액티브 프로그래밍은 기존의 명령형 프로그래밍과 대응되는 방식입니다.
명령형 프로그래밍 : 데이터를 요청한 후 일회성으로 수신. 이경우 데이터가 필요할 때마다 결괏값을 매번 요청한다는 점에서 매우 비효율적입니다.
리액티브 프로그래밍 : 구독을 하면 지속적으로 데이터를 전달하는 역할을 함. 이렇게 전달이 되는 흐름을 데이터 스트림이라고 합니다.
Coroutine Flow는 코루틴 상에서 위에서 말한 리액티브 프로그래밍을 지원하기 위해 만들어진 구현체입니다. 코루틴에서 데이터 스트림을 구현하기 위해서는 Flow를 이용하여 구현할 수 있습니다.
데이터스트림의 구성요소는 크게 3가지로 나눌 수 있습니다.
- Producer(생산자) : 데이터를 생성
- Intermediary(중간 연산자) : 데이터 변환
- Consumer(소비자) : 데이터 소비
Producer(생산자)
Data Source로부터 데이터를 발행하는 역할을 합니다. 안드로이드에서는 데이터를 받아오는 대표적인 Data Source로는 Retrofit같이 RestApi를 이용하여 서버로부터 가져오는 Data와 RoomDB같이 LocalDB에서 Data가 있습니다.
예를 들어 박스오피스 Api를 통해영화 데이터를 가져온다고 생각해 봅시다
class BoxOfficeRemoteDataSource(
private val boxOfficeApi: BoxOfficeApi,
) {
fun getBoxOfficeInfoFlow(): Flow<List<Movie>> = flow { //Flow 블록 선언
while (true) {
val officeInfo: List<Movie> = boxOfficeApi.fetchLastedMovieInfo() // 데이터 받아오기
emit(officeInfo) // Producer가 데이터 발행
delay(INTERBAK_REFRESH) // 시간마다 반복
}
}
companion object {
private const val INTERBAK_REFRESH: Long = 60000L
}
}
위 코드에서 보다시피 Flow에서의 Producer는 flow {} 블록 내부에서의 emit()을 통해 데이터를 생성합니다.
Intermediary(중간 연산자)
중간연산자에서는 생성된 데이터를 수정합니다.
class BoxOfficeRepository(
private val boxOfficeRemoteDataSource: BoxOfficeRemoteDataSource,
) {
fun getBoxOfficeInfoOfCurrentDateItem(date: String): Flow<List<Movie>> =
boxOfficeRemoteDataSource.getBoxOfficeInfoFlow()
.map { movieList -> movieList.filter { movie -> movie.date == date } }
}
위코드에서는 map을 이용하여 flow의 값들을 변형합니다. filter를 통해 date가 맞은 경우만 반환합니다. 대표적인 중간 연산자로는 map, filter, onEach가 있습니다.
Consumer(소비자)
소비자에서는 변환된 데이터를 받아와 UI에 사용합니다
class BoxOfficeViewModel(
private val boxOfficeRepository: BoxOfficeRepository,
) : ViewModel() {
private lateinit var _movieList: List<Movie>
val movieList: List<Movie>
get() = _movieList
fun collectBoxOfficeInfoOf(date: String) =
viewModelScope.launch {
boxOfficeRepository.getBoxOfficeInfoOfCurrentDateItem(date).collect { movieList ->
this@BoxOfficeViewModel._movieList = movieList
}
}
}
Flow에서는 collect를 이용해 전달된 데이터를 소비할 수 있습니다.
이번 포스팅에서는 Flow를 실습하며 기초적인 부분을 살펴보았습니다. 다음에는 더자세히 알아보도록 합시다.
'코틀린 > 문법및 라이브러리' 카테고리의 다른 글
[Kotlin] 단위 테스트 해보기(1) (0) | 2023.08.06 |
---|---|
[Kotlin] 여러 종류의 반복문 (0) | 2023.08.04 |
[Kotlin] 교집합(intersect), 합집합(union), 차집합(subtract) (0) | 2023.07.31 |
[Kotlin] Result class 가 뭐지? (0) | 2023.07.26 |
[Kotlin] Contract 로 스마트 케스팅 (0) | 2023.07.18 |