2025. 5. 26. 13:00ㆍKotlin
안녕하세요.
오늘은 코루틴의 동시성을 구현할 것입니다.
이전 핸즈 랩의 내용 중 5. concurrency와 관련하여 포스팅을 하고자 합니다. 1~4번까지가 기본적인 기능에 대한 맛보기였다면 이때부터는 좀 더 효율적인 코드 작성을 알수 있는 팁들이 본격적으로 시작됩니다. 여기서 효율성은 역시 속도가 빠른 코드를 짜는 것입니다.
1. Blocking Requests
2. Callbacks
2-1. Use a background thread
2-2 Use the retrofit callback API
3. Suspending function
4. Coroutines
5. Concurrency
6. Structured concurrency
7. Showing progress
8.Channels
9. Testing coroutines
코틀린의 코루틴은 스레드보다 리소스가 가볍습니다. 비동기로 새로운 연산을 할 때 프로그래머는 새로운 코루틴을 만들 수 있습니다.
코루틴을 시작하려면 코루틴 빌더 중 하나인 "launch", "async", "runBlocking"을 사용할 수 있습니다. 라이브러리마다 코루틴 빌더를 추가할 수 있습니다.
위 그림에서 async concurrency 부분과 같이 동작할 예정입니다.
실습은 다음과 같습니다.
intro-coroutine > src > task > Request5Concurrent.kt 파일을 수정함.
suspend fun loadContributorsConcurrent(service: GitHubService, req: RequestData): List<User> = coroutineScope {
// 깃허브의 코드 저장소 내용 초기화.
val repos = service
.getOrgRepos(req.org)
.also { logRepos(req, it) }
.bodyList()
// 코드 저장소 내용을 네트워크를 통해 호출함.
repos.map{ repo ->
async{
service
.getRepoContributors(req.org,repo.name)
.also{ logUsers(repo,it)}
.bodyList()
}
}.awaitAll().toList().flatten().aggregate()
}
코드에 대한 세부적인 설명은 다음과 같습니다.
- async
- 비동기로 호출한다는 것을 명시합니다.
- awaitAll()
- 비동기로 호출한 모든 것들이 올 때까지 기다립니다.
- toList()
- 네트워크 에서 JSON Array형태로 오게 되는데 이를 List로 변환합니다.
- flatten()
- 이 네트워크 요청의 결과는 Array 안에 Array가 들어간 형태입니다. 보기 쉽게 하려고 이를 Array로 바꾸는 작업을 합니다.
- aggregate()
- faltten() 작업을 한다음 데이터를 합치는 작업 합니다.
[환경]
[reference]
코루틴 핸즈온
https://kotlinlang.org/docs/coroutines-and-channels.html#generate-a-github-developer-token
[도움]
1. 응원 댓글은 글 쓰는데 힘이 됩니다.
2. 공감도 글 쓰는데 힘이 됩니다.
3. 광고 한번 클릭해 주시면 힘은 두 배가 됩니다.
4. 혹시라도 부족한 부분이 있다면 덧글로 남겨주세요. 남기시면, 더 나은 글을 쓸 재료가 됩니다.
'Kotlin' 카테고리의 다른 글
[코루틴] 채널에 대한 모든것 1 (0) | 2025.05.28 |
---|---|
[코루틴] 윈도 어플리케이션 실전 사용을 위한 준비물 2 (0) | 2025.05.24 |
[코루틴] 윈도 어플리케이션 실전 사용을 위한 준비물 1 (0) | 2025.05.03 |
[코루틴]작업 캔슬하지 못하게 하기 (0) | 2025.04.30 |
[Kotlin][MVVM] 2. 실전 MVVM 합니다. (1) | 2025.04.12 |