코틀린 동시성 프로그래밍 [예제로 배우는 코틀린 동시성]
- 원서명Learning Concurrency in Kotlin: Build highly efficient and robust applications (ISBN 9781788627160)
- 지은이미구엘 엔젤 카스티블랑코 토레스(Miguel Angel Castiblanco Torres)
- 옮긴이강인호, 김동후
- ISBN : 9791161754222
- 28,000원
- 2020년 05월 29일 펴냄
- 페이퍼백 | 312쪽 | 188*235mm
- 시리즈 : 프로그래밍 언어
책 소개
소스 파일은 아래 깃허브 페이지에서 내려 받으실 수 있습니다.
(https://github.com/AcornPublishing/concurrency-kotlin)
요약
코틀린의 코루틴 소개로 시작해 동시성 코드를 어떻게 작성하는지 배우고, 코틀린으로 멀티 스레드 소프트웨어를 개발하는 데 필요한 개념을 이해할 수 있다. 비동기 애플리케이션을 개발할 때 스레드와 코루틴이 어떻게 소통하고 동기화하는지 알게 될 것이다. 또한 에러와 예외를 핸들링하는 방법과 멀티 코어 프로세싱을 활용하는 방법도 배울 수 있다. 추가로 코루틴이 어떻게 내부적으로 동작하는지 파악함으로써 코틀린의 큰 그림을 이해할 수 있을 것이다.
이 책에서 다루는 내용
■ 동시성에 대한 코틀린의 접근 방식
■ 순차적 비동기 일시정지 함수
■ 온 디맨드로 다시 시작되는 일시 정지 데이터 소스의 생성
■ 에러 핸들링의 베스트 프랙티스
■ 코루틴 간의 소통을 위한 채널 사용
■ 코루틴의 내부 동작 방식
이 책의 대상 독자
동시성과 관련한 일반적인 지식을 배우고 싶거나 특정 분야에 코틀린을 적용하려는 개발자를 위한 책이다. 기본적인 코틀린 지식만 있으면 읽을 수 있을 것이다.
이 책의 구성
1장, ‘Hello, Concurrent World!’에서는 동시성을 쉽게 이해할 수 있는 내용 위주로 구성했다. 프로세스, 스레드, 코루틴과 같은 개념으로 시작해서 동시성과 병렬처리를 비교해 소개한다. 동시성을 코딩할 때 부딪치는 일반적인 난관과 동시성에 대한 코틀린의 접근 방식 그리고 이 책에서 전체적으로 등장하는 용어를 소개한다.
2장, ‘코루틴 인 액션’에서는 코루틴을 개발하는 첫 번째 실습으로 안드로이드 프로젝트를 생성한다. 이를 통해 코루틴으로 네트워킹하는 방식, 비동기 작업을 위한 유형의 다양한 방식, 각 방식의 장점, 저자가 추천하는 방식을 설명한다.
3장, ‘라이프사이클과 에러 핸들링’에서는 코루틴의 라이프 사이클과 코루틴을 사용할 때 발생할 수 있는 오류의 해결 방법을 소개하고, 2장에서 생성한 RSS 리더에 에러 핸들링을 추가해 실제 오류를 어떻게 처리하는지 설명한다.
4장, ‘일시중단 함수와 코루틴 컨텍스트’에서는 코루틴의 필수 컨텍스트와 코루틴이 동작을 정의하고 수정하는 설정을 소개한다. 코루틴의 스레드의 정의와 에러 핸들링에 필요한 컨텍스트를 다룬다.
5장, ‘이터레이터, 시퀀스 그리고 프로듀서’에서는 데이터 소싱과 처리를 일시 중단하는 데 필요한 프리미티브를 소개한다. 언제, 어떻게, 이러한 프리미티브를 사용해야 하는지와 온디맨드 데이터 로딩을 구현하는 방식을 상세히 살펴본다.
6장, ‘채널, 통신을 통한 메모리 공유’에서는 매우 중요한 채널의 개념을 설명한다. 다양한 유형의 유즈케이스와 차이점으로 시작해 애플리케이션 개발 방식을 설명하며, RSS 피드 그룹에서 채널을 이용해 어떻게 동시 검색할 수 있는지 살펴본다.
7장, ‘스레드 한정, 액터 그리고 뮤텍스’에서는 원자성 위반이나 레이스 컨디션과 같은 에러를 방지하기 위해 사용되는 세 개의 코루틴 프레임워크 도구를 소개한다. 또한 동시성 코드를 작성할 때 기초가 되는 스레드 한정과 액터 그리고 뮤텍스에 대해 배울 수 있다.
8장, ‘동시성 코드 테스트와 디버깅’에서는 테스트를 어떻게 최대한 활용할 수 있는지 다룬다. 기능 테스트와 동시성 코드를 테스트할 수 있는 세 개의 구간 그리고 프로젝트 설정을 통해 로그를 활용하는 방법을 알아본다. 다른 스레드 또는 코루틴에서 발생하는 노이즈를 피하기 위해 동시성 코드를 디버그하는 방법도 살펴본다.
9장, ‘코틀린의 동시성’에서는 내부 실행 단계에서의 일시 중단 함수와 스레드 시행 그리고 예외 핸들링을 분석한다. 컴파일러의 역할과 stdlib 및 코루틴 라이브러리에 존재하는 여러 개의 클래스를 구현하는 방법을 설명하고 있어 내부 동작 방식을 상세히 이해할 수 있다.
목차
목차
- 1장. Hello Concurrent World
- 프로세스, 스레드, 코루틴
- 프로세스
- 스레드
- 코루틴
- 내용 정리
- 동시성에 대해
- 동시성은 병렬성이 아니다
- CPU 바운드와 I/O 바운드
- CPU 바운드 알고리즘에서의 동시성과 병렬성
- I/O 바운드 알고리즘에서의 동시성 대 병렬성
- 동시성이 어려운 이유
- 코틀린에서의 동시성
- 넌 블로킹
- 명시적인 선언
- 코틀린 동시성 관련 개념과 용어
- 요약
- 프로세스, 스레드, 코루틴
- 2장. 코루틴 인 액션
- 안드로이드 스튜디오 다운로드 및 설치
- 코틀린 프로젝트 생성하기
- 코루틴 지원 추가하기
- 안드로이드의 UI 스레드
- CallFromWrongThreadException
- NetworkOnMainThreadException
- 백그라운드에서 요청하고, UI 스레드에서 업데이트
- 스레드 생성
- CoroutineDispatcher
- 디스패처에 코루틴 붙이기
- 네트워킹 사용 권한 추가
- 서비스 호출을 위한 코루틴 생성
- UI 요소 추가
- UI가 블로킹되면 발생하는 일
- 처리된 뉴스의 수량 표시
- UI 디스패처 사용
- 플랫폼별 UI 라이브러리
- 요청 보류 여부를 위한 비동기 함수 생성
- 비동기 호출자로 감싸인 동기 함수
- 미리 정의된 디스패처를 갖는 비동기 함수
- 유연한 디스패처를 가지는 비동기 함수
- 더 좋은 방식을 선택하기 위한 방법
- 요약
- 3장. 라이프 사이클과 에러 핸들링
- 잡과 디퍼드
- 잡
- 디퍼드
- 상태는 한 방향으로만 이동
- 최종 상태의 주의 사항
- RSS - 여러 피드에서 동시에 읽기
- 피드 목록 지원
- 스레드 풀 만들기
- 데이터를 동시에 가져오기
- 응답 병합
- 동시 요청 테스트
- 넌 해피 패스(Non-happy path) - 예기치 않은 중단
- 디퍼드가 예외를 갖도록 하기
- 예외를 무시하지 말 것!
- 요약
- 잡과 디퍼드
- 4장. 일시 중단 함수와 코루틴 컨텍스트
- RSS 리더 UI 개선
- 각 피드에 이름 부여
- 피드의 기사에 대한 자세한 정보 가져오기
- 스크롤이 가능한 기사 목록 추가
- 기사 별 레이아웃
- 정보 매핑을 위한 어댑터
- 액티비티에 어댑터 연결
- 새 UI 테스트
- 일시 중단 함수
- 동작 중인 함수를 일시 중단
- 코루틴 컨텍스트
- 디스패처
- 예외 처리
- Non-cancellable
- 컨텍스트에 대한 추가 정보
- 컨텍스트 결합
- withContext를 사용하는 임시 컨텍스트 스위치
- 요약
- RSS 리더 UI 개선
- 5장. 이터레이터, 시퀀스 그리고 프로듀서
- 일시 중단 가능한 시퀀스 및 이터레이터
- 값 산출
- 이터레이터
- 이터레이터와의 상호 작용
- 시퀀스
- 시퀀스와 상호 작용
- 시퀀스는 상태가 없다
- 일시 중단 피보나치
- 피보나치 수열 작성
- 피보나치 이터레이터 작성
- 프로듀서
- 프로듀서 만들기
- 프로듀서와 상호 작용
- 프로듀서를 사용한 일시 중단 피보나치 수열
- 프로듀서 인 액션
- 어댑터에서 더 많은 기사 요청
- 온 디멘드 피드를 가져 오는 프로듀서 만들기
- UI의 목록에 기사 추가하기
- 요약
- 6장. 채널 - 통신을 통한 메모리 공유
- 채널 이해
- 스트리밍 데이터 사례
- 분산 작업 사례
- 채널 유형과 배압
- 언버퍼드 채널
- 버퍼드 채널
- 채널과 상호 작용
- SendChannel
- ReceiveChannel
- 읽기 전 유효성 검사
- 채널 인 액션
- 협업 검색 구현하기
- 요약
- 채널 이해
- 7장. 스레드 한정, 액터 그리고 뮤텍스
- 원자성 위반
- 원자성의 의미
- 스레드 한정
- 스레드 한정의 개요
- 코루틴을 단일 스레드로 한정
- 액터
- 액터란?
- 액터 생성
- 액터를 사용해 기능 확장
- 액터 상호 작용에 대한 추가 정보
- 상호 배제
- 상호 배제 이해
- 상호 배제와 상호 작용
- 휘발성 변수
- 스레드 캐시
- @Volatile
- @Volatile이 스레드 안전 카운터 문제를 해결하지 못하는 이유
- @Volatile을 사용하는 경우
- 원자적 데이터 구조
- 액터 인 액션
- UI에 라벨 추가
- 카운터로 사용할 액터 만들기
- 결과가 로드될 때 카운터 증가시키기
- UI가 업데이트에 반응하도록 채널 추가하기
- 채널을 통해 업데이트된 값 보내기
- 변경사항에 대한 UI 업데이트
- 구현 테스트
- 새로운 검색 시 카운터 재설정하기
- 요약
- 원자성 위반
- 8장. 동시성 코드 테스트와 디버깅
- 동시성 코드 테스트
- 가정을 버려라
- 나무가 아닌, 숲에 집중하라
- 테스트에 대한 추가 조언
- 테스트 작성
- 결함이 있는 UserManager 작성하기
- kotlin-test 라이브러리 추가
- 해피 패스 테스트 추가
- 에지 케이스를 위한 테스트
- 문제점 식별
- 중단 해결
- 테스트 재시도
- 디버깅
- 로그에서 코루틴 식별
- 디버거에서 코루틴 식별
- 조건부 브레이크 포인트
- 복원력과 안정성
- 요약
- 동시성 코드 테스트
- 9장. 코틀린의 동시성 내부
- 연속체 전달 스타일
- 연속체
- suspend 한정자
- 상태 머신
- 컨텍스트 전환
- 스레드 전환
- 예외 처리
- 연속체 전달 스타일
도서 오류 신고
정오표
정오표
[p. 29 5행]
스레드가 끝나면
->
메인 스레드가 끝나면
[p. 29 아래에서 3행]
스레드를 블록하면
->
UI 스레드를 블록하면