코틀린 코루틴 리액티브 프로그래밍 : Flow와 Channel
저자

조세영

저자:조세영
취미로안드로이드개발을시작했다가빠져들어안드로이드개발자가됐다.하이퍼커넥트에서안드로이드개발자로서커리어를시작했고,현재는라인플러스에서라인안드로이드앱을개발하고있다.
안드로이드개발을하면서어려움을느낀부분들을다른사람들과공유하고싶어‘조세영의KotlinWorld’기술블로그를운영하며400개이상의글을발행했다.
블로그운영외에도기술과관련된다양한활동을하고있다.코루틴기술문서를번역해웹에배포하기도했고,ComposeDynamicTheme이나FilledSliderCompose같은오픈소스라이브러리를만들어배포해GoogleDevLibrary에소개되기도했다.

경력
현)라인플러스안드로이드개발자
전)하이퍼커넥트안드로이드개발자
전)티맥스데이터연구원
전)인공위성연구소대학원생연구원

학력
KAIST전기및전자공학부석사
고려대학교전기전자전파공학부학사
고려대학교보건정책관리학부학사
인천외국어고등학교졸업

목차


1장개발환경설정
1.1.인텔리제이아이디어설치및둘러보기
1.1.1.인텔리제이아이디어설치하기
1.2.코틀린프로젝트생성하고화면구성살펴보기
1.2.1.프로젝트생성하기
1.2.2.IDE구성살펴보기
1.3.첫Flow만들고수집하기
1.3.1.코루틴라이브러리추가하기
1.3.2.첫Flow만들기
1.4.Flow디버깅환경설정하기
1.4.1.실행중인스레드출력하기
1.4.2.실행중인코루틴이름출력하기
1.5.요약

2장리액티브프로그래밍의등장
2.1.복잡해지는애플리케이션
2.2.이전의방식과한계
2.2.1.명령형프로그래밍
2.2.2.명령형프로그래밍의한계
2.3.리액티브프로그래밍의등장
2.3.1.리액티브프로그래밍
2.3.2.비동기메시지통신
2.3.3.리액티브프로그래밍의의의와한계
2.4.리액티브프로그래밍도입전고려해야할사항
2.4.1.가파른학습곡선
2.4.2.높은도입비용
2.5.명령형과리액티브방식의적절한균형의필요성
2.6.요약
코루틴의비동기처리와리액티브프로그래밍의비동기처리
코루틴의FlowAPI와기존의리액티브프로그래밍라이브러리의차이

3장리액티브프로그래밍과코루틴Flow
3.1.리액티브프로그래밍을구성하는핵심개념들
3.1.1.데이터스트림
3.1.2.옵저버패턴
3.1.3.선언형프로그래밍패러다임
3.2.코루틴FlowAPI의구성요소
3.2.1.Flow빌더사용해데이터방출하기
3.2.2.터미널연산자사용해데이터수집해처리하기
3.2.3.중간연산자와선언형프로그래밍
3.2.4.전체과정정리
3.3.요약
리액티브스트림의등장
리액티브스트림과코루틴Flow

4장Flow빌더
4.1.Flow빌더로Flow만들기
4.1.1.flow함수
4.1.2.flowOf함수
4.1.3.asFlow함수
4.1.4.람다식에대한asFlow함수
4.2.Flow인터페이스구현해Flow생성하기
4.3.Flow의실행컨텍스트확인하고전환하기
4.3.1.Flow가동작하는방식
4.3.2.flowOn함수사용해업스트림의실행컨텍스트전환하기
4.4.flowOn함수심화
4.4.1.CoroutineDispatcher가변경될때만새로운코루틴이생성된다
4.4.2.새롭게생성된코루틴은기존의코루틴과구조화된다
4.4.3.flowOn의인자로Job을넘기면안된다
4.5.요약

5장중간연산자
5.1.변환연산자
5.1.1.map함수사용해데이터변환하기
5.1.2.map함수의사용
5.1.3.map함수직접만들어보기
5.2.필터연산자
5.2.1.filter함수사용해데이터필터링하기
5.2.2.filterIsInstance함수로특정타입의데이터만필터링하기
5.2.3.filter함수의사용
5.2.4.filter함수직접만들어보기
5.3.중복제거연산자
5.3.1.distinctUntilChanged함수사용해중복제거하기
5.3.2.distinctUntilChanged의사용
5.3.3.distinctUntilChanged함수직접구현해보기
5.4.take,drop연산자
5.4.1.take함수
5.4.2.drop함수
5.5.-notNull연산자
5.5.1.mapNotNull함수
5.5.2.filterNotNull함수
5.6.중간연산자의동작
5.6.1.중간연산자의실제동작방식
5.6.2.지연실행되는중간연산자
5.7.요약

6장터미널연산자
6.1.collect일시중단함수사용해Flow에서방출된원소처리하기
6.1.1.collect일시중단함수
6.1.2.collect일시중단함수사용시주의할점
6.1.3.collectIndexed일시중단함수
6.2.first일시중단함수사용해첫값가져오기
6.2.1.first일시중단함수
6.2.2.first일시중단함수사용시주의할점
6.2.3.firstOrNull일시중단함수
6.3.last일시중단함수사용해마지막값가져오기
6.3.1.last일시중단함수
6.3.2.lastOrNull일시중단함수
6.4.수집된값을컬렉션으로만드는함수
6.4.1.toList일시중단함수
6.4.2.toSet일시중단함수
6.4.3.toCollection일시중단함수
6.5.누적계산을통해하나의값을반환하는함수
6.5.1.reduce일시중단함수
6.5.2.fold일시중단함수
6.6.원소의총개수를반환하는함수
6.6.1.count일시중단함수
6.6.2.count일시중단함수사용해특정조건을만족하는원소의개수구하기
6.7.터미널연산자사용시주의할점
6.8.요약

7장Flow의이해
7.1.Flow의동작원리
7.1.1.추상화에감춰진Flow의동작원리
7.1.2.Flow동작원리이해하기
7.2.Flow의특징
7.2.1.collect일시중단함수가호출돼야데이터생성과방출이시작된다
7.2.2.동일한코루틴내에서방출과수집이이뤄지면Flow의방출과수집은순차적으로실행된다
7.3.생산자코루틴과소비자코루틴분리하기
7.3.1.flowOn함수사용해생산자코루틴과소비자코루틴분리하기
7.3.2.버퍼통해방출된원소저장하기
7.3.3.buffer함수사용해생산자코루틴과소비자코루틴분리하기
7.3.4.buffer함수사용시주의할점
7.4.Flow의완료
7.4.1.Flow의완료시점이해하기
7.4.2.무한히방출되는Flow에collect를호출하면다음라인의코드가실행되지않는다
7.5.Flow의컨텍스트보존
7.6.flow함수의컨텍스트변경제한
7.7.SafeFlow와unsafeFlow
7.8.요약

8장Flow취소
8.1.Flow취소하기
8.2.flow함수의취소확인
8.3.취소확인지점이없는Flow의취소확인
8.3.1.flowOf,asFlow함수를통해만들어지는Flow의문제
8.3.2.취소확인지점넣어취소확인되게만들기
8.3.3.cancellable함수사용해취소확인하도록만들기
8.4.요약

9장Flow예외처리
9.1.try-catch문을사용한Flow예외처리
9.1.1.try-catch문으로collect호출부감싸예외처리하기
9.1.2.중간연산자에서데이터처리시발생하는예외처리
9.1.3.try-catch문의동작을handleException중간연산자로만들어보기
9.1.4.예외투명성을위반하는handleException함수
9.2.catch함수를사용한Flow예외처리
9.2.1.catch함수사용해예외처리하기
9.2.2.catch함수에서예외를처리한후다시전파하기
9.2.3.catch함수가다운스트림에서발생한예외를구분하는방법
9.3.retry함수를통해예외발생시재시도하기
9.3.1.retry함수
9.3.2.retryWhen함수
9.4.요약

10장생명주기연산자
10.1.onStart함수
10.2.onCompletion함수
10.2.1.onCompletion함수사용해Flow가완료된후에실행될동작정의하기
10.2.2.onCompletion함수사용해Flow가취소됐을때실행될동작정의하기
10.3.onEach함수
10.4.onEmpty함수
10.4.1.onEmpty사용해방출될원소가없을때동작정의하기
10.4.2.onEmpty함수의람다식에서값방출하기
10.5.launchIn함수
10.5.1.onEach함수와함께사용하기
10.5.2.코루틴을생성하는launchIn함수
10.6.요약

11장배압
11.1.배압처리가필요한경우이해하기
11.1.1.배압처리가필요하지않은경우
11.1.2.배압처리가필요한경우
11.2.collectLatest일시중단함수를활용한배압처리
11.2.1.collectLatest일시중단함수사용해배압처리하기
11.2.2.collectLatest일시중단함수의동작원리
11.2.3.collectLatest일시중단함수를사용한배압처리의한계
11.3.conflate함수를활용한배압처리
11.3.1.conflate함수의동작방식
11.3.2.코루틴을분리하는conflate함수
11.4.buffer함수를사용한배압처리
11.4.1.buffer함수의기본동작
11.4.2.capacity사용해버퍼크기설정하기
11.4.3.onBufferOverflow사용해버퍼가가득찼을때실행전략설정하기
11.5.요약

12장결합연산자
12.1.zip함수
12.1.1.zip함수사용해Flow결합하기
12.1.2.zip함수의동작방식
12.1.3.zip함수의완료
12.2.combine함수
12.2.1.combine함수사용해Flow결합하기
12.2.2.여러개의Flow결합하기
12.2.3.combine함수의완료
12.3.요약

13장평탄화연산자
13.1.평탄화이해하기
13.1.1.평탄화가필요한경우
13.1.2.평탄화연산자사용하지않고평탄화해보기
13.2.flattenConcat함수와flatMapConcat함수
13.2.1.flattenConcat함수
13.2.2.flatMapConcat함수
13.2.3.flattenConcat,flatMapConcat함수의한계
13.3.flatMapMerge함수
13.3.1.flatMapMerge함수의동작방식
13.3.2.flatMapMerge가동시에실행할수있는작업수제한하기
13.4.flatMapLatest연산자
13.5.요약

14장차가운Flow와뜨거운Flow
14.1.차가운Flow와뜨거운Flow
14.1.1.차가운Flow
14.1.2.뜨거운Flow
14.2.SharedFlow
14.2.1.SharedFlow의개념과기본동작
14.2.2.SharedFlow만들고데이터방출하기
14.2.3.replayCache사용해collec

출판사 서평

이책에서다루는내용

명령형프로그래밍의한계와리액티브프로그래밍의등장배경을설명하고,코틀린의FlowAPI가기존리액티브라이브러리와어떤차별점을갖는지소개한다.
Flow를생성하는방법부터다양한중간연산자와터미널연산자의활용방식을배우고,Flow의취소,Flow의예외처리,Flow의결합까지다뤄기초를탄탄히다질수있도록한다.
데이터생산속도와소비속도간불균형이발생했을때Flow의배압처리를통해시스템을안정적으로유지하는방법을설명한다.
차가운Flow와뜨거운Flow의개념을다룬다.차가운Flow만을사용할때발생하는문제에대해알아보고이를뜨거운Flow를통해어떻게해결할수있는지를알아본다.
Flow를테스트하는방법을기초부터심화까지알아본다.
Channel을활용해코루틴간에데이터를주고받는방법을알아본다.

저자의말

코루틴과일시중단함수를사용하면단일값을비동기적으로반환받을수있다.하지만데이터가시간에따라변하고,이변하는데이터에실시간으로반응해야하는상황이생기면새로운도구가필요해진다.여기서코루틴의Flow가등장한다.Flow는비동기적으로계산된여러값을순차적으로반환받을수있도록설계된코루틴의핵심구성요소로,코루틴기반환경에서리액티브프로그래밍을구현하기위해사용된다.
리액티브프로그래밍은데이터흐름을선언적으로표현하는프로그래밍패러다임으로,복잡한데이터흐름을간결하게다룰수있도록한다.이런특성덕분에복잡한데이터흐름을가진현대의애플리케이션들에서리액티브프로그래밍은필수적인요소로자리잡았다.
하지만코루틴자체도이해가쉽지않은주제이고,리액티브프로그래밍또한학습곡선이가파르다.Flow는두개념을모두요구하는만큼,학습난이도는매우높은편이다.그럼에도불구하고Flow를다루는학습자료는많지않으며,있더라도독자가리액티브프로그래밍에대한사전이해를갖고있다고가정하는경우가많아진입장벽이높다.
이책은더많은개발자들이코루틴Flow에쉽게다가갈수있도록하기위해집필됐다.전작『코틀린코루틴의정석』에서는코루틴자체에대한깊이있는이해를제공했다면,이번책은그기반위에서FlowAPI를활용한리액티브프로그래밍을체계적으로설명한다.Flow의개념과생성방식,Flow에서방출되는데이터를소비하는방법같은기초부터,배압과뜨거운Flow와차가운Flow같은심화주제까지폭넓게다뤄리액티브프로그래밍을깊이있게이해할수있도록구성했다.
코틀린과코루틴에대한기본지식만갖추고있다면,누구나이해할수있도록설계된이책을통해더많은개발자들이Flow를친숙하게느끼고실무에자신있게활용하길바란다.