inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

코틀린 코루틴 완전 정복

coroutineScope에 대해 질문 있습니다.

해결된 질문

163

liltjay

작성한 질문수 25

1

suspend fun searchByKeyword(keyword: String): Array<String> = coroutineScope {
    val dbResultsDeferred = async {
        searchFromDB(keyword)
    }

    val serverResultsDeferred = async {
        searchFromServer(keyword)
    }

    return@coroutineScope arrayOf(*dbResultsDeferred.await(), *serverResultsDeferred.await())
}

안녕하세요 "일시 중단 함수의 사용" 학습 중 나온 코드에 대해 질문 드립니다.
강의에서는 "coroutineScope을 사용하면, 일시중단 함수 내부에 coroutineScope 객체를 만들 수 있다."
라고 하셨는데, 이 부분이 이해가 잘 안갑니다.

먼저 coroutineScope {}를 선언하고, async 비동기 작업 -> delay 일시중단 순으로 진행되는데
일시중단 함수 내부에 coroutineScope 객체를 만들 수 있는 것이 이해가 잘 가지 않습니다.

제가 정리하기로는, "coroutineScope을 사용하면, 일시중단 함수 내부에 coroutineScope 객체를 만들 수 있다."라기 보다는
위 그림처럼 "하나의 coroutineScope에 2개의 비동기 작업과 각각의 일시중단 함수를 포함하는 것"으로 받아들여지는데 제가 어느 부분을 놓치고 있는건지 잘 모르겠습니다. 감사합니다. ^^

 

android kotlin coroutine kotlinx.coroutines android-coroutine

답변 2

1

조세영

liltjay님 안녕하세요. 지식공유자 조세영입니다.

일시중단 함수에서는 별도 처리 없이 CoroutineScope 객체에 접근이 불가능해 CoroutineScope의 확장 함수로 정의된 launch 나 async의 호출이 불가능하기 때문에 새로운 코루틴을 만들기 어렵습니다. 하지만 coroutineScope 일시 중단 함수를 사용하면 새로운 CoroutineScope 객체를 만들 수 있고, 이 객체를 사용해 launch나 async 함수를 호출 할 수 있게 되는데요.

따라서 "coroutineScope 함수를 사용하면, 일시중단 함수 내부에 coroutineScope 객체를 만들 수 있다." 라는 문구는 이에 대한 설명을 위해 넣은 것으로 이해해주시면 감사하겠습니다.

감사합니다. 혹시 추가적으로 궁금하신 점이 있으시다면 질문 부탁드리겠습니다!

0

liltjay

그러면 제가 첨부한 그림과 같은 구조로 생성되는 것으로 이해하면 되는걸까요?

1

조세영

넵 맞습니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. liltjay님.

질문 주신 내용은 coroutineScope의 역할과 비동기 작업의 병렬 처리에 관한 것입니다. coroutineScope {}는 코루틴 내에서 새로운 스코프를 생성하며, 이 스코프는 블록 내의 모든 자식 코루틴이 완료될 때까지 실행을 유지합니다. 이는 코루틴 스코프 내에서 async와 같은 비동기 작업을 안전하게 수행할 수 있도록 보장합니다.

코드 설명
- coroutineScope {} 내에서 두 개의 비동기 작업(async)을 시작하고 있습니다.
- dbResultsDeferred: 데이터베이스에서 검색을 실행하는 비동기 작업.
- serverResultsDeferred: 서버에서 검색을 실행하는 비동기 작업.
- 두 작업 모두 완료되어 결과를 반환할 때까지 기다린 후, 결과를 하나의 배열로 합친 다음 반환합니다.

질문에서 언급하신 “일시 중단 함수 내부에 coroutineScope 객체를 만들 수 있다”라는 부분은, suspend 함수 내에서 coroutineScope를 사용하여 비동기 작업을 캡슐화하고 각각의 async 블록이 해당 스코프 내부에서 비동기적으로 실행될 수 있음을 의미합니다.

그림 설명
- 그림에서 설명된 대로, 하나의 coroutineScope 내에 두 개의 비동기 작업(async)과 각각의 일시중단 함수가 포함되어 있습니다. 이는 코드에서 의도된 동작과 같습니다: 한 스코프 내에서 여러 비동기 작업을 동시에 실행하는 것입니다.

coroutineScope를 사용함으로써, 이 블록 내의 모든 비동기 작업이 완료될 때까지 함수는 종료되지 않습니다. 이는 안전한 비동기 처리를 가능하게 하며 예외가 발생할 경우 스코프 내 모든 코루틴을 취소할 수 있습니다.

추가적으로 coroutineScope에 대한 공식 문서를 참고하시면 심화된 이해에 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

CoroutineDispatcher에 대한 질문

0

101

2

코루틴과 JVM이 끝나는 조건에 대해 문의 드립니다.

0

113

2

Job() 생성후 complete을 불러 주어야 하는 경우가 헷깔립니다.

1

90

1

왜 runBlocking 종료로 메인스레드가 종료될까요?

0

137

1

cancel 질문드립니다.

1

107

2

delay 함수 사용 시 스레드 양보

1

152

2

강사님께서 번역해주신 코틀린 코루틴 공식 가이드 문서 문의

2

170

2

Flow와 Channel

1

166

2

[코틀린 코루틴의 정석 책 추첨 이벤트] 강의 구매 기간 관련 문의

1

243

1

[코루틴 테스트 심화] runTest의 스레드 관련 문의

1

182

2

job과 코루틴의 관계?

3

277

2

코루틴의 blocking I/O작업 처리

0

172

2

KTOR Server 에서 delay

0

144

2

CoroutineDispatcher(Default, IO)의 limitedParallelism 관련 질문

1

255

1

suspend 문의 드려요

2

140

2

스레드 양보 예제 + 코루틴/멀티스레드 사용 예시 질문

1

198

2

coroutineScope 관련 질문 및 실제 사용 사례에 대한 질문

1

285

3

Coroutine 취소 시점 체크

1

152

2

spring web mvc 환경에서 coroutine을 사용해보신 경험이 있으신지 궁금합니다.

1

350

2

코루틴이 멀티스레드의 단점을 해결했다는 부분에 대해 질문드립니다.

2

202

1

Dispatcher.IO의 동작원리

0

269

3

실무에서 runBlocking 와 CoroutineScope 실무 사용에 대해

0

270

2

Code3-6에서 imageProcessingDispatcher가 inline으로는 동작하지 않는 이유가 궁금합니다

1

130

2

공유 스레드 풀 질문드려요!

1

170

2