책 소개
2024년 대한민국학술원 우수학술도서 선정도서
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
소개 이미지
요약
많은 개발자들이 어렵게 느끼는 비동기 프로그래밍을 다양한 시각적 자료와 설명을 통해 누구나 쉽게 이해할 수 있도록 쓰인 책이다. 안드로이드, 스프링 등 코틀린을 사용하는 개발자들 중 코루틴을 사용한 비동기 프로그래밍을 기초부터 심화까지 제대로 배워보고 싶은 독자들에게 추천한다.
추천의 글
코틀린 저서를 집필하면서 코루틴과 동시성에 대한 내용을 넣지 않아 관련된 책을 낼까 고민하던 중, 우연히 출판사를 통해 출간 계획서를 검토해달라는 요청을 받았다. 이름은 없었지만 코루틴 기술 문서를 번역해 올린 저자라는 사실을 너무 쉽게 알 수 있었다. 코루틴을 공부하면서 저자가 정리한 내용과 번역한 내용에서 많은 도움을 받았기 때문이었다. 기획 내용도 체계적이었고, 내가 썼으면 하는 내용들이 다 들어가 있어서 흔쾌히 베타리딩을 통해 작게나마 도움을 드리기로 결정했다.
코틀린을 배우고 활용하다 보면 코루틴을 통한 동시성 처리가 필수적이다. 하지만 코틀린 공식 문서나 코틀린 코루틴 구현 관련 문서는 처음 보는 사람이 흐름을 따라 가면서 이해하기엔 어려운 부분이 많다. 이는 코루틴에 대해 다루는 대부분의 문서나 책, 동영상이 어느 정도 동시성 처리에 대해 알고 있다고 가정하기 때문이다. 그래서 처음부터 컨티뉴에이션이나 코루틴 내부의 상태머신, 디스패치 구조 등 나중에 살펴보는 편이 더 나은 세부 사항을 설명하는 것부터 시작하기 때문에, 코틀린으로 동시성 처리를 처음 시작하는 사람은 오히려 복잡한 개념들 속에서 갈피를 못잡고 헤매는 경우가 많다.
이 책은 다중스레드 프로그래밍을 다루고, 코루틴 디스패처, 코루틴 빌더, Job, Deferred, 코루틴 컨텍스트, 구조화된 동시성, 예외 처리 순서로 설명을 진행한다. 그리고 다시 일시 중단 함수와 코루틴에 대해 설명함으로써 처음 코루틴을 사용할 때 정말 필요한 내용부터 코틀린 코루틴을 깊이 배워나갈 수 있도록 도와준다. 그 과정에서 자세한 예제 코드를 통해 실무에서 코루틴을 사용할 때 알아둬야 하는 개념과 주의해야 할 함정을 알려준다. 설명과 예제 코드는 개념을 충분히 설명하되 너무 지나치지 않고, 너무 간결하지도 않게 딱 적당한 수준이므로 차근차근 쫓아가기 좋다. 이 책을 곁에 두고 잘 익히면 코틀린 개발자들에게 크게 도움이 될 것이다.
코틀린을 배우고 코루틴을 활용한 동시성 프로그래밍을 진행하려는 개발자들이나, 코루틴을 사용하기는 했지만 코루틴 디스패처, 컨텍스트, 잡 계층구조 등에 대해 더 잘 알고 싶은 개발자들에게 이 책을 권한다.
『코틀린 코루틴의 정석』은 『수학의 정석』과 같이 코루틴 개념에 입문하는 데 최적화된 훌륭한 안내서이다. 초보자도 부담 없이 따라갈 수 있도록 쉬운 언어와 직관적인 예제, 그림으로 설명돼 있어 입문자에게 편하게 다가가며, 예제 코드를 통해 개념을 실제로 적용하는 방법을 명확히 보여줘서 실무에 바로 적용해볼 수 있다. 코틀린 코루틴의 기초를 탄탄히 다지고자 하는 주니어 개발자나 비동기 프로그래밍에 어려움을 느끼는 독자들에게 강력히 추천한다.
코루틴을 초심자도 이해할 수 있도록 체계적으로 정리한 책을 찾기 어려웠다 보니 이 책의 등장이 반가웠다. 코루틴을 배운다면 필수적으로 알아야 할 주제들을 담고 있으며, 코루틴의 기초 사용뿐만 아니라 내부 동작을 이해하기 위한 내용을 그림과 예제 코드를 통해 친절하게 설명한다.
각 기술의 주제에 대한 WHAT을 설명해 주는 것을 넘어 이해를 돕기 위한 용어의 어원이나 배경을 통해 WHY를 설명하고 있어서 저자가 독자의 이해를 돕기 위해 고민한 흔적이 느껴진다. 코루틴을 처음 공부하는 독자들이나, 이미 코루틴을 배웠지만 좀 더 깊게 이해하고 싶은 독자들에게 도움이 될 것이다. 코루틴, 이 책 한 권이면 된다.
코틀린 코루틴 초심자가 읽어나가는 데 전혀 어려움이 없도록 내용을 구성하고 있으며, 배경지식이 각 챕터 서두에 잘 서술돼 있다. 짧은 호흡으로 이뤄진 이 책의 구성은 자칫 쉽게 방향을 잃어버릴 수 있는 일반적인 IT 기술 서적과는 전혀 다르게 느껴진다.
코루틴의 복잡한 동시성을 설명하기 위해 절차를 상세히 도식화해 이해를 도왔고, 특히 실 사용에 있을 법한 적절한 예시를 바탕으로 사용 의도를 파악하기 쉽게 집필했다. 주요 인터페이스를 코드 레벨에서 비교해 분명한 쓰임새를 구분하는 것도 독자의 이해 흐름에 큰 도움이 된다.
개발자에게 비동기 코드의 중요성을 이해하고 실질적으로 활용하는 것은 필수적인 능력이다. 이 책은 비동기가 왜 필요한지, 그리고 어떻게 효율적으로 비동기 코드를 작성할 수 있는지, 코루틴의 제어와 관리를 위한 방법들을 다양한 예제를 통해 쉽게 이해할 수 있게 제공한다. 그뿐만 아니라 심화 주제에 대해서도 다루고 있어, 기본 개념을 넘어서 더 깊은 이해를 돕는다.
이 책을 특히 주니어 개발자들에게 추천하는 이유는 코루틴에 대한 깊은 이해 없이는 효율적인 코드 작성이 어렵기 때문이다. 버그를 최소화하고, 개발 시간을 단축하기 위해 필요한 코루틴의 많은 활용법을 이 책에서 찾을 수 있다. 독자들이 비동기 코드의 복잡성을 깔끔하게 다루고 이해하는 데 큰 도움을 받을 수 있을 거라 확신한다.
고등학생 때는 학교 선생님들의 수업으로 이해하지 못했던 개념을 인터넷의 스타 강사들이 이해시켜 줬다. 코틀린 코루틴의 정석도 마찬가지다. 심지어 동영상도 아닌 책이지만, 쉽게 이해하지 못했던 코루틴 개념을 머릿속에 주입해 준다.
책은 앞에서부터 예시 코드를 실행해보면서 따라가면 제일 좋다. 설명을 조금만 읽어보더라도 내 말을 이해할 수 있을 것이다. 머릿속에 개념을 주입하고 있는 스타 강사의 편린이 느껴질 것이다. 본문을 읽어보러 가자. 일부만 읽더라도 얻어가는 게 있을 것이다.
이 책에서 다루는 내용
◆ 풍부한 시각적 자료를 통해 초보 개발자라도 코루틴을 사용한 비동기 프로그래밍을 쉽게 이해할 수 있도록 설명한다.
◆ 코루틴 이전의 멀티 스레드 프로그래밍이 어떤 한계를 가졌는지, 코루틴이 그 한계를 어떻게 극복했는지를 설명한다.
◆ CoroutineContext를 구성하는 다양한 구성 요소의 활용 방법을 설명한다.
◆ 코루틴의 구조화된 동시성과 예외 처리 방법을 알아보고 비동기 프로그래밍을 안정적으로 하는 방법을 설명한다.
◆ 코루틴의 동작 방식에 대한 심층적인 이해를 위한 자료를 제공한다.
◆ 코루틴 유닛 테스트를 작성하는 방법에 대해 기초부터 심화까지 설명한다.
이 책의 대상 독자
◆ 코틀린 코루틴에 대한 지식을 기초부터 핵심까지 탄탄하게 쌓고 싶은 개발자
◆ 코루틴의 다양한 기능들을 심층적으로 이해해 기술적으로 성장하고 싶은 개발자
◆ 코루틴의 구조화된 동시성과 예외 처리를 이해해 비동기 프로그래밍을 보다 안정적으로 하는 방법을 배우고 싶은 개발자
◆ 코루틴의 동작 원리를 이해하고 싶은 개발자
◆ 코루틴 유닛 테스트를 작성하는 방법을 배우고 싶은 개발자
이 책의 구성
1장에서는 JVM의 프로세스, 스레드에 대해 다룬다. 기존 멀티 스레드 프로그래밍이 어떤 방식으로 변화했고, 코루틴이 기존 멀티 스레드 프로그래밍의 한계를 어떻게 극복했는지 알아본다.
2장에서는 인텔리제이 아이디어를 사용해 코루틴 개발 환경을 설정하는 방법에 대해 다룬다. 개발 환경을 설정한 후에는 첫 코루틴을 실행해 보고, 어떤 스레드에서 코루틴이 실행 중인지 확인하는 방법에 대해서도 알아본다.
3장에서는 CoroutineDispatcher에 대해 다룬다. 제한된 디스패처를 만드는 방법과 제한된 디스패처를 사용해 코루틴을 실행시키는 방법을 설명한다. 코루틴 라이브러리는 사용자의 편의를 위해 미리 정의된 CoroutineDispatcher를 제공하므로 미리 정의된 CoroutineDispatcher에는 어떤 종류가 있고 언제 사용해야 하는지 살펴본다.
4장에서는 코루틴 빌더 함수인 launch와 launch 호출 시 반환되는 Job 객체를 다룬다. 코루틴은 일시 중단이 가능하므로 작업 간의 순차 처리가 매우 중요하다. Job 객체의 join 함수를 사용해 코루틴 간의 순차 처리 방법과 Job 객체를 통해 코루틴의 상태를 조작하고 상태 값을 확인하는 방법에 대해 알아본다.
5장에서는 async 코루틴 빌더에 대해 설명한다. async와 await를 사용해 코루틴으로부터 반환값을 받는 방법에 대해 알아보고, 코루틴을 실행 중인 스레드의 변경을 위해 withContext를 사용하는 방법에 대해서도 살펴본다.
6장에서는 CoroutineContext에 대해 알아본다. Job, CoroutineDispatcher, CoroutineName이 CoroutineContext의 구성 요소라는 것을 이해하고, CoroutineContext의 구성 요소를 결합하거나 분리하는 방법을 살펴본다.
7장에서는 코루틴을 안전하게 사용하게 위해 구조화된 동시성이 어떻게 사용되는지 부모 코루틴과 자식 코루틴의 관계를 중심으로 알아본다. 이후에는 구조화에 중요한 역할을 하는 CoroutineScope를 알아보고, 구조화의 중심에 Job이 있다는 것을 살펴본다.
8장에서는 예외 처리에 대해 다룬다. 코루틴에서 예외가 발생했을 때 어떻게 전파되는지 알아보고 예외 전파가 구조화된 동시성으로 인해 일어난다는 것을 확인한다. 그리고 supervisorScope나 SupervisorJob을 사용해 예외가 전파될 수 있는 범위를 제한하는 방법에 대해 다룬다. 추가로 try catch문 또는 Coroutine ExceptionHandler를 사용해 전파된 예외를 처리하는 방법에 대해서도 설명한다.
9장에서는 일시 중단 함수에 대해 다룬다. 일시 중단 함수가 재사용이 가능한 코드 블록임을 이해하고, 일시 중단 함수를 사용할 때 주의할 점에 대해 알아본다. 이후에는 일시 중단 함수를 호출할 수 있는 지점에 대해 알아보고, 일시 중단 함수 내부에서 구조화를 깨지 않는 CoroutineScope를 생성해 새로운 자식 코루틴을 실행하는 방법에 대해서도 살펴본다.
10장에서는 앞서 다룬 내용을 바탕으로 코루틴에 대한 이해를 더욱 깊게 만드는 주제들을 다룬다. 서브루틴과 코루틴의 차이를 알아보고, 코루틴이 협력적으로 동작하는 데 스레드를 양보하는 것이 왜 중요하고 코루틴이 일시 중단 후 재개될 때 어떤 일이 일어나는지 살펴본다.
11장에서는 코루틴의 심화 주제들을 알아본다. 멀티 스레드 환경에서 공유 상태를 사용하는 복수의 코루틴이 있을 때의 데이터 동기화 문제, CoroutineStart 옵션을 통해 코루틴의 실행 방법을 바꾸는 방법, 무제한 디스패처가 동작하는 방식, 코루틴의 일시 중단과 재개가 일어나는 원리에 대해 설명한다.
12장에서는 코루틴 단위 테스트에 대해 다룬다. 코루틴 테스트 라이브러리를 사용하는 방법과 코루틴 단위 테스트를 어떻게 진행하면 좋을지에 대해 알아본다.
목차
목차
- 1장. 스레드 기반 작업의 한계와 코루틴의 등장
- 1.1. JVM 프로세스와 스레드
- 1.2. 단일 스레드의 한계와 멀티 스레드 프로그래밍
- 1.2.1. 단일 스레드 애플리케이션의 한계
- 1.2.2. 멀티 스레드 프로그래밍을 통한 단일 스레드의 한계 극복
- 1.3. 스레드, 스레드풀을 사용한 멀티 스레드 프로그래밍
- 1.3.1. Thread 클래스를 사용하는 방법과 한계
- 1.3.2. Executor 프레임웍을 통해 스레드풀 사용하기
- 1.3.3. 이후의 멀티 스레드 프로그래밍과 한계
- 1.4. 기존 멀티 스레드 프로그래밍의 한계와 코루틴
- 1.4.1. 기존 멀티 스레드 프로그래밍의 한계
- 1.4.2. 코루틴은 스레드 블로킹 문제를 어떻게 극복하는가?
- 1.5. 요약
- 2장. 코루틴 개발 환경 설정
- 2.1. 인텔리제이 아이디어 설치 및 둘러보기
- 2.1.1. 인텔리제이 아이디어 설치하기58
- 2.2. 코틀린 프로젝트 생성하고 화면 구성 살펴보기
- 2.2.1. 프로젝트 생성하기
- 2.2.2. IDE 구성 살펴보기
- 2.3. 첫 코루틴 실행하기
- 2.3.1. 코루틴 라이브러리 추가하기
- 2.3.2. 첫 코루틴 실행하기
- 2.4. 코루틴 디버깅 환경 설정하기
- 2.4.1. 실행 중인 스레드 출력하기
- 2.4.2. 실행 중인 코루틴 이름 출력하기
- 2.4.3. launch 사용해 코루틴 추가로 실행하기
- 2.4.4. CoroutineName 사용해 코루틴에 이름 추가하기
- 2.5. 요약
- 3장. CoroutineDispatcher
- 3.1. CoroutineDispatcher란 무엇인가?
- 3.1.1. CoroutineDispatcher의 동작 살펴보기
- 3.1.2. CoroutineDispatcher의 역할
- 3.2. 제한된 디스패처와 무제한 디스패처
- 3.3. 제한된 디스패처 생성하기
- 3.3.1. 단일 스레드 디스패처 만들기
- 3.3.2. 멀티 스레드 디스패처 만들기
- 3.4. CoroutineDispatcher 사용해 코루틴 실행하기
- 3.4.1. launch의 파라미터로 CoroutineDispatcher 사용하기
- 3.4.2. 부모 코루틴의 CoroutineDispatcher 사용해 자식 코루틴 실행하기
- 3.5. 미리 정의된 CoroutineDispatcher
- 3.5.1. Dispatchers.IO
- 3.5.2. Dispatchers.Default
- 3.5.3. limitedParallelism 사용해 Dispatchers.Default 스레드 사용 제한하기
- 3.5.4. 공유 스레드풀을 사용하는 Dispatchers.IO와 Dispatchers.Default4
- 3.5.5. Dispatchers.Main
- 3.6. 요약
- 4장. 코루틴 빌더와 Job
- 4.1. join을 사용한 코루틴 순차 처리
- 4.1.1. 순차 처리가 안 될 경우의 문제
- 4.1.2. join 함수 사용해 순차 처리하기
- 4.2. joinAll을 사용한 코루틴 순차 처리
- 4.2.1. joinAll 함수
- 4.2.2. joinAll 함수 사용해 보기
- 4.3. CoroutineStart.LAZY 사용해 코루틴 지연 시작하기
- 4.3.1. 지연 시작을 살펴보기 위한 준비
- 4.3.2. CoroutineStart.LAZY 사용해 코루틴 지연 시작하기
- 4.4. 코루틴 취소하기
- 4.4.1. cancel 사용해 Job 취소하기
- 4.4.2. cancelAndJoin을 사용한 순차 처리
- 4.5. 코루틴의 취소 확인
- 4.5.1. delay를 사용한 취소 확인
- 4.5.2. yield를 사용한 취소 확인
- 4.5.3. CoroutineScope.isActive를 사용한 취소 확인
- 4.6. 코루틴의 상태와 Job의 상태 변수
- 4.6.1. Job의 상태를 출력하는 함수 만들기
- 4.6.2. 생성 상태의 코루틴
- 4.6.3. 실행 중 상태의 코루틴
- 4.6.4. 실행 완료 상태의 코루틴
- 4.6.5. 취소 중인 코루틴
- 4.6.6. 취소 완료된 코루틴
- 4.6.7. 상태 정리
- 4.7. 요약
- 5장. async와 Deferred
- 5.1. async 사용해 결괏값 수신하기
- 5.1.1. async 사용해 Deferred 만들기
- 5.1.2. await를 사용한 결괏값 수신
- 5.2. Deferred는 특수한 형태의 Job이다
- 5.3. 복수의 코루틴으로부터 결괏값 수신하기
- 5.3.1. await를 사용해 복수의 코루틴으로부터 결괏값 수신하기
- 5.3.2. awaitAll을 사용한 결괏값 수신
- 5.3.3. 컬렉션에 대해 awaitAll 사용하기
- 5.4. withContext
- 5.4.1. withContext로 async-await 대체하기
- 5.4.2. withContext의 동작 방식
- 5.4.3. withContext 사용 시 주의점
- 5.5. 요약
- 6장. CoroutineContext
- 6.1. CoroutineContext의 구성 요소
- 6.2. CoroutineContext 구성하기
- 6.2.1. CoroutineContext가 구성 요소를 관리하는 방법
- 6.2.2. CoroutineContext 구성
- 6.2.3. CoroutineContext 구성 요소 덮어씌우기
- 6.2.4. 여러 구성 요소로 이뤄진 CoroutineContext 합치기
- 6.2.5. CoroutineContext에 Job 생성해 추가하기
- 6.3. CoroutineContext 구성 요소에 접근하기
- 6.3.1. CoroutineContext 구성 요소의 키
- 6.3.2. 키를 사용해 CoroutineContext 구성 요소에 접근하기
- 6.4. CoroutineContext 구성 요소 제거하기
- 6.4.1. minusKey 사용해 구성 요소 제거하기
- 6.4.2. minusKey 함수 사용 시 주의할 점
- 6.5. 요약
- 7장. 구조화된 동시성
- 7.1. 실행 환경 상속
- 7.1.1. 부모 코루틴의 실행 환경 상속
- 7.1.2. 실행 환경 덮어씌우기
- 7.1.3. 상속되지 않는 Job
- 7.1.4. 구조화에 사용되는 Job
- 7.2. 코루틴의 구조화와 작업 제어
- 7.2.1. 취소의 전파
- 7.2.2. 부모 코루틴의 자식 코루틴에 대한 완료 의존성
- 7.3. CoroutineScope 사용해 코루틴 관리하기
- 7.3.1. CoroutineScope 생성하기
- 7.3.2. 코루틴에게 실행 환경을 제공하는 CoroutineScope
- 7.3.3. CoroutineScope에 속한 코루틴의 범위
- 7.3.4. CoroutineScope 취소하기
- 7.3.5. CoroutineScope 활성화 상태 확인하기
- 7.4. 구조화와 Job
- 7.4.1. runBlocking과 루트 Job
- 7.4.2. Job 구조화 깨기
- 7.4.3. Job 사용해 일부 코루틴만 취소되지 않게 만들기
- 7.4.4. 생성된 Job의 부모를 명시적으로 설정하기
- 7.4.5. 생성된 Job은 자동으로 실행 완료되지 않는다
- 7.5. 요약
- 8장. 예외 처리
- 8.1. 코루틴의 예외 전파
- 8.1.1. 코루틴에서 예외가 전파되는 방식
- 8.1.2. 예제로 알아보는 예외 전파
- 8.2. 예외 전파 제한
- 8.2.1. Job 객체를 사용한 예외 전파 제한
- 8.2.2. SupervisorJob 객체를 사용한 예외 전파 제한
- 8.2.3. supervisorScope를 사용한 예외 전파 제한
- 8.3. CoroutineExceptionHandler를 사용한 예외 처리
- 8.3.1. CoroutineExceptionHandler 생성
- 8.3.2. CoroutineExceptionHandler 사용
- 8.3.3. 처리되지 않은 예외만 처리하는 CoroutineExceptionHandler
- 8.3.4. CoroutineExceptionHandler가 예외를 처리하도록 만들기
- 8.3.5. CoroutineExceptionHandler는 예외 전파를 제한하지 않는다
- 8.4. try catch문을 사용한 예외 처리
- 8.4.1. try catch문을 사용해 코루틴 예외 처리하기
- 8.4.2. 코루틴 빌더 함수에 대한 try catch문은 코루틴의 예외를 잡지 못한다
- 8.5. async의 예외 처리
- 8.5.1. async의 예외 노출
- 8.5.2. async의 예외 전파
- 8.6. 전파되지 않는 예외
- 8.6.1. 전파되지 않는 CancellationException
- 8.6.2. 코루틴 취소 시 사용되는 JobCancellationException
- 8.6.3. withTimeOut 사용해 코루틴의 실행 시간 제한하기
- 8.7. 요약
- 9장. 일시 중단 함수
- 9.1. 일시 중단 함수와 코루틴
- 9.1.1. 일시 중단 함수란 무엇인가?
- 9.1.2. 일시 중단 함수는 코루틴이 아니다
- 9.1.3. 일시 중단 함수를 별도의 코루틴상에서 실행하기
- 9.2. 일시 중단 함수의 사용
- 9.2.1. 일시 중단 함수의 호출 가능 지점
- 9.2.2. 일시 중단 함수에서 코루틴 실행하기
- 9.3. 요약
- 10장. 코루틴의 이해
- 10.1. 서브루틴과 코루틴
- 10.1.1. 루틴과 서브루틴
- 10.1.2. 서브루틴과 코루틴의 차이
- 10.2. 코루틴의 스레드 양보
- 10.2.1. delay 일시 중단 함수를 통해 알아보는 스레드 양보
- 10.2.2. join과 await의 동작 방식 자세히 알아보기
- 10.2.3. yield 함수 호출해 스레드 양보하기
- 10.3. 코루틴의 실행 스레드
- 10.3.1. 코루틴의 실행 스레드는 고정이 아니다
- 10.3.2. 스레드를 양보하지 않으면 실행 스레드가 바뀌지 않는다
- 10.4. 요약
- 11장. 코루틴 심화
- 11.1. 공유 상태를 사용하는 코루틴의 문제와 데이터 동기화
- 11.1.1. 가변 변수를 사용할 때의 문제점
- 11.1.2. JVM의 메모리 공간이 하드웨어 메모리 구조와 연결되는 방식
- 11.1.3. 공유 상태에 대한 메모리 가시성 문제와 해결 방법
- 11.1.4. 공유 상태에 대한 경쟁 상태 문제와 해결 방법
- 11.2. CoroutineStart의 다양한 옵션들 살펴보기
- 11.2.1. CoroutineStart.DEFAULT
- 11.2.2. CoroutineStart.ATOMIC
- 11.2.3. CoroutineStart.UNDISPATCHED
- 11.3. 무제한 디스패처
- 11.3.1. 무제한 디스패처란?
- 11.3.2. 무제한 디스패처의 특징
- 11.4. 코루틴의 동작 방식과 Continuation
- 11.4.1. Continuation Passing Style
- 11.4.2. 코루틴의 일시 중단과 재개로 알아보는 Continuation
- 11.4.3. 다른 작업으로부터 결과 수신해 코루틴 재개하기
- 11.5. 요약
- 12장. 코루틴 단위 테스트
- 12.1. 단위 테스트 기초
- 12.1.1. 단위 테스트란 무엇인가?
- 12.1.2. 테스트 환경 설정하기
- 12.1.3. 간단한 테스트 만들고 실행하기
- 12.1.4. @BeforeEach 어노테이션을 사용한 테스트 환경 설정
- 12.1.5. 테스트 더블을 사용해 의존성 있는 객체 테스트하기
- 12.2. 코루틴 단위 테스트 시작하기
- 12.2.1. 첫 코루틴 테스트 작성하기
- 12.2.2. runBlocking을 사용한 테스트의 한계
- 12.3. 코루틴 테스트 라이브러리
- 12.3.1. 코루틴 테스트 라이브러리 의존성 설정하기
- 12.3.2. TestCoroutineScheduler 사용해 가상 시간에서 테스트 진행하기
- 12.3.3. TestCoroutineScheduler를 포함하는 StandardTestDispatcher
- 12.3.4. TestScope 사용해 가상 시간에서 테스트 진행하기
- 12.3.5. runTest 사용해 테스트 만들기
- 12.4. 코루틴 단위 테스트 만들어 보기
- 12.4.1. 코루틴 단위 테스트를 위한 코드 준비하기
- 12.4.2. FollowerSearcher 클래스 테스트 작성하기
- 12.5. 코루틴 테스트 심화
- 12.5.1. 함수 내부에서 새로운 코루틴을 실행하는 객체에 대한 테스트
- 12.5.2. backgroundScope를 사용해 테스트 만들기
- 12.6. 요약
도서 오류 신고
정오표
정오표
올바른 인덱스는 여기에서 확인하실 수 있습니다.
[ p.165 : 아래에서 5행 ]
그림 5-6과 같이
->
그림 5-5와 같이
[ p.166 : 아래에서 2행 ]
그림 5-7과 같이
->
그림 5-6과 같이
[ p.276 : 코드 2행 ]
fun main() 8-7 결과 qusrud = runBlocking<Unit> {
->
fun main() = runBlocking<Unit> {