ENAN

Developer, Artist, Traveler

공부/Android

Coroutine과 Retrofit 함께 활용하기 -1) 코루틴 편

ENAN 2020. 6. 3. 01:56

* 이 글에서는 retrofit을 coroutine과 함께 활용하기 위해 필요한 내용만을 다룹니다.

coroutine에 대해 공부할 방대한 내용들은 여러 좋은 글들에서 설명되어 있으니 여기서는 최소한만 설명하고 넘어갑니다. *

 

코루틴이란?

- 요악하면 Thread의 가벼운 버전이라고 할 수 있다. 실제 쓰레드는 아니지만 마치 쓰레드를 사용하는 것 처럼 비동기 프로그래밍을 가능하게 해 준다.

- 왜 코루틴을 쓰는가? :

여러 가지 이유가 있지만 가장 명확한 이유는 비동기 처리를 동기 프로그래밍처럼 쉽게 할 수 있기 때문이라고 생각한다. 쓰레드보다 메모리를 적게 쓰긴 하지만 그래서 효율적이냐? 성능이 좋냐? 하는 문제는 생각해볼 것이 많은 문제기 때문에 일단 미뤄둔다. (무조건 코루틴이 쓰레드보다 좋다! 라고는 말할 수 없다는 것이다)

- 코루틴에 대해 이해하기 좋은 글 :

https://wooooooak.github.io/kotlin/2019/08/25/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%BD%94%EB%A3%A8%ED%8B%B4-%EA%B0%9C%EB%85%90-%EC%9D%B5%ED%9E%88%EA%B8%B0/

 

코틀린 코루틴(coroutine) 개념 익히기 · 쾌락코딩

코틀린 코루틴(coroutine) 개념 익히기 25 Aug 2019 | coroutine study 앞서 코루틴을 이해하기 위한 두 번의 발악이 있었지만, 이번에는 더 원론적인 코루틴에 대해서 알아보려 한다. 코루틴의 개념이 정확

wooooooak.github.io

(이 글에서 사용된) 코루틴 용어

  • Scope : 코루틴이 실행되는 범위로, 예를 들어 코루틴 튜토리얼 글에서 많이 볼 수 있는 Globalscope는 앱 전체의 생명 주기를 따른다. 즉, 앱이 실행중이라면 코루틴이 계속 실행될 수 있다. 만약 Activity와 라이프사이클을 같이 하는 scope를 만든다면 activity가 종료되기 전까지만 실행되고, 액티비티가 종료되면 해당 스코프를 사용한 코루틴도 같이 종료된다.

  • Launch : 비동기적으로 실행될 코드 블럭을 받아서 코루틴을 실행시키는 함수

  • Suspend function : 코루틴 블럭을 임시로 빠져나가는 함수. 코루틴 블럭 안에서만 호출할 수 있으며, 이 함수를 만나면 코루틴 블럭을 잠시 빠져나가고, 이 함수는 그대로 비동기적으로 수행된다. 그 후, 해당 함수의 작업이 완료되면 다시 코루틴 블럭으로 돌아와서 해당 함수의 다음부터 이어서 실행된다. 해당 함수의 작업이 완료되기 전까지는 코루틴 블럭 안에서 다음으로 넘어가지 않는다.

코루틴 사용 

1. 의존성 추가

dependencies {

 ...

 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3'

 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3'

}

2. 코루틴 스코프 설정 (액티비티 기준)

참고: https://codechacha.com/ko/android-coroutine/

 

안드로이드 - Kotlin Coroutine을 사용하는 방법 및 예제

Kotlin Coroutine은 가벼운 쓰레드(Light-weight thread)입니다. 비동기적인(asynchronous) 프로그래밍이 가능하게 만들어 줍니다. async, launch, coroutine context 등의 코루틴 키워드를 설명하고 어떻게 코루틴을 작

codechacha.com

코루틴을 사용하는 데에는 여러가지 방법이 있지만 위에서 잘 설명한 대로 액티비티의 생명 주기를 따르는 스코프를 만들어 사용할 것이다.

(참고로 BaseActivity를 만들어 아래 방법대로 해두고 BaseActivity를 상속받아 사용하면 편리하다)

class MainActivity : AppCompatActivity(), CoroutineScope { // 1

private lateinit var job: Job     // 2

override val coroutineContext: CoroutineContext   // 3

    get() = Dispatchers.Main + job

}
  1. CoroutineScope 인터페이스를 상속받고

  2. Job 객체를 선언 ( Job 객체는 코루틴 동작을 제어하기 위한 객체로, 궁금하면 나중에 잘 정리된 글에서 찾아보기 바람)

  3. CoroutineContext 변수를 오버라이드 한 후 "Dispatchers.Main"에 위에서 생성한 Job을 더함 (Dispatcher는 코루틴이 어떤 쓰레드에서 동작할 지 지정하는 역할)

override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)

    job = Job() // 1

    ....

}

override fun onDestroy() {

    super.onDestroy()

    job.cancel() // 2

}
  1. Job 객체를 생성

  2. Activity가 종료(destroy)될 때 수행 중인 코루틴이 있다면 모두 취소

3. 코루틴 실행

* CoroutineScope를 구현한 Activity에서 코루틴을 실행할 때 다음처럼 launch {} 키워드만 입력해서 코루틴을 실행할 수 있다.

launch {

    Retrofit.getApiService().fetchSomeData()

    ....

}

다음 글에서 Retrofit을 이어서 설명할 예정이지만 미리 얘기하자면 저 launch{ } 안에 레트로핏으로 서버와 통신하는 코드를 넣으면 된다.

 

Retofit을 이용하는 데에 필요한 코루틴 관련 내용은 여기서 끝이다. 하지만 코루틴에 대해서는 공부할 것이 많으므로, 널려있는 수많은 훌륭한 자료들을 보면서 공부해 봐도 좋을듯!

- 이어지는 글

2020/06/13 - [분류 전체보기] - Coroutine과 Retrofit 함께 활용하기 -2) 레트로핏 편

 

Coroutine과 Retrofit 함께 활용하기 -2) 레트로핏 편

* 이 글에서는 coroutine과 함께 retrofit을 활용하기 위해 필요한 내용만을 다룹니다. retrofit에 대해 공부할 방대한 내용들은 여러 좋은 글들에서 설명되어 있으니 여기서는 최소한만 설명하고 넘어�

enant.tistory.com