728x90
Coroutines | Kotlin
kotlinlang.org
https://github.com/Raconer/kotlin_study/tree/main/src/main/kotlin/coroutine
kotlin_study/src/main/kotlin/coroutine at main · Raconer/kotlin_study
Contribute to Raconer/kotlin_study development by creating an account on GitHub.
github.com
Kotlin 코루틴은 비동기 코드를 동기처럼 깔끔하게 작성할 수 있도록 도와주는 경량 스레드 기반의 논블로킹 구조입니다.
✅ 코루틴이란?
- 실행을 중단(suspend) 했다가 다시 재개(resume) 할 수 있는 함수 흐름
- 스레드를 점유하지 않고도 비동기 처리가 가능
- 비동기 코드의 복잡한 콜백 지옥을 해결하면서도, 예외 처리와 가독성까지 확보
💡 왜 코루틴이 필요했을까?
기존 방식 | 문제점 |
---|---|
콜백 기반 비동기 | 중첩, 가독성 낮음, 예외 처리 어려움 |
Future/Promise | 명시적 조합 복잡, 예외 전파 어려움 |
멀티스레딩 | 자원 낭비, 컨텍스트 스위칭 비용 높음 |
➡️ 이를 해결하기 위해 코루틴 + suspend 함수 + async/await 스타일이 등장
🧵 코루틴 vs async/await
항목 | 설명 |
---|---|
async/await |
코루틴 위에서 비동기 흐름을 작성하는 문법 (JS, Python에선 키워드) |
코루틴 | 실행 흐름을 중단·재개할 수 있는 기술/기반 구조 |
Kotlin에선 | async , await 는 키워드(예약어)가 아닌 라이브러리 함수임 |
🔄 코루틴은 Non-blocking?
- ✅ Non-blocking 맞음!
suspend
함수는 I/O 응답을 기다리는 동안 스레드를 점유하지 않음- 응답이 오면 그 시점부터 흐름을 재개
suspend fun fetch(): String {
val response = client.get("...")
return response.body
}
🧩 코루틴은 블로킹 서버(Spring MVC)에서도 쓰일 수 있나?
- 가능함 ✅
- Spring MVC에서 suspend fun을 컨트롤러에 쓰면, 내부적으로 논블로킹처럼 작동
- 다만, 진정한 전체 논블로킹은 Spring WebFlux와 함께 사용하는 게 더 적합
🧠 구조적 동시성이란?
- coroutineScope, supervisorScope로 여러 코루틴을 묶어 관리
- 코루틴 하나 실패 시 전체 취소, 예외 통합 가능
⸻
🔧 정리 요약
항목 | 핵심 요점 |
---|---|
코루틴 | 중단·재개 가능한 경량 스레드 |
suspend | 비동기 함수 선언 키워드 |
async/await | 비동기 흐름 표현 방식 (라이브러리 함수) |
Non-blocking | 기본 동작이며, 스레드 점유 없음 |
Spring MVC | 위에서도 사용 가능, WebFlux가 더 적합 |
장점 | 가독성, 자원 효율, 구조적 동시성, 예외 처리 |
⚠️ 코루틴의 단점 및 주의할 점
항목 | 내용 |
---|---|
초기 진입 장벽 | suspend , Dispatcher , CoroutineScope 등 개념이 많고 익숙해지기 어려움 |
디버깅 | 중단점이 눈에 안 보여서 콜 스택 추적이 어려움 (IDE 지원은 점점 개선 중) |
예외 전파 | 구조적 동시성을 이해하지 않으면 코루틴 내 예외 누락 가능성 존재 |
컨텍스트 전파 | 스레드 로컬 기반의 정보 전달이 어려움 (ThreadLocal → CoroutineContext 사용 필요) |
플랫폼 의존성 | 일부 코루틴 기능은 JVM 기반에 최적화되어 있어, 멀티 플랫폼에서는 제한 있음 |
오용 시 성능 저하 | 잘못된 디스패처 선택이나 불필요한 코루틴 중첩은 오히려 성능을 떨어뜨림 |
테스트 어려움 | suspend 함수와 코루틴 스코프가 엮인 경우 단위 테스트 환경 구성이 까다로움 |
📚 참고 학습 포인트
- suspend fun 작성과 호출 원리
- Dispatchers.Default, IO, Unconfined 차이
- async, launch, withContext 사용 시점
- runBlocking의 역할과 사용 주의점
📎 코루틴은 “언어적 비동기 추상화”다. 단순한 async 코드 작성을 넘어서, 안전하고 효율적인 병렬 흐름 관리까지 가능하게 해주는 Kotlin만의 강력한 기능이다.
728x90
'Language > Kotlin' 카테고리의 다른 글
멀티스레드 vs 버추얼 스레드 vs 코루틴: 실패와 중지 처리는 어떻게 다를까? (0) | 2025.07.14 |
---|---|
Kotlin 코루틴은 멀티스레드 안에서 비동기 처리가 되는 걸까 (0) | 2025.07.14 |
Kotlin/Java 컬렉션 구조 비교: Stack vs Queue vs ArrayDeque (0) | 2025.07.07 |
Kotlin Coroutine 핵심 키워드 & 함수 정리 (0) | 2025.06.06 |