요즘IT
위시켓
최근 검색어
전체 삭제
최근 검색어가 없습니다.

코루틴(Coroutine)은 일종의 가벼운 스레드(Light-weight thread)로 동시성(Concurrency) 작업을 간편하게 처리할 수 있게 해주는 역할을 합니다. 안드로이드 개발에서는 코틀린 코루틴(Kotlin Coroutine)을 통해 UI 스레드가 중단되는 문제를 효율적으로 처리할 수 있는데요. 이번 글에서는 코루틴에 대한 기본 개념을 알아보고, 안드로이드에서의 코틀린 코루틴 사용 방법과 안티 패턴(Anti-Pattern)을 정리해보았습니다.

회원가입을 하면 원하는 문장을
저장할 수 있어요!

다음

회원가입을 하면
성장에 도움이 되는 콘텐츠를
스크랩할 수 있어요!

확인

개발

안드로이드 코루틴의 개념과 사용법

년차,
어떤 스킬
,
어떤 직무
독자들이 봤을까요?
어떤 독자들이 봤는지 궁금하다면?
로그인

 

코루틴(Coroutine)은 일종의 가벼운 스레드(Light-weight thread)로 동시성(Concurrency) 작업을 간편하게 처리할 수 있게 해주는 역할을 합니다. 안드로이드 개발에서는 코틀린 코루틴(Kotlin Coroutine)을 통해 UI 스레드가 중단되는 문제를 효율적으로 처리할 수 있는데요. 이번 글에서는 코루틴에 대한 기본 개념을 알아보고, 안드로이드에서의 코틀린 코루틴 사용 방법과 안티 패턴(Anti-Pattern)을 정리해보았습니다.

 
코틀린 코루틴(Kotlin Coroutine)
<출처: techyourchance>

 

코루틴이란?

1) 코루틴의 정의

안드로이드에서의 코틀린 코루틴을 살펴보기 전, 먼저 코루틴의 개념을 알아보겠습니다. 코루틴(Coroutine)은 together를 뜻하는 co와 작업들의 집합을 뜻하는 Routine이 합쳐져 만들어진 단어로, 한국어로는 ‘협동 루틴’으로 표현하기도 합니다. 코루틴에 대한 개념은 1958년 도널드 커누스가 자신의 어셈블리 프로그램에 적용하면서 시작되었습니다.

 

2) 코루틴의 특징

일반적으로 루틴은 단 하나의 입구점과 출구점을 가질 수 있는 반면, 코루틴은 여러 개의 입구점과 출구점을 가질 수 있습니다. 이런 특징으로 코루틴은 이전에 실행이 중단된 지점에서 다시 실행을 재개할 수 있는 기능을 가지게 되는데요. 이런 기능을 통해 비동기 작업 및 이벤트 루프 등 다양한 프로그래밍 요소에 적용되고 있습니다.

 

3) 안드로이드와 코틀린 코루틴

구글에서는 안드로이드 개발 시 코틀린 코루틴(Kotlin Coroutine) 적용을 권장하고 있습니다. 코틀린 코루틴을 적용하면 장시간 작업(Long-running tasks)으로 인한 메인 스레드(Main Thread) 블로킹 현상 줄일 수 있으며, 비동기 작업 중 예외 발생에 따른 메모리 누수를 방지할 수 있기 때문입니다.

 

 

안드로이드 코틀린 코루틴은?

1) 코틀린 코루틴 소개

이번에는 안드로이드 공식 언어인 코틀린을 기준으로 코루틴의 기본 개념을 살펴보겠습니다. 코틀린 코루틴은 2016년 4월에 발표되었으며, 앞서 얘기했듯이 구글에서 안드로이드 개발 시 공식 권장 사항으로 쓰이고 있습니다. 또한 라이프사이클(Lifecycle), 워크매니져(WorkManager), 룸(Room) 등 안드로이드 Jetpack 라이브러리에서도 기본적으로 코틀린 코루틴을 지원하고 있습니다.

 

2) 코틀린 코루틴의 개념

먼저 코틀린 코루틴의 동작 원리를 이해하려면 코루틴 스코프(Coroutine Scope), 코루틴 컨텍스트(CoroutineContext), 코루틴 빌더(Coroutine Builders)와 같은 기본 개념을 이해해야 합니다.  첫 번째로 코루틴 스코프란 코루틴이 실행되는 영역을 의미합니다. 코루틴 스코프에는 MainScope, GlobalScope 또는 별도로 지정한 Coroutine Scope 등이 있습니다.

 

두 번째로 코루틴 컨텍스트는 key와 element를 갖는 map을 의미하는데요. element에는 코루틴 컨텍스트의 서브타입으로 Job, Deferred, dispatcher 등이 들어갑니다. 코루틴 컨텍스트를 이용하면 코루틴 취소(cancellation)와 같은 작업을 간단히 처리할 수 있습니다. 마지막으로 코루틴 빌더는 코루틴을 생성하는 메소드(method)를 의미합니다. 종류로는 launch, async, withContext, runBlocking 등이 있습니다.

 

3) Suspend 키워드

코틀린 코루틴에서는 데이터베이스 또는 네트워크 작업 같은 Lon-running tasks에 대해 간편한 코드를 작성할 수 있게 해줍니다. 특히 비동기 콜백(async callbacks) 작업을 순차적 코드(sequential code)로 간단하게 작성할 수 있다는 장점이 있는데요. suspend 키워드를 함수 앞에 기재하여 코루틴이 적용되었다는 것을 나타냅니다.

 

코틀린 코루틴 (Kotlin Coroutine)
<출처: Google I/O 자료>

 

위와 같이 네트워크를 통해 사용자 데이터(User Data)를 가져온 후, UI에 적용하는 코드를 생각해보겠습니다. 코틀린 코루틴 이전에는 스레드나 콜백 함수를 이용하여 처리했습니다. 하지만 이런 방법은 복잡도가 높아질수록 예외 처리 및 콜백 지옥(callback hell)과 같은 문제에 봉착하게 됩니다. 반면, 코틀린 코루틴에서는 함수 앞에 suspend 키워드를 붙이고, 비동기 작업을 마치 순차 코드(sequential code)를 작성하듯이 짤 수 있습니다.

 

 

안드로이드 코틀린 코루틴 사용 방법

1) 그래들(Gradle) 설정

코틀린 코루틴 (Kotlin Coroutine)
<출처: 작가>

 

안드로이드 개발에서 코틀린 코루틴을 사용하려면 먼저 Gradle을 확인해야 합니다. build.gradle 파일 중 dependencies 부분에 다음과 같이 코틀린 코루틴 라이브러리가 추가되었는지 확인하고, Sync now 버튼을 눌러줍니다. 

 

2) 코루틴 빌더 사용

앞서 기본 개념에서 살펴본 바와 같이 코루틴 빌더는 코루틴을 생성하는 메소드를 말합니다. 주로 launch, async를 사용하는데요. 아래와 같이 코드를 작성하여 코루틴을 실행합니다.

 

코틀린 코루틴 (Kotlin Coroutine)
<출처: devcompass.co.kr>

 

위 코드는 launch 메소드로 Main 스레드에 코루틴을 생성한 예제입니다. 이 중에서 data1과 data2는 async 메소드를 통해 각각 Default 및 IO 스레드에 코루틴을 생성했는데요. 각각의 코루틴 작업이 완료되는 것을 기다렸다가 await()에서 최종적으로 처리하게 됩니다.

 

안드로이드 코틀린 코루틴의 안티 패턴

1) Async-style Functions

Async-style Functions란 Async 메소드를 정의한 코드를 일반 함수로 만들어 재사용하는 것을 말합니다. 아래 예제처럼 일반 함수인 somethingUsefulOneAsync()와 somethingUsefulTwoAsync()에 async 메소드를 정의하고, 이를 또 다른 일반 함수인 Main()에서 사용한 것과 같은 형태를 말합니다.

 

코틀린 코루틴 (Kotlin Coroutine)
코틀린 코루틴 (Kotlin Coroutine)
<출처: kotlinlang.org>

 

이런 방식으로 코드를 짜면 예외(Exception)가 발생하더라도 기존에 실행된 async 함수는 자동으로 취소되지 않습니다. 이렇게 되면 예외 상황에도 비동기 작업이 취소되지 않아, 메모리 누수(Memory Leaks)와 같은 문제를 야기하게 됩니다.

 

2. Structured Concurrency

Async-style Functions가 가지고 있는 문제를 해결하기 위해서 Structured Concurrency 처리를 권장합니다. Structured Concurrency는 아래 예제 코드와 같이 특정 스코프 내에 suspend 함수를 조립해서 사용하는 것을 말합니다.

 

코틀린 코루틴 (Kotlin Coroutine)
<출처: kotlinlang.org>

 

위와 같이 Structured Concurrency로 코루틴을 구현하면 예외 발생 시, 스코프 내의 모든 코루틴에 자동으로 예외를 전파할 수 있습니다. 이에 따라 예외 발생 시 자동으로 스코프 내의 모든 코루틴이 취소되게 되며, 메모리 누수가 발생하지 않게 됩니다. 따라서 비동기 처리를 할 때는 일정 스코프 안에서 suspend 함수들을 조립해서 쓰는 structured concurrency 방식을 사용할 것을 권장합니다.

 

 

장점을 충분히 활용하기

지금까지 코루틴의 기본 개념과 안드로이드에서의 코틀린 코루틴 사용법, 코루틴 안티 패턴에 대해서도 함께 살펴봤습니다. 코틀린 코루틴은 안드로이드 작업 시 각종 비동기 처리를 편리하게 해주는 가벼운 스레드입니다. 다만 Async-style functions 같은 안티 패턴으로 코딩을 하면, 코루틴의 장점을 충분히 활용하지 못하기 때문에 Structured Concurrency에 대해 이해하고 사용해야 합니다. 이외 안드로이드 코틀린 코루틴에 대한 자세한 내용은 코틀린 코루틴 공식 가이드 문서를 참고해 보시길 바랍니다.

 

요즘IT의 모든 콘텐츠는 저작권법의 보호를 받는 바, 무단 전재와 복사, 배포 등을 금합니다.

좋아요

댓글

공유

공유

댓글 0
Developer, Blogger
207
명 알림 받는 중

작가 홈

Developer, Blogger
207
명 알림 받는 중
곰씨네 IT를 비롯하여 다양한 블로그를 운영 중인 개발자입니다. 2010년부터 LG CNS에서 소프트웨어 엔지니어로 근무하며, LG전자 물류 시스템 구축, 스마트 TV OS 개발, LG화학 모바일 프로젝트 등에 참여했습니다. 2017년 미국으로 이주해 프리랜서 개발자로 전향했으며, 현재는 AI와 머신러닝 분야로의 경력 확장을 위해 미국 매사추세츠 주립대에서 컴퓨터 공학 석사 과정을 병행하고 있습니다.

운영 중인 블로그
곰씨네 IT: https://gomcine.tistory.com
곰씨네USA: https://gomcineusa.tistory.com
코리얼티USA: https://korealtyusa.com

저서
개발자가 영어도 잘해야 하나요? (English for Developer)
http://gilbut.co/c/24026188iO

좋아요

댓글

스크랩

공유

공유

지금 회원가입하고,
요즘IT가 PICK한 뉴스레터를 받아보세요!

회원가입하기
요즘IT의 멤버가 되어주세요! 요즘IT의 멤버가 되어주세요!
요즘IT의 멤버가 되어주세요!
모든 콘텐츠를 편하게 보고 스크랩해요.
모든 콘텐츠를 편하게 보고 스크랩 하기
매주 PICK한 콘텐츠를 뉴스레터로 받아요.
매주 PICK한 콘텐츠를 뉴스레터로 받기
로그인하고 무료로 사용하기