coroutine 5

Kotlin Coroutine 동작을 이해해보기 - Continuation 멈추고 보기

서론 이전 편과 이어서, Continuation이 만들어지는 파일을 보겠습니다. 이전 편에서, Continuation을 상속받는 Impl을 컴파일러가 만들어주고, 라벨 정보와 함께 그에 따른 결과를 가지고 있을 것이라고 추측했는데요, 디버깅을 통해 실제로 그러한지 살펴 보겠습니다. 본론 실제로 디버깅을 한 후 콜스택을 보면 볼 수 있는데요, 다음과 같이 중단점을 걸고 콜스택을 보면 아래와 같습니다. 이제 밑에부터 보면, android os 단의 콜스택은 무시하고, 코루틴 콜스택을 보면 continuation 객체에 라벨 정보와 함께 result final field 안에 정보가 담겨있습니다. 예상했던 대로군요. 이 continuation을 가지고 다시 resumeWith로 가보겠습니다. 이전에 말했던 것..

Kotlin 2023.11.05

Kotlin Coroutine 동작을 이해해보기 - CPS, Continuation 이란?

서론 이번 포스트를 이해하기 위해서는 어렵지만 알아야하는 개념들이 몇가지 있습니다 ㅠㅠ 어려워도 쉽게 풀어서 작성해볼테니 잘따라오시길 바랍니다. 코루틴 내부에서는 CPS를 사용합니다. 이는 Continuation Passing Style을 줄인 말로, 아래 예시를 보면 더 이해하기 쉽습니다. 간단한 CPS 와 Continuation fun postItem(item: Item) { val token = requestToken() val post = createPost(token, item) processPost(post) } 위와 같은 코드가 있다고 하고, (1) requestToken(), (2) createPost(), (3) processPost 모두 suspend point라고 가정하고, postI..

Kotlin 2023.10.24

Kotlin Coroutine 동작을 이해해보기 - Coroutine 이란?

Android 개발을 시작 했을 때, 저는 rxJava를 이용해 서버 통신 등 비동기 프로그래밍을 수행했었습니다. 그런데, 이제는 명백히 flow와 Coroutine이 대세가 된 것을 느낄 수 있습니다 (공식 문서, 컨퍼런스 등등). 이처럼 안드로이드 개발과 Kotlin이 떨어질 수 없게 되면서 Coroutine 또한 당연하게 사용법을 알아야만 했습니다. 그런데, 정작 Coroutine의 Android에서 사용법 (viewModelScope, lifecycleScope.launch 와 같이...)만 알 뿐, Coroutine의 원리는 무엇인지에 대해 깊이 고민해 볼 시간을 가지지 않았습니다. 이에 반성하여, 자세하게 코루틴이 어떻게 동작하는지도 공부해보았습니다. ---------- 장점? 먼저 Corou..

Kotlin 2023.10.11

Kotlin Coroutine 동작을 이해해보기 - JVM에 대해서...

지난 9월 12일, droid knight 2023에 다녀왔었고, 그곳에서 김준비님의 Coroutine Deep Dive 에 대한 강연을 듣고나서, 아직도 Coroutine에 대해서 잘 알지 못하고 있었다고 생각해서, 다시 공부해야봐야겠다는 생각을 했습니다. 강연을 듣다보니, 왜 Coroutine이 경량화된 쓰레드를 사용하는 것 처럼 동작하는지에 대해서도 설명이 나왔는데, 오랜만에 JVM 구조나 동작을 떠올려보려고 했더니, 기억이 나지 않아서 다시금 공부하여 정리하는 기회를 가져보려고 합니다. 이를 통해 kotlin에서 coroutine이 왜, 어떻게 light-weight thread 처럼 동작하는지 이해해보고, 다음 포스트에서 코루틴에 대해서 정리를 이어나가보도록 해보겠습니다. (사실상 part on..

Kotlin 2023.09.25

Coroutine과 Retrofit을 같이 사용하면 enqueue를 쓰지 않아도 되는 이유는?

이 포스팅을 작성하는 이유 안드로이드를 처음 접할 때 retrofit을 이용해 서버와 통신할 경우 아래와 같은 코드를 작성하게됩니다. interface UserApi { @GET("api/") suspend fun getUserList( @Query("page") page: Int, @Query("results") results: Int, @Query("seed") seed: Int, ): Call } ... NetworkManager.UserApi .getUserList(page, MainActivity.USER_COUNT, seed) .enqueue(object : Callback{ override fun onResponse(call: Call, response: Response) { // 통신 성공..

Android 2022.09.13