들어가며..
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
'개발 > 언어' 카테고리의 다른 글
java) lombok builder 사용시 generic 사용하기 (0) | 2025.01.31 |
---|---|
java.util.Date 와 java.util.Calendar 를 사용하지말자 (0) | 2024.01.30 |