* 이 글에서는 retrofit을 coroutine과 함께 활용하기 위해 필요한 내용만을 다룹니다.
coroutine에 대해 공부할 방대한 내용들은 여러 좋은 글들에서 설명되어 있으니 여기서는 최소한만 설명하고 넘어갑니다. *
코루틴이란?
- 요악하면 Thread의 가벼운 버전이라고 할 수 있다. 실제 쓰레드는 아니지만 마치 쓰레드를 사용하는 것 처럼 비동기 프로그래밍을 가능하게 해 준다.
- 왜 코루틴을 쓰는가? :
여러 가지 이유가 있지만 가장 명확한 이유는 비동기 처리를 동기 프로그래밍처럼 쉽게 할 수 있기 때문이라고 생각한다. 쓰레드보다 메모리를 적게 쓰긴 하지만 그래서 효율적이냐? 성능이 좋냐? 하는 문제는 생각해볼 것이 많은 문제기 때문에 일단 미뤄둔다. (무조건 코루틴이 쓰레드보다 좋다! 라고는 말할 수 없다는 것이다)
- 코루틴에 대해 이해하기 좋은 글 :
(이 글에서 사용된) 코루틴 용어
-
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/
코루틴을 사용하는 데에는 여러가지 방법이 있지만 위에서 잘 설명한 대로 액티비티의 생명 주기를 따르는 스코프를 만들어 사용할 것이다.
(참고로 BaseActivity를 만들어 아래 방법대로 해두고 BaseActivity를 상속받아 사용하면 편리하다)
class MainActivity : AppCompatActivity(), CoroutineScope { // 1
private lateinit var job: Job // 2
override val coroutineContext: CoroutineContext // 3
get() = Dispatchers.Main + job
}
-
CoroutineScope 인터페이스를 상속받고
-
Job 객체를 선언 ( Job 객체는 코루틴 동작을 제어하기 위한 객체로, 궁금하면 나중에 잘 정리된 글에서 찾아보기 바람)
-
CoroutineContext 변수를 오버라이드 한 후 "Dispatchers.Main"에 위에서 생성한 Job을 더함 (Dispatcher는 코루틴이 어떤 쓰레드에서 동작할 지 지정하는 역할)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job() // 1
....
}
override fun onDestroy() {
super.onDestroy()
job.cancel() // 2
}
-
Job 객체를 생성
-
Activity가 종료(destroy)될 때 수행 중인 코루틴이 있다면 모두 취소
3. 코루틴 실행
* CoroutineScope를 구현한 Activity에서 코루틴을 실행할 때 다음처럼 launch {} 키워드만 입력해서 코루틴을 실행할 수 있다.
launch {
Retrofit.getApiService().fetchSomeData()
....
}
다음 글에서 Retrofit을 이어서 설명할 예정이지만 미리 얘기하자면 저 launch{ } 안에 레트로핏으로 서버와 통신하는 코드를 넣으면 된다.
Retofit을 이용하는 데에 필요한 코루틴 관련 내용은 여기서 끝이다. 하지만 코루틴에 대해서는 공부할 것이 많으므로, 널려있는 수많은 훌륭한 자료들을 보면서 공부해 봐도 좋을듯!
- 이어지는 글
2020/06/13 - [분류 전체보기] - Coroutine과 Retrofit 함께 활용하기 -2) 레트로핏 편
'공부 > Android' 카테고리의 다른 글
[Android] AAC - LiveData (0) | 2021.03.12 |
---|---|
Realm vs Room (0) | 2021.02.28 |
[Android] AAC - Room (0) | 2021.02.02 |
Coroutine과 Retrofit 함께 활용하기 -2) 레트로핏 편 (2) | 2020.06.13 |
안드로이드 스튜디오에서 레이아웃 프리뷰가 보이지 않을 때 (0) | 2018.07.02 |