👩💻 오늘의 할 일
책을 얼렁 얼렁 읽고 싶은데 요즘 너무 바쁘네요... 수업 듣고 개인 프젝하고 스터디하고 SOPT 지원서 작성하구... 하루는 왜 24시간이고 내 몸은 하난지 😭 두 번째 쳅터는 코루틴을 연습하기 위한 IDE 환경을 세팅하는 부분과 작업 중인 코루틴이 어떤 스레드에서 실행되는지, 코루틴의 이름을 지정하는 내용입니다. 환경 세팅은 넘어가구 간단하게 나머지 파트를 빠르게 알아본 뒤, 세번째 챕터인 CoroutineDispathcer에 대해 알아보겠습니다. 5장까진 많이 공부했던 내용이라 얼렁 더더더 어려운걸 해보고 싶어요 💪
👨💻 2장 코루틴 개발 환경 설정
2-1. 코루틴 디버깅 환경 설정
앞장에서 살펴본 것 처럼 코루틴은 일시 중단 후 작업을 재개할 때 실행 스레드가 바뀔 수 있습니다. 그래서 특정 코루틴이 어떤 스레드에서 실행되고 있는지 알아야 디버깅이 가능합니다.
그럼 이제 스레드 출력시 실행 중인 코루틴의 이름을 더해봅시다.
1. 툴 바의 Edit Configurations... 버튼을 클릭합니다.
2. Run/Debug Configuration 창의 VM options에 아래 코드를 입력 후 적용합니다.
- VM options : JVM에 옵션을 추가하는데 사용
- -Dkotlinx.coroutines.debug : 스레드 출력 시 코루틴 실행 정보를 추가
3. 실행 결과
🐥 runBlocking
- 하나의 코루틴을 생성합니다.
- runBlocking으로 생성된 코루틴은 실행이 완료되기전 까지 호출한 스레드를 다른 작업이 점유하지 못하게 막는 것으로 말 그대로 run 하는 동안 Blocking 하는 것이죠.
- 비유하자면 달리기 선수가 하나의 레일에서 달릴 때 그 레일에 다른 선수가 달릴 수 없는 것과 비슷하겠죠?
- 이 함수는 안드로이드에서 Main Thread에서 사용할 경우 다른 작업을 할 수 없기 때문에 ANR(application Not Responing)을 일으킬 수 있기 때문에 사용해선 안됩니다.
// runBlocking: 함수를 호출한 스레드를 Block 하는 코루틴을 생성
fun main() = runBlocking{
// 현재 실행 중인 스레드를 출력하는데 사용됩니다.
println("[${Thread.currentThread().name} 실행]")
}
2-2. launch로 코루틴 추가로 실행하기
launch
CoroutineScope 객체의 확장 함수로 정의된 launch 함수를 사용하면 코루틴을 생성할 수 있습니다.
fun main() = runBlocking<Unit>{
println("[${Thread.currentThread().name} 실행]")
// 추가 코루틴 생성
launch {
println("[${Thread.currentThread().name} 실행]")
}
launch {
println("[${Thread.currentThread().name} 실행]")
}
}
실행 결과
이 코드는 runBlcking 함수로 1개, launch 함수로 2개로 총 3개의 코루틴을 생성합니다. 기본적으로 모두 coroutine이라는 이름을 갖고 # 뒤의 숫자만 1씩 증가합니다. 이렇게 되면 어떤 코루틴인지 구분하기 어려워 사용자가 직접 사용자가 직접 이름을 부여할 수 있습니다.
2-3. CoroutineName 사용해 코루틴에 이름 추가하기
CoroutineName
코루틴의 이름을 구분하는 객체로 context 인자로 넘기면 해당 함수로 생성되는 코루틴이 CoroutineName 객체에 설정된 이름을 갖게 됩니다.
fun main() = runBlocking<Unit>{
println("[${Thread.currentThread().name} 실행]")
// 추가 코루틴 생성
// 코루틴 이름 부여
launch(context = CoroutineName("감자 코루틴")) {
println("[${Thread.currentThread().name} 실행]")
}
// 코루틴 이름 부여
launch(context = CoroutineName("고구마 코루틴")) {
println("[${Thread.currentThread().name} 실행]")
}
}
실행 결과
📖 정리
- runBlocking 함수는 코루틴을 실행할 수 있지만 실행하는 동안 호출한 스레드를 Block 시키기 때문에 사용시 주의해야 합니다.
- 현재 실행 중인 스레드의 이름은 Thread.currentThread( ).name 을 통해 가져올 수 있다.
- JVM의 VM options에 -Dkotlinx.coroutines.debug 를 추가하면 스레드의 이름을 출력시 코루틴의 이름을 출력할 수 있다.
- CoroutineName으로 코루틴에 내맘대로 이름을 지정할 수 있다.
📕 후기
이번 장은 비교적 짧게 끝났네요. 코루틴에 이름을 지어줄 수 있다는건 처음 알았는데 내 맘대로 잼있게 이름 지어줄 수 도 있고 참 여러가지 편리하고 재미있는 기능들이 많은 것 같습니다. 프로젝트를 하면서 느낀건데, 비동기 프로그래밍이 참 좋은 기술이긴 한데 문제는 오류가 나면 찾기 힘들단게 정말 큰 단점이었던거 같아요. 근데 이번 기회에 코루틴을 다양하게 디버깅할 수 있다는걸 알아서 다른 좋은 방법이 더 있는지 찾아봐야겠어용 물론 시간이 나면^_^
'KOTLIN > 코루틴의 정석' 카테고리의 다른 글
코틀린 코루틴의 정석, 세 걸음 (0) | 2024.03.22 |
---|---|
코틀린 코루틴의 정석, 첫 걸음 (0) | 2024.03.02 |