출처: 조세영님의 인프런 강의, 코틀린 코루틴 강의 완전 정복
runBlocking 사용해서 코루틴 만들기
- runBlocking 함수는 이 함수를 호출한 스레드를 사용해 실행되는 코루틴을 만들어낸다.
- runBlocking 코루틴이 종료될 때 스레드 점유가 해제된다.
run(실행) + Bloking(차단)
하지만 여기에서 쓰인 Blocking의 의미는 스레드 블로킹이 일어나서 스레드가 사용되지 못하는 상태를 칭하는 것이 아니다. 블로킹(차단)을 통해 다른 작업을 가능하게 해준다는 의미로 쓰인 것이다.
runBlocking을 사용하여 코루틴을 생성한 후 launch를 사용해 또 다른 코루틴을 생성할 수 있다. lauch를 통해 생성하는 이유는, 동기적인 코드와 코루틴(코루틴은 기본적으로 비동기적)을 함께 사용할 때 제어 흐름을 관리하기 위함이다.
1. runBlocking
- runBlocking은 현재 스레드를 차단하면서 코루틴을 실행한다.
- 이를 통해 코루틴이 완료될 때까지 메인 함수나 다른 동기적인 코드가 기다리도록 만든다.
- 주로 메인 함수나 테스트 코드에서 코루틴을 호출할 때 사용된다.
2. launch
- launch는 비차단 방식으로 새로운 코루틴을 실행한다.
- 즉, 부모 코루틴(여기서는 runBlocking)은 자식 코루틴이 끝나기를 기다리지 않고 바로 다음 명령어로 넘어간다.
- 하지만 runBlocking이 사용되면 결국 부모 코루틴이 완료될 때까지 메인 스레드가 차단되므로, 최종적으로는 모든 코루틴이 완료된다.
runBlocking내에서 launch를 사용하는 이유는 비동기적인 코루틴을 생성하면서도 그 안에서 동기적으로 코드를 제어하기 위함이다.
코루틴 디버깅 하기
1. 콘솔 로그를 사용한 디버깅
- VM 옵션을 사용한 코루틴 정보 콘솔에 출력
- -Dkotlinx.coroutines.debug
2. IntelliJ IDEA를 사용한 디버깅
- break point를 사용하여 디버그 모드 켜기
- break point 별로 넘기면서 코루틴을 하나씩 볼 수 있다. (코루틴의 계층화 때문)
3. 현업에서의 구분을 위한 코루틴 이름 부여 방법
- 코루틴의 수가 많아지면, 디버깅 시 구분하거나 관리하기 힘들다.
- 해당 문제를 해결하기 위해 코루틴에 특정한 이름을 부여할 수 있다.
+ 코루틴 네이밍 관련 추가글
복잡한 상황에서 코루틴을 구분하고 디버깅과 로깅을 쉽게 하기 위해 네이밍을 사용한다.
1. Context Key 사용: 코루틴은 CoroutineContex 를 통해 실행되므로, 커스텀 키를 사용해 코루틴에 정보를 추가할 수 있다. 예를 들어, CoroutineName 이라는 키를 사용해 코루틴에 이름을 부여할 수 있다.
// example
launch(CoroutineName("MyCoroutine")) {
// 코루틴 로직
}
이를 통해 디버깅하거나 로그를 남길 때 해당 코루틴의 이름을 확인할 수 있다.
2. 네이밍 패턴: 코루틴이 어떤 작업을 하는지에 따라 이름을 지을 수 있다.
- networkRequestCoroutine: 네트워크 요청 관련 코루틴
- dbWriteCoroutine: 데이터베이스 쓰기 작업 관련 코루틴
- backgroundProcessingCoroutine: 백그라운드 처리 작업 코루틴
3. 작업 단위로 분류: 대규모 프로젝트에서 코루틴을 분류할 때, 모듈별 or 작업 단위로 코루틴 이름을 부여하는 방식이 자주 사용된다.
'Coroutines' 카테고리의 다른 글
1. 스레드 기반 작업의 한계와 코루틴의 등장 (2) | 2024.10.10 |
---|