[코루틴] 효율적이고, 빠른 경험을 주는 동시성(Concurrent) 구현하기.

2025. 5. 26. 13:00Kotlin

728x90

안녕하세요.

 

오늘은 코루틴의 동시성을 구현할 것입니다. 

 

이전 핸즈 랩의 내용 중 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"을 사용할 수 있습니다. 라이브러리마다 코루틴 빌더를 추가할 수 있습니다.

 

한 스레드에서 순차적으로 실행하는 것과 동시에(concurrency)하게 실행하는 것의 차이

위 그림에서 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. 혹시라도 부족한 부분이 있다면 덧글로 남겨주세요. 남기시면, 더 나은 글을 쓸 재료가 됩니다.

728x90