Coroutine

    [Kotlin] 스레드와 코루틴

    스레드와 코루틴은 동시성을 보장하고, 비동기 작업을 하기 위해 많이 사용된다는 공통점이 있다. 동시성은 말그대로 여러가지 작업을 한번에 수행하는 것이지만, 실제 동작은 시분할 기법을 활용하여 여러 작업들을 조금씩 나누어 번갈아가며 실행기때문에 사용자입장에서는 여러 작업이 동시에 일어나는것처럼 느껴지게 된다. 비동기 작업은 특정 작업을 수행할 때 작업이 끝날 때까지 기다리지 않고 다른 작업을 수행할 수 있는 특징이 있다. 그런데, 스레드와 코틀린은 근본적으로 큰 차이점이 존재한다. 스레드는 각 Task에 해당하는 Stack메모리를 할당받고 동시에 여러 작업을 수행할때 OS는 어떤 스레드 작업을 먼저 수행해야 효율적인지에 대한 스케쥴링(선점 스케쥴링)을 한다. Task 단위는 Thread이며 JVM의 Sta..

    [Kotlin] CoroutineBuilder

    코루틴은 일시 중단이 가능한 작업 객체로 동시성을 지원하는 관점에선 스레드와 유사한점이 많다. 하지만 코루틴은 분명 스레드에서 동작하지만 그 어떤 스레드에 종속되진 않는다. 하나의 코루틴 작업을 스레드 이곳저곳을 돌아다니며 실행시킬 수 있기 때문이다. 이러한 코루틴을 만드는 방법은 CoroutineBuilder를 활용하는 것이다. CoroutineBuilder는 말그대로 코루틴을 만드는 코루틴 객체 생성자이다. CoroutineBuilder는 launch, async 이렇게 두 개로 볼 수 있다. launch, async를 알아보기에 앞서 Dispatchers에 대해 잠깐 알고 넘어가자. Dispatchers는 코루틴의 실행을 관리해주는 CoroutineContext로 스레드에 코루틴의 실행을 분배하거나..

    [Kotlin] 코틀린에서 RxJava와 Coroutine

    위 두 라이브러리는 비동기 작업을 구현하는 방법으로 여기저기서 많이들 사용한다. 코틀린의 경우 RxJava와 Coroutine 모두 사용 가능하고, 두 방식을 혼합하여 사용할 수도 있다. 먼저 간단하게 두 방식 사용 방식 차이점에 대해 알아보자. RxJava RxJava는 Observable Pattern, Iterator Pattern, Functional Programming을 결합한 형태로 데이터를 관찰 가능한 stream 형태로 받을 수 있다. 그렇기 때문에 중간중간마다 데이터의 변화를 확인할 수 있다. RxJava를 사용하기 위해서는 반환값으로 Single 클래스를 사용해야 한다. interface UserService{ @GET("/users) fun getUser(): Single @GET(..

    [Kotlin] Coroutine 동기화 처리

    멀티 스레드 처리는 애플리케이션의 퍼포먼스에 큰 이점을 주지만 경쟁 상태(race condition)를 적절히 조절해 주지 않는다면 데이터의 손실을 야기할 수 있다. - 경쟁 상태란 여러 개의 스레드가 하나의 공유/변경 가능한 자원에 접근하는 것을 말한다. 자세히 보기 데이터 손실을 막기 위해서는 동기화(synchronization)를 통해 race condition을 제어하여 올바른 멀티 스레드 환경을 구축해야 한다. 그러기 위한 여러 방법 중 하나로 Mutex를 고를 수 있다. Mutex Mutex는 공유자원에 변경이 일어나는 순간 적절한 block을 통해 race condition을 제어하는 동기화 제어 기법이다. 코드가 임계 구역에 있는 경우 절대로 동시성이 발생하지 않게 하고 오직 하나의 루틴만..