Skip to content

뷰모델이 얼마나 알고 있어야 할까?

KimGeunBeom edited this page Nov 19, 2023 · 1 revision

캘린더 화면에 입장하면 서버로 부터 유저 정보를 가져오도록 요청을 한다.

이 때, 서버에서 가져오는 것을 실패하면 DataStore에 저장되어있는 유저정보를 가져오고 이 또한 실패하면 예외처리를 핟도록한다. 만약 서버에서 가져오는 것을 성공하면 DataStore에 유저정보를 갱신한다.

viewModelScope.launch {
            userRepository.getUserProfile().catch {
                //datastore에서 유저정보 가져오기
            }.collect { userProfile ->
								//datastore에서 유저정보를 업데이트 하기
                updateUserProfile(userProfile)
            }
        }

하지만, 좀 더 고민을 해보니 뷰모델은 단지 유저 정보를 가져오는 것을 요청하는 것인데 실패에 대해 다시 로컬에서 유저정보를 가져오고 성공을 하면 유저정보를 로컬에 저장하는 것을 담당하는 것이 맞을까?? 라는 생각을 하였다.

그래서 뷰모델에서는 단순히 가져오고 Repository에서 이를 모두 담당하는 것으로 변환 시켜보았다.

fun getUserProfile(): Flow<UserProfile> {
        return flowOf(true)
            .map {
                val token = dataStore.getAppToken().first() ?: throw NoDataException()
                userApi.getUserProfile(token)
            }.onEach {
                fetchUserProfile(it)
            }.catch {
                getLocalUserProfile()
            }
    }

Flow는 순차적으로 내 논리로는 map에서 유저 정보를 서버에서 가져오고 이를 onEach에서 datastore에서 저장하고 서버에서 받아온 유저 정보를 반환한다. 이 때, 실패를 한다면 로컬에서 유저 정보를 가져온다.

결과적으로 뷰모델은 단순히 유저정보를 요청하고 레포지토리에서 이에 대한 내부 로직을 담당하여 좀 더 책임 분리에 맞는 것 같다!!

⚽️협업 룰

코딩 컨벤션

📔회고

팀 회고

개인 회고

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

👨‍🏫멘토링 회의록

💻개발일지

Android

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

💡트러블슈팅

Android

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

📋회의록

스크럼 회의

스프린트 회의

밋밋 회의

공통

BackEnd

Android

기획

Clone this wiki locally