IMCAT.DEV
로그인 가입
Kotlin 중급 비동기

Kotlin 비동기 프로그래밍 심화

Kotlin 비동기 프로그래밍 심화 — 중급

비동기 프로그래밍 심화

1. 도입 (왜 배워야 하는가)

비동기 프로그래밍은 현대 애플리케이션 개발에서 매우 중요한 기법입니다. 특히, 사용자 인터페이스(UI)와 서버 통신, 데이터베이스 쿼리와 같은 I/O 작업을 수행할 때, 비동기 처리는 사용자 경험을 크게 향상시킵니다. 예를 들어, 사용자가 버튼을 클릭했을 때, 서버로부터 데이터를 요청하는 동안 UI가 멈춘다면 사용자는 불편함을 느끼게 됩니다. 비동기 프로그래밍을 통해 이러한 문제를 해결하고, 애플리케이션이 더 반응성이 뛰어나게 만들 수 있습니다.

만약 비동기 프로그래밍의 개념을 이해하지 못한다면, 복잡한 데이터 흐름을 처리할 때 코드가 복잡해지고, 성능이 저하되는 문제를 겪게 될 것입니다. 따라서 비동기 프로그래밍은 모든 개발자가 반드시 익혀야 할 필수 기술입니다.

2. 핵심 개념 설명

비동기 프로그래밍에서는 주로 코루틴(coroutine)과 비동기 함수(async/await) 개념을 사용합니다.

  • 코루틴(coroutine): 경량 스레드와 같은 개념으로, 비동기 작업을 쉽게 처리할 수 있게 해줍니다. 일반적인 스레드보다 훨씬 적은 리소스를 소모하며, 필요할 때만 실행됩니다.
  • 비동기 함수(async/await): 비동기 작업을 수행하면서 호출한 함수가 완료될 때까지 기다리지 않고, 다른 작업을 수행할 수 있게 해 줍니다. 이는 마치 요리사가 요리를 하는 동안 다른 일을 할 수 있는 것과 비슷합니다.
  • 용어설명
    코루틴비동기 처리를 위한 경량 스레드
    비동기 함수작업이 완료될 때까지 기다리지 않고 다른 작업을 수행 가능하게 하는 함수

    3. 기본 코드 예제

    가장 기본적인 코루틴 사용법을 보여주는 코드입니다.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        launch {
            delay(1000L) // 1초 대기
            println("코루틴 실행 완료!") // 1초 후 출력
        }
        println("메인 함수 실행 중...") // 즉시 출력
    }

    실행 결과:

    메인 함수 실행 중...
    코루틴 실행 완료!
  • runBlocking { ... }: 메인 스레드를 블록하여 코루틴이 완료될 때까지 기다립니다.
  • launch { ... }: 새로운 코루틴을 시작합니다.
  • delay(1000L): 1초 동안 대기합니다. 이 동안 메인 스레드는 계속 실행됩니다.
  • println("메인 함수 실행 중..."): 코루틴이 대기하는 동안 이 문장이 즉시 실행됩니다.
  • 1초 후에 "코루틴 실행 완료!"가 출력됩니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰에서 장바구니 업데이트

    쇼핑몰에서 사용자가 상품을 장바구니에 추가할 때, 서버에 요청을 보내는 비동기 작업을 사용할 수 있습니다.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        addToCart("상품 A") // 장바구니에 상품 추가
    }
    
    suspend fun addToCart(product: String) {
        println("장바구니에 $product 추가 중...")
        delay(2000L) // 서버 요청 대기
        println("$product이(가) 장바구니에 추가되었습니다.")
    }

    예제 2: 데이터베이스 쿼리

    데이터베이스에서 정보를 가져오는 비동기 작업을 사용하여 사용자에게 즉각적인 피드백을 제공할 수 있습니다.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        val user = fetchUserData("user123")
        println("사용자 데이터: $user")
    }
    
    suspend fun fetchUserData(userId: String): String {
        println("사용자 데이터 가져오는 중...")
        delay(1500L) // 데이터베이스 쿼리 대기
        return "사용자 $userId"
    }

    5. 흔한 실수와 주의사항

    실수 1: 코루틴을 잘못된 스레드에서 실행

    GlobalScope.launch {
        // UI 업데이트 코드
    }

    올바른 코드:

    launch(Dispatchers.Main) {
        // UI 업데이트 코드
    }

    실수 2: delay를 잘못 사용하기

    fun fetchData() {
        delay(1000L) // suspend 함수가 아닌 곳에서 사용
    }

    올바른 코드:

    suspend fun fetchData() {
        delay(1000L) // suspend 함수 안에서 사용해야 함
    }

    6. 정리

  • 비동기 프로그래밍은 사용자 경험을 향상시키는 필수 기술입니다.
  • 코루틴을 사용하면 경량 스레드처럼 비동기 작업을 쉽게 처리할 수 있습니다.
  • 비동기 함수는 작업이 완료될 때까지 기다리지 않고 다른 작업을 수행할 수 있게 해줍니다.
  • 다음에는 Flow와 같은 비동기 데이터 스트림 처리 방법을 학습하면 좋습니다.