Table of contents
Open Table of contents
launch 빌더
lanch함수는CoroutineScope를 확장한 함수로, 코루틴을 시작하는 역할을 합니다.CoroutineScope는 부모 코루틴과 자식 코루틴 사이의 관계를 정립하기 위한 목적으로 사용되는 구조화된 동시성의 핵심입니다.lanch가 작동하는 방식은 데몬 스레드와 어느 정도 비슷하지만 훨씬 가볍습니다.
runBlocking 빌더
코루틴이 스레드를 블로킹하지 않고 작업을 중단시키기만 하는 것이 일반적인 법칙입니다. 하지만 블로킹이 필요한 경우도 있습니다.
- 프로그램이 끝나는 걸 방지하지 위해 스레드를 블로킹할 필요가 있는 메인함수
 - 테스트 코드에서 코루틴을 블로킹하는 경우
 
메인 함수는 runBlocking 대신에 suspend를 붙여 중단 함수로 만드는 방법을 주로 사용합니다.
async 빌더
async는launch와 비슷하지만 반환값이 있습니다.async는Deferred를 반환하며,Deferred는Job을 상속받아Job의 모든 기능을 가지고 있습니다.async는 두 가지 다른 곳에서 데이터를 얻어와 합치는 경우처럼, 두 작업을 병렬로 실행할 때 주로 사용됩니다.
구조화된 동시성
- 자식은 부모로부터 컨텍스트를 상속받습니다(하지만 자식이 이를 재정의할 수도 있습니다)
 - 부모는 모든 자식이 작업을 마칠 때까지 기다립니다
 - 부모 코루틴이 취소되면 자식 코루틴도 취소됩니다
 - 자식 코루틴에서 에러가 발생하면 부모 코루틴 또한 에러롤 소멸합니다
 
다른 코루틴 빌더와 달리 runBlocking은 CoroutineScope를 확장하지 않습니다.
runBlocking은 자식이 될 수 없으며 루트 코루틴으로만 사용될 수 있다는 것을 의미합니다.
현업에서의 코루틴 사용
중단 함수는 다른 중단 함수들로부터 호출되어야 하며, 모든 중단 함수는 코루틴 빌더로 시작되어야 합니다.
suspend fun getArticlesForUser(
  userToken: String?,
): List<ArticleJson> = coroutineScope {
  val articles = async { getArticles(userToken) }
  val user = userService.getUser(userToken)
  articles.await()
  .filter { canSeeOnList(user, it) }
  .map { it.toArticleJson() }
}
coroutineScope는 람다 표현식이 필요로 하는 스코프를 만들어 주는 중단 함수 입니다.- 이 함수는 
runBlocking처럼 람다식이 반환하는 것이면 무엇이든 반환합니다. - 중단 함수 내에서 스코프가 필요할 때 일반적으로 사용하는 함수입니다.