인프런 커뮤니티 질문&답변

liltjay님의 프로필 이미지
liltjay

작성한 질문수

코틀린 코루틴 완전 정복

coroutineScope에 대해 질문 있습니다.

해결된 질문

작성

·

57

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개의 비동기 작업과 각각의 일시중단 함수를 포함하는 것"으로 받아들여지는데 제가 어느 부분을 놓치고 있는건지 잘 모르겠습니다. 감사합니다. ^^

 

답변 2

1

조세영님의 프로필 이미지
조세영
지식공유자

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

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

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

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

liltjay님의 프로필 이미지
liltjay
질문자

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

조세영님의 프로필 이미지
조세영
지식공유자

넵 맞습니다.

0

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

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

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

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

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

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

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

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

liltjay님의 프로필 이미지
liltjay

작성한 질문수

질문하기