PHpullh
학습 라이브러리/Kotlin/예외 vs 반환값 선택 기준

KOTLIN · 예외처리

예외 vs 반환값 선택 기준

예외와 반환값(Result/Either) 중 적절한 에러 처리 방식을 선택하는 기준을 다룹니다.

예외처리중급exceptionresulterror-strategysealed-class

핵심 설명

예외와 반환값(Result/Either) 중 적절한 에러 처리 방식을 선택하는 기준을 다룹니다.

Kotlin code

// 예외 사용: 예측 불가능한 실패, 프로그래밍 오류
fun readConfig(path: String): Map<String, String> {
    require(path.isNotEmpty()) { "경로가 비어있습니다" }
    // 파일이 없으면 예외 (인프라 문제)
    return mapOf("key" to "value")
}

// Result 사용: 예측 가능한 실패, 비즈니스 규칙
fun validateAge(input: String): Result<Int> = runCatching {
    val age = input.toInt()
    require(age in 1..150) { "유효하지 않은 나이: $age" }
    age
}

// sealed class 사용: 여러 실패 케이스
sealed class LoginResult {
    data class Success(val token: String) : LoginResult()
    data class WrongPassword(val attempts: Int) : LoginResult()
    data object AccountLocked : LoginResult()
    data object UserNotFound : LoginResult()
}

fun login(id: String, pw: String): LoginResult = when {
    id != "admin" -> LoginResult.UserNotFound
    pw != "1234"  -> LoginResult.WrongPassword(1)
    else -> LoginResult.Success("token-xyz")
}

fun main() {
    // 각 방식의 처리
    when (val result = login("admin", "wrong")) {
        is LoginResult.Success -> println("토큰: ${result.token}")
        is LoginResult.WrongPassword -> println("비밀번호 오류 (${result.attempts}회)")
        LoginResult.AccountLocked -> println("계정 잠금")
        LoginResult.UserNotFound -> println("사용자 없음")
    }
}

학습 팁

일반적으로: 프로그래밍 오류 → 예외, 비즈니스 규칙 → sealed class/Result, 외부 시스템 → Result/try-catch로 구분합니다.

주의할 점

비즈니스 로직에서 예외를 제어 흐름으로 남용하면 성능이 저하되고 코드가 복잡해집니다. 예측 가능한 실패에는 반환값을 사용하세요.

자주 묻는 질문

예외 vs 반환값 선택 기준란 무엇인가요?

예외와 반환값(Result/Either) 중 적절한 에러 처리 방식을 선택하는 기준을 다룹니다.

예외 vs 반환값 선택 기준 학습 시 주의할 점은 무엇인가요?

비즈니스 로직에서 예외를 제어 흐름으로 남용하면 성능이 저하되고 코드가 복잡해집니다. 예측 가능한 실패에는 반환값을 사용하세요.