1. Activity

  • 역할: Activity는 앱의 UI와 관련된 로직을 관리하고, ViewModel을 통해 비즈니스 로직과 상호 작용합니다.
  • 호출 위치: ActivityViewModel의 인스턴스를 생성하고 UI 요소에서 사용될 데이터를 관찰합니다. Android Jetpack의 ViewModelProvider를 사용해 ViewModel을 인스턴스화하며, 이 인스턴스는 Composable이나 UI 요소에서 필요한 데이터를 제공합니다.

class MyActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val userInfoViewModel: UserInfoViewModel = viewModel() // ViewModel 인스턴스화
            MyAuthPage(navController = rememberNavController(), userInfoViewModel = userInfoViewModel)
        }
    }
}

2. ViewModel

  • 역할: ViewModel은 UI의 데이터를 관리하고, 필요한 비즈니스 로직을 처리합니다. Repository에 있는 데이터 요청 메서드를 호출하여 데이터를 가져오고, 이를 UI가 사용할 수 있는 형태로 노출합니다.
  • 호출 위치: Activity 또는 Composable 내에서 인스턴스화되며, 주로 UI 요소에서 데이터를 가져오거나 관찰할 때 호출됩니다.

class UserInfoViewModel(private val repository: UserInfoRepository) : ViewModel() {
    private val _userInfo = MutableStateFlow<UserInfo?>(null)
    val userInfo: StateFlow<UserInfo?> = _userInfo

    fun fetchUserInfo() {
        viewModelScope.launch {
            _userInfo.value = repository.getUserInfo()
        }
    }
}

3. Repository

  • 역할: Repository는 데이터 소스를 관리하는 계층으로, API나 데이터베이스와의 상호작용을 추상화합니다. ViewModel에 필요한 데이터를 제공하며, 데이터 요청 메서드와 에러 처리를 포함합니다.
  • 호출 위치: Repository의 메서드는 ViewModel에서 호출됩니다. ViewModel이 데이터 요청을 할 때 Repository를 통해 데이터에 접근하며, 보통 suspend 함수를 통해 비동기로 데이터를 가져옵니다.

class UserInfoRepository(private val apiService: ApiService) {
    suspend fun getUserInfo(): UserInfoResponseDTO? {
        return try {
            apiService.getUserInfo()
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }
}

4. DTO (Data Transfer Object)

  • 역할: DTO는 네트워크 또는 데이터베이스와 통신할 때 사용되는 데이터 형식을 정의합니다. API를 통해 받아온 데이터를 나타내며, 보통은 ViewModel에서 이를 도메인 모델로 변환하여 UI에서 사용할 수 있도록 합니다.
  • 호출 위치: DTORepository의 메서드 호출 시 사용됩니다. RepositoryAPI 호출로 받은 데이터를 반환할 때 주로 DTO 형식으로 반환하며, ViewModel에서 UI용 모델로 변환하여 사용하거나 그대로 Composable에 전달합니다.

data class UserInfoResponseDTO(
    val email: String,
    val profileUrl: String,
    val nickname: String
)

전체 상관관계 요약

  1. ActivityViewModel:
    • ActivityViewModel을 인스턴스화하여 UI와 상호작용할 데이터를 관찰합니다.
  2. ViewModelRepository:
    • ViewModel은 데이터를 가져오기 위해 Repository의 메서드를 호출하며, 비즈니스 로직과 데이터를 추상화하여 Activity/Composable에 전달할 준비를 합니다.
  3. RepositoryDTO:
    • RepositoryAPI에서 데이터를 가져오며, 이때 데이터는 주로 DTO 형식으로 표현됩니다. 이 DTOViewModel이 UI에 맞게 필요한 데이터를 가공하도록 도와줍니다.

데이터 흐름 예시

  1. ActivityViewModel 인스턴스를 생성합니다.
  2. ViewModelRepositorygetUserInfo()를 호출하여 데이터를 가져옵니다.
  3. RepositoryAPI에서 데이터를 받아 UserInfoResponseDTO로 반환합니다.
  4. ViewModelUserInfoResponseDTOUserInfo 모델로 변환(또는 그대로)하여 _userInfo에 저장하고 StateFlow로 노출합니다.
  5. Activity 또는 ComposablecollectAsState를 통해 userInfo를 관찰하여 UI에 반영합니다.

이렇게 각 계층이 분리됨으로써 역할이 명확해지고, 데이터가 상하 관계를 통해 흐르는 구조가 됩니다.

profile
프론트엔드와 디자인

0개의 댓글