중지 컨텍스트 내에서 잠재적으로 문제가 될 수 있는 묵시적 CoroutineScope 리시버의 액세스를 보고합니다.

suspend 함수나 람다가 외부 컨텍스트에서 묵시적 CoroutineScope 리시버를 캡처할 경우, 예상치 못한 동작이 발생할 수 있습니다.

이런 코드는 구조적 동시성의 규칙을 위반하기 쉬우며, 겉보기에 잘 구조화된 것처럼 보일 수 있습니다.

이로 인해 오류를 처리하거나 계산을 취소하거나 수명 주기를 관리할 때 잘못된 동작이 발생할 수 있습니다.

일반적인 예시:


fun processFlow(flow: Flow<String>) {
  runBlocking {
    flow.collectLatest {
      
      // this@runBlocking CoroutineScope에서 시작됩니다
      launch { 
        longProcessing(value)
      }
  
    }
  }
}
  
suspend fun longProcessing(value: String) { ... }

위 예시에서 launch { ... } 호출은 외부 runBlocking 호출에서 묵시적 CoroutineScope 내 코루틴을 시작합니다.

이 때문에 collectLatest는 필요 시 이러한 코루틴을 취소할 수 없습니다.

이 검사는 launch가 현재 중단 람다 외부(즉, collectLatest의 본문)에서 캡처된 CoroutineScope에서 호출된 것을 탐지합니다.

이 특정 문제에 대한 자세한 내용은 이 GitHub 이슈를 참조하세요.

가능한 해결 방법:

이 문제를 해결하는 방법은 다음과 같습니다.

코드가 올바르다고 확신하는 경우 의도를 명확히 하기 위해 리시버를 명시적으로 지정할 수 있습니다. 위 예시에서는 this@runBlocking.launch { ... }가 될 것입니다. 단, 이 경우 코드의 의미가 변하지 않아야 한다는 점에 유의하세요.