시배's Android

Kotlin 동시성 프로그래밍 | 4장. 일시 중단 함수와 코루틴 컨텍스트 본문

Book/Kotlin 동시성 프로그래밍

Kotlin 동시성 프로그래밍 | 4장. 일시 중단 함수와 코루틴 컨텍스트

si8ae 2023. 7. 9. 23:03

Repository With Suspend Functions

일시 중단 함수를 만들려면 시그니처에 suspend 제어자만 추가하면 된다.

코루틴 외부에서 이 함수를 호출하면 동작하지 않는다.

interface ProfileServiceRepository {
    suspend fun fetchByName(name : String) : Profile
    suspend fun fetchById(id : Long) : Profile
}

class ProfileServiceClient : ProfileServiceRepository {
    override suspend fun fetchByName(name : String) : Profile {
        return Profile(1, name, 28)
    }
    
    override suspend fun fetchById(id : Long) : Profile {
        return Profile(id, "Susan", 28)
    }
}
  • 유연함 : 인터페이스의 상세 구현 내용은 노출되지 않기 때문에 퓨처를 지원하는 모든 라이브러리를 구현에서 사용할 수 있다. 현재 스레드를 차단하지 않고 예상된 Profile을 반환하는 구현이라면 어떤 퓨처 유형도 동작할 것이다.
  • 간단함 : 순차적으로 수행하려는 작업에 비동기 함수를 사용하면 항상 await()를 호출해야 하는 번거로움이 생기고, 명시적으로 async가 포함된 함수의 이름을 지정해야 한다. 일시 중단 함수를 사용하면 레파지토리를 사용할 때마다 이름을 변경하지 않아도 되고 await()를 호출할 필요가 없어진다.
  • 가이드라인 
    • Job이 엮이는 것을 피하기 위해서는 일시 중단 함수를 사용하는 것이 좋다.
    • 인터페이스를 정의할 때는 항상 일시 중단 함수를 사용한다.
    • 마찬가지로 추상함수를 정의할 때는 항상 일시 중단 함수를 사용한다.

코루틴 컨텍스트

  • 컨텍스트는 코루틴이 어떻게 실행되고 동작해야 하는지를 정의할 수 있게 해주는 요소들의 그룹이다.
  • 디스패처 : 코루틴이 실행될 스레드를 결정한다.
  • 단일 스레드 컨텍스트 : 항상 코루틴이 특정 스레드 안에서 실행된다는 것을 보장한다. -> newSingleThreadContext()
  • 스레드 풀 : 해당 풀에서 가용한 스레드에서 코루틴을 시작하고 재개한다. 런타임이 가용한 스레드를 정하고 부하 분산을 위한 방법도 정하기 때문에, 따로할 작업이 없다.
  • 예외 처리 : CoroutineExceptionHandler를 구현해 만들 수 있다.
  • Non-cancellable : 코루틴이 취소되는 동안 일시 중지가 필요한 경우 사용한다.
  • 컨텍스트 결합 가능 : 더하기 연산자로 결합 가능하다.
  • 컨텍스트 분리 가능 : 제거할 요소의 키에 대한 참조가 있어야 한다.
  • withContext()를 사용해 코드 블럭에 대한 컨텍스트를 변경할 수 있다.