[Kotlin Coroutines] 1장. 코틀린 코루틴을 배워야 하는 이유
|
개요
- 코틀린 코루틴은 기존의 방식 보다 훨씬 많은 것을 제공
- 코루틴은 1963년에 처음 제시
- 하지만 실제 현업에서 사용될 수 있도록 구현되기까지 수십 년이 걸림
- 코틀린 코루틴은 초보 개발자들이 사용하는 데도 무리가 없음
안드로이드 (그리고 다른 프론트엔드 플랫폼) 에서의 코루틴 사용
스레드 전환
- 블로킹이 가능한 스레드를 먼저 사용하고, 이후에 메인 스레드로 전환
- 문제점
- 스레드가 실행되었을 때 멈출 수 있는 방법이 없어 메모리 누수로 이어질 수 있다.
- 스레드를 많이 생성하면 비용이 많이 든다.
- 스레드를 자주 전환하면 복잡도를 증가시키며 관리하기도 어렵다.
- 코드가 쓸데없이 길어지고 이해하기 어려워진다.
콜백
- 콜백의 기본 방법
- 함수를 논 블로킹으로 만든다.
- 함수의 작업이 끝났을 때 호출될 콜백 함수를 넘겨준다.
- 중간에 작업을 취소할 수 없다.
- 취소할 수 있는 콜백 함수를 만들 수도 있지만, 쉬운 일은 아니다.
- 흔히 말하는 콜백 지옥이 발생할 수 있다.
RxJava 와 리액티브 스트림
- 데이터 스트림 내에서 일어나는 모든 연산을 시작, 처리, 관찰할 수 있다.
- 리액티브 스트림은 스레드 전환과 동시성 처리를 지원
- 애플리케이션 내의 연산을 병렬 처리하는 데 사용
- RxJava 를 사용한 방법이 콜백을 사용한 것보다 훨씬 더 좋은 방법
- 적절한 구현 방법이다. 하지만 구현하기에 아주 복잡하다는 단점
코틀린 코루틴의 사용
- 코틀린 코루틴이 도입한 핵심 기능
- 코루틴을 특정 지점에서 멈추고 이후에 재개할 수 있다는 것
- 코루틴을 사용하면 우리가 짠 코드를 메인 스레드에서 실행하고 API 에서 데이터를 얻어올 때 잠깐 중단시킬 수 도 있다.
- 코루틴을 중단시켰을 때
- 스레드는 블로킹되지 않음
- 뷰를 바꾸거나 다른 코루틴을 실행하는 등의 또 다른 작업이 가능
- 데이터가 준비되면 코루틴은 메인 스레드에서 대기하고 있다가 메인 스레드가 준비되면 멈춘 지점에서 다시 작업을 수행
- 코루틴이 대기하는 건 스레드를 기다리고 있는 코루틴이 쌓여있는 경우와 같이 극히 드문 상황에서 발생
- 코드도 간단하고 읽기 쉬우며, 다양한 상황에서 쉽게 적용 가능
백엔드에서의 코루틴 사용
- 백엔드에서 코루틴을 사용하는 가장 큰 장점은 간결성
- 스레드를 코루틴으로 바꾸는 대부분의 환경에서는 단지 suspend 제어자 (modifier) 를 추가하는 것으로 충분
- 코루틴을 도입하면 동시성을 쉽게 구현 가능, 동시성을 테스트 가능, 코루틴을 취소할 수도 있고, 다양한 기능을 사용할 수 있음
- 위와 같은 특징들을 제외하면 코루틴을 사용하는 가장 중요한 이유는 스레드를 사용하는 비용이 크기 때문
- 스레드는
- 명시적으로 생성해야 하고,
- 유지되어야 하며,
- 스레드를 위한 메모리 또한 할당되어야 함
- 아래 첫 번째 코드는 10만개의 스레드를 만들고 1초 동안 잠을 자게 만듦
- 하지만 코루틴으로 실행하면 저렴한 비용으로 완료가 됨
요약
- 코틀린 코루틴을 배울 필요가 있다는 확신이 생김 👍