[kotlin] MVVM 아키텍처에서의 에러 핸들링 처리 방법

MVVM(Modeled-View-ViewModel) 아키텍처는 안드로이드 앱의 모델 및 UI 데이터 관리를 위한 효율적인 방법을 제공합니다. 이 아키텍처에서는 뷰(View)와 모델(Model) 간의 의존성이 없으며, 뷰모델(ViewModel)이 이들을 중개하여 데이터 바인딩과 관련 로직을 처리합니다.

그러나 네트워크 호출, 데이터베이스 액세스 등 비동기 작업을 수행할 때 발생하는 에러 처리는 주의 깊게 다루어져야 합니다. 이 포스트에서는 MVVM 아키텍처에서의 에러 핸들링 처리 방법에 대해 살펴보겠습니다.

1. Repository 레이어에서의 에러 핸들링

MVVM 아키텍처의 Repository 레이어에서는 네트워크 호출, 데이터베이스 액세스 등과 같은 외부 데이터 소스와의 상호작용을 처리합니다. 이 때, 각각의 데이터 작업에 대한 에러 처리를 구현해야 합니다. 여기서 Repository는 일반적으로 RxJava, 코루틴 등을 활용하여 비동기 작업을 수행하므로 에러 핸들링은 해당 라이브러리의 기능을 적절히 활용하여 구현해야 합니다.

class UserRepository(private val apiService: ApiService) {

    suspend fun getUser(userId: String): Result<User> {
        return try {
            val user = apiService.getUser(userId)
            Result.Success(user)
        } catch (e: Exception) {
            Result.Error(e)
        }
    }
}

2. ViewModel 레이어에서의 에러 핸들링

ViewModel 레이어에서는 뷰와 데이터 처리 로직을 분리함으로써 화면 회전 등의 상태 변화에 대한 데이터 유지를 보장합니다. 네트워크 호출이나 데이터베이스 액세스로부터 받은 결과를 가공하여 화면에 필요한 형태로 노출하는 작업을 수행하는데, 이 때 에러 처리 또한 중요한 부분입니다.

class UserViewModel(private val userRepository: UserRepository) : ViewModel() {
    private val _user = MutableLiveData<User>()
    val user: LiveData<User> = _user
    private val _error = MutableLiveData<String>()
    val error: LiveData<String> = _error

    fun getUser(userId: String) {
        viewModelScope.launch {
            val result = userRepository.getUser(userId)
            if (result is Result.Success) {
                _user.value = result.data
            } else if (result is Result.Error) {
                _error.value = "Failed to get user data: ${result.exception.message}"
            }
        }
    }
}

3. View 레이어에서의 에러 핸들링

View 레이어에서는 사용자 인터페이스를 관리하고, ViewModel의 데이터를 화면에 반영합니다. 따라서 네트워크 호출이나 데이터베이스 액세스로부터 에러 응답을 받았을 때, 사용자에게 적절하게 알림을 제공하는 것이 중요합니다.

class MainActivity : AppCompatActivity() {
    private val viewModel: UserViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        // ...
        viewModel.error.observe(this, { errorMessage ->
            Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT).show()
        })
    }
}

MVVM 아키텍처에서의 에러 핸들링은 각 레이어에서의 작업을 적절히 나누고, 책임을 분명히 함으로써 효율적으로 처리할 수 있습니다. 개발자는 각 레이어에서 에러 핸들링을 고려하여 작업을 수행해야 하며, 사용자에게 명확하고 유용한 에러 메시지를 제공함으로써 앱의 사용성을 향상시킬 수 있습니다.