Language/Kotlin

[1] 왜 코루틴을 써야 할까? – Kotlin이 선택한 비동기 방식

Raconer 2025. 6. 6. 16:38
728x90

Coroutine Document

 

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 지원은 점점 개선 중)
예외 전파 구조적 동시성을 이해하지 않으면 코루틴 내 예외 누락 가능성 존재
컨텍스트 전파 스레드 로컬 기반의 정보 전달이 어려움 (ThreadLocalCoroutineContext 사용 필요)
플랫폼 의존성 일부 코루틴 기능은 JVM 기반에 최적화되어 있어, 멀티 플랫폼에서는 제한 있음
오용 시 성능 저하 잘못된 디스패처 선택이나 불필요한 코루틴 중첩은 오히려 성능을 떨어뜨림
테스트 어려움 suspend 함수와 코루틴 스코프가 엮인 경우 단위 테스트 환경 구성이 까다로움

📚 참고 학습 포인트

  • suspend fun 작성과 호출 원리
  • Dispatchers.Default, IO, Unconfined 차이
  • async, launch, withContext 사용 시점
  • runBlocking의 역할과 사용 주의점

📎 코루틴은 “언어적 비동기 추상화”다. 단순한 async 코드 작성을 넘어서, 안전하고 효율적인 병렬 흐름 관리까지 가능하게 해주는 Kotlin만의 강력한 기능이다.

 

728x90