스팀 앱 개발기 #29 - 뷰모델, Repository 패턴 그리고 Use Case 패턴의 관계
지금까지 condenser_api.get_accounts API를 연동하는 과정에서 Repository 패턴과 Use Case 패턴을 구현했습니다. 설명을 드리지는 않았지만, 스팀 앱 개발기를 연재하는 초반에서는 ViewModel 패턴도 사용되고 있습니다. 이 세 패턴들의 관계를 이해해야 안드로이드 앱의 클린 아키텍처를 구축할 수 있습니다. 이번 포스트에서는 이 패턴들을 간단히 설명하고 이들의 관계가 어떻게 되는지를 간단히 정리해 보고자 합니다.
ViewModel 패턴
뷰(view)는 사용자에게 보여줄 화면 그리고 이를 구성하는 요소들을 의미하구요. 뷰모델(ViewModel)은 뷰에 필요한 데이터 그리고 이를 다루는 로직이 구현되는 곳입니다.
예전에는 액티비티 클래스 안에 뷰, 데이터, 로직을 모두 정의, 구현하는 방식이 사용되었지만, 그것은 액티비티가 너무 거대해지고 복잡해지는 문제가 있었습니다. 이를 분화하기 위한 디자인 패턴들이 만들어졌고, 그 과정에서 MVP, MVVM 패턴이 활용되었습니다. MVP 패턴이 사용되었다가 지금은 MVVM 패턴을 쓰는 것이 보편화되고 있습니다. 이제 액티비티는 뷰에 해당되고, 가능한 화면에 보여주는 역할만 수행하게끔 개발하는 것이 좋습니다.
Repository 패턴
Repository가 우리말로는 '저장소'죠. 데이터가 저장된 곳을 의미합니다. 저장소로부터 우리는 데이터를 읽을 수 있고, 반대로 기록도 할 수 있습니다. Repository 패턴은 데이터를 읽고 쓰는 역할을 담당합니다.
뷰모델이 Repository 객체를 통해 데이터를 읽고 쓰는 것이 가능합니다. 그러나 클린 아키텍처에서는 이 둘을 직접 연결하기보다는 중간에 Use Case 객체를 통해 간접 연결하는 것을 권합니다.
Use Case 패턴
클린 아키텍처에서 Use Case 패턴은 특정 데이터를 읽거나 쓰기를 Repository 객체에 요청하는 역할을 담당합니다. 예를 들면요. Repository 객체에 condenser_api.get_accounts API 실행을 요청할 수 있는 것입니다.
Use Case 객체는 뷰모델 객체가 사용합니다. 이 패턴을 사용하면요. 뷰모델이 사용할 수 있는 API 또는 DB 접근의 범위를 명확하게 제한할 수 있습니다. 뷰모델이 Repository 객체에 직접 접근하기보다는 Use Case 객체를 통해 간접 접근하는 것이 처음에는 복잡해 보일 수 있지만, 장기적으로는 유지보수에 더 낫다고 볼 수 있습니다.
마치며...
다음 포스트에서는 뷰모델 객체가 Use Case 객체를 통해 condenser_api.get_accounts API를 실행하고 사용자의 지갑 정보를 읽는 코드를 구현할 예정입니다.
지난 스팀 앱 개발기
- #28 - Use Case 패턴 적용
- #27 - Repository 패턴 적용
- #26 - condenser_api.get_accounts API로 받은 계정 자료를 SteemitWalletDTO 타입으로 변환하기
- #25 - SteemClient, SteemService 잘 작동하는지 유닛 테스트
- #24 - API 실행을 담당할 SteemService 인터페이스 정의
- #23 - condenser_api.get_accounts API 연동에 필요한 데이터 클래스 정의
- #22 - API 연동에 필요한 라이브러리 추가
- #21 - 사용자 지갑 정보를 담을 SteemitWallet 클래스 정의
- #20 - 클린 아키텍처를 위한 모듈 구성 (2)
- #19 - 클린 아키텍처를 위한 모듈 구성 (1)
- #18 - VEST로부터 STEEM POWER를 계산하는 방법
- #17 - VEST를 STEEM POWER로 변환하기 위해 필요한 get_dynamic_global_properties API
- #16 - 지갑 내용을 읽기 위해 필요한 API
- #15 - 지갑 서브화면(WalletFragment) 레이아웃 구성해 보기
- #14 - 지갑 서브화면(WalletFragment)에서 계정 인식하기
- #13 - 프로파일 서브화면(ProfileFragment)에서 계정 인식하기
- #12 - 태그 서브화면에서 태그 인식하기
- #11 - 검색 레이아웃을 메인 화면에 적용
- #10 - 태그 및 계정 검색 레이아웃 만들기
- #9 - BaseActivity 클래스 정의 그리고 MainActivity 클래스에 적용
- #8 - BaseFragment 클래스 정의 그리고 기존 프래그먼트들에 적용
- #7 - ProfileFragment 그리고 WalletFragment에 데이터 바인딩 적용
- #6 - 태그별 검색 내용을 보여줄 TagsFragment에 데이터 바인딩 적용
- #5 - GitHub에 소스 올리기
- #4 - 하단 내비게이션의 탭 관련 클래스 이름 수정
- #3 - 하단 내비게이션 바의 아이콘, 텍스트 수정
- #2 - 프로젝트 생성
- #1 - 시작하며...
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Upvoted! Thank you for supporting witness @jswit.