본문 바로가기
공부/코틀린코루틴:딥다이브(마르친 모스카와)

3장 - 중단은 어떻게 작동할까?

by 띵커베르 2024. 1. 13.
728x90
  • 중단 함수는 코틀린 코루틴의 핵심이다.
  • 코루틴은 중단되었을 때 Continuation 객체를 반환한다.
  • 중단했을 때 어떤 자원도 사용하지 않는다
    • 실행이 중지 되어있을 때 스레드를 차지하지 않아 다른 작업에 스레드를 할당할 수 있다는 뜻.
  • delay - 중단
    • 코루틴의 실행을 지정된 시간 동안 일시적으로 중단하는 데 사용된다.
    • delay(timeInMillis) 함수는 매개변수(ms) 단위로 현재 코루틴을 중단하며 시간이 지나면 자동으로 다시 시작된다.
    • 비블로킹 특성을 가진다.
      • 스레드를 차단하지 않는다.
      • 코루틴은 일시 중단되지만, 그 로쿠틴이 실행되고 있던 스레드는 다른 작업을 계속 수행할 수 있다.
    • 지정된 시간이 지난 후에는 중단되었던 지점에서 실행을 재개하는데, 이과정은 코루틴의 컨티뉴에이션 매커니즘을 통해 이루어 진다.
    • 코루틴 블록 또는 suspend 함수 내부에서만 호출할 수 있다.
  • resume - 재개
    • resume 함수에 Unit 을 인자로 넣는다.suspendConroutine 의 타입 인자로 Unit 을 사용한다
      • Unit
        • 자바의 void 와 유사한 역할을 하지만 Unit 은 객체로서의 특성을 가진 실제 타입
        • Unit 은 객체이므로, 변수에 할당하거나 다른 함수의 매개변수로 전달할 수 있다.
        • Unit 을 반환하는 타입은 명시적으로 Unit 이라 지정하지 않아도 Unit을 반환한다.
    • 실패에 대한 처리
      • 만약 외부 api 호출시 실패에 의한 에러 처리를 원한다면?
        • resumeWithException 사용
          • 비동기 작업이 실패했을 때 예외를 코루틴으로 전파합니다. 이 방법은 코루틴의 중단 지점에서 실패를 처리하고자 할 때 유용합니다. 
        • try catch 형식으로 처리할 수 있다.
          • suspend fun fetchApiData(): ApiResponse {
                return try {
                    // API 호출
                    apiService.getData()
                } catch (e: Exception) {
                    // 예외 처리
                    handleError(e)
                }
            }
        • 타임아웃 처리
          • suspend fun fetchApiDataWithTimeout(): ApiResponse? {
                return withTimeoutOrNull(5000L) { // 5초 타임아웃
                    apiService.getData()
                }
            }
        • 재시도 로직
          • suspend fun fetchApiDataWithRetry(retries: Int = 3): ApiResponse? {
                repeat(retries) {
                    try {
                        return apiService.getData()
                    } catch (e: Exception) {
                        if (it == retries - 1) throw e
                    }
                }
                return null
            }
        • 코루틴 핸들러 사용- CoroutineExceptionHandler ㄹㄹ 사용하여 코루틴 스코프 내에서 발생하는 모든 예외를 처리할 수 있다. 이 방법은 코루틴 스코프 전체에 대한 에러 처리가 필요할 때 유용하다.
          • val handler = CoroutineExceptionHandler { _, exception ->
                handleError(exception)
            }
            val scope = CoroutineScope(Job() + Dispatchers.Main + handler)

            scope.launch {
                // API 호출
            }
        • 응답 검증 - api 의 응답을 검증하여 처리한다.
          • suspend fun fetchApiData(): ApiResponse {
                val response = apiService.getData()
                if (response.isSuccessful) {
                    return response.body() ?: throw ApiException("No data")
                } else {
                    throw ApiException("API Error: ${response.code()}")
                }
            }
        •  
728x90

댓글