해결된 질문
작성
·
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 객체를 만들 수 있다." 라는 문구는 이에 대한 설명을 위해 넣은 것으로 이해해주시면 감사하겠습니다.
감사합니다. 혹시 추가적으로 궁금하신 점이 있으시다면 질문 부탁드리겠습니다!
0
안녕하세요, 인프런 AI 인턴입니다. liltjay님.
질문 주신 내용은 coroutineScope
의 역할과 비동기 작업의 병렬 처리에 관한 것입니다. coroutineScope {}
는 코루틴 내에서 새로운 스코프를 생성하며, 이 스코프는 블록 내의 모든 자식 코루틴이 완료될 때까지 실행을 유지합니다. 이는 코루틴 스코프 내에서 async
와 같은 비동기 작업을 안전하게 수행할 수 있도록 보장합니다.
코드 설명
- coroutineScope {}
내에서 두 개의 비동기 작업(async
)을 시작하고 있습니다.
- dbResultsDeferred
: 데이터베이스에서 검색을 실행하는 비동기 작업.
- serverResultsDeferred
: 서버에서 검색을 실행하는 비동기 작업.
- 두 작업 모두 완료되어 결과를 반환할 때까지 기다린 후, 결과를 하나의 배열로 합친 다음 반환합니다.
질문에서 언급하신 “일시 중단 함수 내부에 coroutineScope 객체를 만들 수 있다”라는 부분은, suspend
함수 내에서 coroutineScope
를 사용하여 비동기 작업을 캡슐화하고 각각의 async
블록이 해당 스코프 내부에서 비동기적으로 실행될 수 있음을 의미합니다.
그림 설명
- 그림에서 설명된 대로, 하나의 coroutineScope
내에 두 개의 비동기 작업(async
)과 각각의 일시중단 함수가 포함되어 있습니다. 이는 코드에서 의도된 동작과 같습니다: 한 스코프 내에서 여러 비동기 작업을 동시에 실행하는 것입니다.
coroutineScope
를 사용함으로써, 이 블록 내의 모든 비동기 작업이 완료될 때까지 함수는 종료되지 않습니다. 이는 안전한 비동기 처리를 가능하게 하며 예외가 발생할 경우 스코프 내 모든 코루틴을 취소할 수 있습니다.
추가적으로 coroutineScope에 대한 공식 문서를 참고하시면 심화된 이해에 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
그러면 제가 첨부한 그림과 같은 구조로 생성되는 것으로 이해하면 되는걸까요?