Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20241002 Coroutines② 본문

Kotlin

[TIL]20241002 Coroutines②

최밤빵 2024. 10. 2. 18:02

코루틴의 핵심은 비동기성이다. 비동기 프로그래밍을 통해 여러 작업을 병렬적으로 처리할 수 있는데, 코루틴을 사용하면 복잡한 비동기 처리를 간결하게 구현할 수 있다. 코루틴은 작업이 완료될 때까지 기다리지 않고 다음 작업을 수행할 수 있는 비동기 실행 구조를 제공한다. 비동기성은 주로 I/O 바운드 작업(파일 읽기/쓰기, 네트워크 요청 등)에서 활용된다. 예를 들어, 데이터베이스에서 데이터를 조회하는 작업을 실행할 때, 일반적인 동기 방식에서는 데이터를 모두 조회할 때까지 기다린 후 다음 작업으로 넘어가야 한다. 반면, 코루틴의 비동기성 덕분에 다른 작업을 수행하면서도 데이터 조회가 끝나는 시점에 결과를 받아와 활용할 수 있다.

 

▶ 코루틴의 비동기성 작동 방식

→ 중단과 재개:

코루틴의 suspend 함수는 실행을 중단했다가 나중에 다시 재개할 수 있다. 이로 인해 특정 작업을 수행하는 동안 다른 작업이 중단 없이 이어서 실행된다.

→ 경량성:

코루틴은 운영체제의 스레드를 직접 사용하는 것이 아닌, 더 작은 단위로 작업을 나누어 실행한다. 덕분에 자바의 스레드 기반 비동기 처리보다 적은 리소스를 사용하며, 동시에 많은 비동기 작업을 효율적으로 처리할 수 있다.

→ 코드의 순차적 작성:

비동기 작업을 작성할 때 코드가 순차적으로 작성된 것처럼 보이지만, 실제로는 필요한 시점에만 실행을 재개하기 때문에 개발자가 복잡한 흐름을 관리할 필요가 없다.

 

▷ 예제: 네트워크 요청 시 코루틴의 비동기성

import kotlinx.coroutines.*

suspend fun fetchData(): String {
    delay(2000L) // 네트워크 지연을 시뮬레이션
    return "Data from server"
}

fun main() = runBlocking {
    println("Start fetching")
    val data = async { fetchData() } // 비동기로 데이터 가져오기 시작
    println("Doing other work...")
    println("Fetched data: ${data.await()}") // 데이터 가져오기 완료 후 출력
    println("End")
}

→ fetchData() 함수가 2초 동안 중단되지만(delay(2000L)), 그동안 main 함수는 println("Doing other work...")를 통해 다른 작업을 수행한다. async는 비동기적으로 fetchData를 호출하고, await를 통해 데이터를 기다렸다가 받아온다.

코루틴의 비동기성 덕분에 fetchData() 함수가 지연되는 동안 다른 작업을 수행할 수 있고, await()를 통해 결과를 받아오기 때문에 코드가 동기적으로 순차 실행되는 것처럼 보인다.

 

▶ 코루틴의 비동기성 활용의 장점

→ 응답성 향상:

I/O 바운드 작업의 경우, 작업 완료를 기다리지 않고 다른 작업을 수행할 수 있으므로 애플리케이션의 응답성이 높아진다.

→ 가독성 향상:

콜백을 이용한 비동기 처리와 달리, 코루틴은 코드가 순차적으로 작성되어 비동기 흐름을 쉽게 이해할 수 있다.

→ 효율적인 자원 활용:

코루틴은 스레드를 효율적으로 사용하여 시스템 자원을 절약하고, 많은 비동기 작업을 동시에 처리할 수 있다.

 

코루틴의 비동기성은 네트워크 요청, 데이터베이스 조회 등 비동기적으로 처리해야 하는 작업을 간편하게 처리할 수 있게 한다. 비동기성이 필요한 상황에서 코루틴을 사용하면 코드가 단순해지고, 자원을 효율적으로 사용할 수 있어 시스템의 성능과 반응 속도가 향상된다.