본문 바로가기
개발/언어

Kotlin) Coroutine 알아보기 - 중요

by 얼굴값하는사람 2024. 1. 9.
반응형

 

 

들어가며..

kotlin 의 중요한 개념인 Coroutine 에 대하여 알아보겠습니다. 특히 자바에 익숙해져 있다면 스레드와 다르니 꼭 숙지해야 합니다. ( 나중에 고생해요..)

 

개념

코루틴(coroutine)은 루틴의 일종으로서, 협동 루틴이라 할 수 있습니다. 코루틴의 "Co"는 with 또는 together를 뜻하며 즉, 상호 연계 프로그램을 일컫는다고도 표현가능합니다.

만약에 코루틴이 없다면.. 아래와 같은 콜백 코드를 작성해야 합니다. 예전 스타일 자바스크립트로 개발하신분은 이해하실거에요 ^^

fun getPaymentInfo(api: PaymentService): Booking {
    api.getPaymentInfo(bookingId) { orderId -> 
        api.getPointInfo(orderId){ orderId -> 
            api.getProductInfo(productId) { cookie -> 
                return productInfo
            }
        }
    }
}

 

코루틴은 위의 예시처럼 콜백 기본 코드를 순차적인 코드(like c)로 바꿔주기 때문에 비동기 코드를 단순하게 표현 할 수 있습니다.

suspend fun getPaymentInfo(api: paymentService): ProductInfo {
    val paymentInfo = api.getPaymentInfo()
    val pointInfo = api.getPointInfo(paymentInfo.orderId)
    val productInfo = api.getProductInfo(pointInfo.productId)
    return productInfo
}

순차적인 코드로 표현하면 Coroutine에서는 들여쓰기가 사라져 코드 가독성이 좋아졌으며, 중간의 콜백 람다 블록들이 사라져 현재 위치를 더 추론하기 쉬워졌습니다. 코드의 가독성과 추론성은 예측 가능한 프로그램을 만드는 데에 도움을 준다는 점에서 에러 핸들링과 디버깅과 같은 작업에서 큰 이점을 줍니다.

 

Kotlin의 suspend 키워드는 내부적으로 콜백을 생성합니다. 즉, suspend 키워드를 만난 Kotlin 컴파일러는 suspend-resume을 위한 최적화된 콜백 코드를 생성합니다. 

Coroutine에는 CPS(Continuation Passing Style) 패러다임이 적용되어 있습니다. CPS란 호출되는 함수에 Continuation을 전달하고, 각 함수의 작업이 완료되는 대로 전달받은 Continuation을 호출하는 패러다임을 의미합니다. 이러한 의미에서 Continuation을 일종의 콜백으로 생각할 수 있습니다.

코루틴의 핵심 개념을 요약하면 다음과 같습니다.

중요한점은 Kotlin 컴파일러가 suspend 키워드를 만나면 CPS 패러다임을 구현하여, Continuation이라는 일종의 콜백을 주고 받도록 코드를 변환해준다는 것입니다.

  • Coroutine은 Continuation을 주고 받는 CPS 패러다임을 사용합니다.
  • Kotlin 컴파일러는 suspend fun의 시그니처를 변경합니다. 매개변수에 Continuation을 추가합니다.
  • Kotlin 컴파일러는 suspend fun의 내부 코드들을 분석하여 중단 가능 지점을 찾아 구분합니다.
  • Kotlin 컴파일러는 다음 실행 지점을 나타내는 label과 내부 변수들을 관리하는 상태머신 클래스를 생성합니다.

 

정리하며

회사 내부에서 Coroutine과 Completable 그리고 Thread pool 를 사용한 구현체로 성능평가한적이 있는데 Coroutine 이 성능면에서 제일 좋았던 기억이 있습니다.

자바를 하셨더라면 공부해야 할 부분이 많습니다. 조금만 더 힘내봅시다.

읽어주셔서 감사합니다.

 

아래 글을 많이 참고 하였습니다.

https://tech.devsisters.com/posts/crunchy-concurrency-kotlin/

 

바삭한 신입들의 동시성 이야기 - Kotlin 편

마이쿠키런 신입 안드로이드 개발자의 Kotlin Coroutine 탐방기

tech.devsisters.com

 

반응형