본문 바로가기
Kotlin

[Kotlin] Kotlin 공식 문서 번역 - IntelliJ IDEA에서 코틀린 Flow 디버그하기 (Debug Kotlin Flow using IntelliJ IDEA – tutorial)

by 노력남자 2023. 10. 2.
반응형

IntelliJ IDEA에서 코틀린 Flow 디버그하기 (Debug Kotlin Flow using IntelliJ IDEA – tutorial)

 

이 튜토리얼은 Kotlin Flow를 생성하고 IntelliJ IDEA를 사용하여 디버그하는 방법을 보여줍니다.

이 튜토리얼은 코루틴과 Kotlin Flow 개념에 대한 사전 지식이 있다고 가정합니다.


Kotlin Flow 생성하기


느린 발신자와 느린 수집기가 있는 Kotlin Flow를 생성하세요:

1. IntelliJ IDEA에서 Kotlin 프로젝트를 열어보세요. 프로젝트가 없다면 새로 만드세요.

2. Gradle 프로젝트에서 kotlinx.coroutines 라이브러리를 사용하려면 build.gradle(.kts)에 다음 종속성을 추가하세요:

 

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1")
}


다른 빌드 시스템의 경우 kotlinx.coroutines README의 지침을 참조하세요.

3. src/main/kotlin에 있는 Main.kt 파일을 열어보세요.

src 디렉토리에는 Kotlin 소스 파일과 리소스가 포함되어 있습니다. Main.kt 파일에는 "Hello World!"를 출력하는 샘플 코드가 포함되어 있습니다.

4. 세 개의 숫자로 이루어진 Flow를 반환하는 simple() 함수를 생성하세요:

- CPU 소비 블로킹 코드를 모방하기 위해 delay() 함수를 사용하세요. 이 함수는 코루틴을 100 ms 동안 일시 중단하며 스레드를 차단하지 않습니다.

-  for 루프를 사용하여 emit() 함수로 값을 생성하세요.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import kotlin.system.*

fun simple(): Flow<Int> = flow {
    for (i in 1..3) {
        delay(100)
        emit(i)
    }
}


5. main() 함수의 코드를 변경하세요:

-  코루틴을 래핑하기 위해 runBlocking() 블록을 사용하세요.

-  collect() 함수를 사용하여 발생한 값을 수집하세요.

-  CPU 소비 코드를 모방하기 위해 delay() 함수를 사용하세요. 이 함수는 코루틴을 300 ms 동안 일시 중단하며 스레드를 차단하지 않습니다.

-  println() 함수를 사용하여 Flow에서 수집한 값을 출력하세요.

fun main() = runBlocking {
    simple()
        .collect { value ->
            delay(300)
            println(value)
        }
}


6. Build Project를 클릭하여 코드를 빌드하세요.

 

 

코루틴 디버깅하기


1. emit() 함수가 호출되는 라인에 중단점을 설정하세요:

 


2. 디버그 모드로 코드를 실행하기 위해 화면 상단의 실행 구성 옆에 있는 Debug를 클릭하세요.

 


디버그 도구 창이 나타납니다:

- Frames 탭에는 호출 스택이 포함되어 있습니다.

-  Variables 탭에는 현재 컨텍스트의 변수가 포함되어 있습니다. 이 탭은 Flow가 첫 번째 값을 발생시키고 있다는 정보를 제공합니다.

-  Coroutines 탭에는 실행 중인 또는 중단된 코루틴에 대한 정보가 포함되어 있습니다.

 


3. 디버그 세션을 다시 시작하려면 디버그 도구 창에서 Resume Program을 클릭하세요. 프로그램은 동일한 중단점에서 다시 중지합니다.

 


이제 Flow가 두 번째 값을 발생시킵니다.

 

 

최적화된 변수


suspend 함수를 사용하는 경우 디버거에서 변수 이름 옆에 "was optimized out" 텍스트를 볼 수 있습니다:

 


이 텍스트는 변수의 수명이 감소하고 변수가 더 이상 존재하지 않음을 의미합니다. 최적화된 변수로 코드를 디버깅하는 것은 어렵기 때문에 -Xdebug 컴파일러 옵션을 사용하여 이 동작을 비활성화할 수 있습니다. 이 플래그를 프로덕션에서 사용하지 마세요. -Xdebug는 메모리 누수를 발생시킬 수 있습니다.


동시에 실행되는 코루틴 추가하기


1. src/main/kotlin에 있는 Main.kt 파일을 열어보세요.

2. 코드를 개선하여 발신자와 수집기를 동시에 실행하세요:

- buffer() 함수를 호출하여 발신자와 수집기를 동시에 실행하도록 하세요. buffer()는 발신된 값들을 저장하고 플로우 수집기를 별도의 코루틴에서 실행합니다.

fun main() = runBlocking<Unit> {
    simple()
        .buffer()
        .collect { value ->
            delay(300)
            println(value)
        }
}


3. Build Project를 클릭하여 코드를 빌드하세요.


두 개의 코루틴이 있는 Kotlin Flow를 디버그하기


1. println(value)에서 새로운 중단점을 설정하세요.

2. 디버그 모드로 코드를 실행하기 위해 화면 상단의 실행 구성 옆에 있는 Debug를 클릭하세요.

 


디버그 도구 창이 나타납니다.

Coroutines 탭에서 두 개의 코루틴이 동시에 실행되고 있는 것을 볼 수 있습니다. buffer() 함수 덕분에 발신자와 수집기가 별개의 코루틴에서 실행됩니다. 발신자 코루틴은 RUNNING 상태이며 수집기 코루틴은 SUSPENDED 상태입니다.

3. 디버그 세션을 다시 시작하려면 디버그 도구 창에서 Resume Program을 클릭하세요.

 


이제 수집기 코루틴은 RUNNING 상태이고 발신자 코루틴은 SUSPENDED 상태입니다.

각 코루틴을 자세히 살펴볼 수 있으므로 코드를 디버그할 수 있습니다.

 

원문

 

https://kotlinlang.org/docs/debug-flow-with-idea.html

반응형

댓글