[kotlin] 간단하게 이해해보는 코루틴

Boknami·2023년 9월 22일
0

코틀린

목록 보기
14/19

🤔 [What]그게 뭔데?

코루틴이라고 하면 사실 잘 안 와닿는 느낌이다..
영어로 풀면! Coroutine이고
Co + routine이다!

Coworker는 동료라는 뜻이다. Co라는 접미사는 함께라는 의미를 내포하고 있기 때문이다!
그렇기에 Coroutine은 함께 + 루틴(규칙적인 일) = 함께 동작하면서 규칙적이다!라는 의미일 것이다. 좀 애매하긴한데 두 키워드를 기억하면 되겠다.

그리고 코루틴은 코틀린만의 것이 아닌 스프링 같은 곳에서도 사용되고 이 외 다양한 곳에서도 사용된다!


🤷‍♂️ [Why]왜 사용?

코루틴은 비동기 처리를 위해서 사용한다.
그렇다면 비동기 처리가 뭘까?

동기 처리

Go class {
	wakeUp();
    takeShower();
    tryingCloths();
    Walk();
}

예시로 학교를 가는 로직을 만들었을 때 이 순서는 적은 순서대로 위에서 아래로 순차적으로 진행해야한다! 일어나지도 않았는데 걷거나 씻을 수는 없으니 말이다!
이러한 방식이 동기이다. 위에서부터 적은 코드가 순차적으로 내려오며 실행되게된다!

비동기 처리

그렇다면 비동기는 반대로 순차적이지 않아도 되는 경우에 사용된다! 동시에 여러 가지를 처리할 수 있다고 보면 된다!

아무튼 이런 비동기를 사용하기 위해서인데..왜 코틀린에서 비동기를? 사용해야할까?


🤷‍ [when]언제 사용하는데?

코틀린을 이용하여 백엔드와 통신을 할 때 붉은색 오류가 나면서 메인 스레드에서 해당 동작을 하지마! 라는 글을 본 적이 있다! 그 때 처음으로 코루틴을 사용하게 되었는데 아무튼!
네트워크 동작을 하는 것을 예로 들자면

네트워크 동작은 서버와 통신하고 또 서버가 DB에 데이터를 확인하거나 가져오는 과정이 있을 것이다. 작업 자체가 엄청나게 방대한 서버거나 최적화가 잘 안되있는..나쁜 구조나 로직이라면 더 더욱 오래 작업이 지체될 것이다!


우리가 만약 액티비티에 UI그림 그리고..네트워크 작업 요청하고..DB작업하고..이러면 당연히 오래 걸릴 수 밖에 없다! 이 때 사용자 입장에서는 마냥 로딩화면에서 오래 기다리고 답답해한다..정확히 어디서 본 지는 모르겠는데 사용자가 답답함을 느끼는 시간은 2초 이상?이라는 것을 봤다!

🔍 코루틴에서의 작업(스레드)

위 내용대로라면 액티비티에 그냥 다 때려 박는 코드는 애초에 돌아가지도 않을 뿐더라 효율적이지도 않다. 이를 해결하기 위해서는 코루틴에서의 작업이 어떻게 이루어지는 지 알아야한다!
(누군가 보시는 분이 계시다면 허접한 그림..죄송합니다)

코루틴에서는 3가지의 스레드가 존재하고 맡는 일은 다음과 같다!
디폴트는 따로 적은 게 없는데 주로 정렬?같은 무거운 작업을 주로 한다고 한다!
아무튼 스레드가 이렇게 정해져있으니 우린 이를 따라서 작업을 해줘야한다!

🚨 네트워크말고도!

이 외에도 비동기 속 동기 작업을 코루틴에서는 쉽게 실행할 수 있다!!
예를 들어서

ChangeDB(){
	basicDB = getDB()
    changeDB = getDB() + 새로운 내용
   	postDB(changeDB)
}

이런 식으로 내부 DB값을 가져와서 새 내용을 추가하고 다시 넣어주는 경우를 생각할 때 비동기는 순서를 지키지 않는다고 했으니 코드를 작성한 순서대로 DB를 가져오고 그 값에 새로운 내용을 추가하지 않을 것이고 그렇게 되면 당연히 에러가 발생한다! 일단 DB를 가져오는 게 먼저 되어야지만 거기에 새로운 내용을 추가할 changeDB가 에러없이 잘 될테니까!


💡 [How]어떻게 사용하는데?

implement

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

코드

 val coroutineScope = CoroutineScope(Dispatchers.IO)
        coroutineScope.launch {
            try {
                //네트워크 작업 및 에러 처리!
            coroutineScope.cancel() // 작업이 완료되면 코루틴 스코프를 취소합니다.
        }
    }

급격히 짧아지는데..자세한 예시를 사용하려니 retrofit과 닿아있어서 retrofit과 같이 설명하려한다!

retrofit 포스팅 :

0개의 댓글