스팀 앱 개발기 #27 - Repository 패턴 적용
시작하며...
저번 포스트의 내용은 아래와 같습니다.
- condenser_api.get_accounts API로 받은 계정 자료를 SteemitWalletDTO 타입으로 변환하기
이번 포스트에서 드디어 Repository 패턴을 앱에 적용합니다. 여기서 SteemitWalletDTO 객체를 드디어 생성합니다.
사전 리팩토링
dorian-steem-domain 모듈에서 model 패키지를 만들지 않았네요. 이것을 생성하여 SteemitWalletDTO 클래스를 그리로 옮깁니다.
package lee.dorian.steem_domain.model
data class SteemitWalletDTO(
...
)
dorian-steem-domain 모듈의 build.gradle 수정
수정사항은 다음과 같습니다.
- Java 버전을 1.7에서 1.8로 변경
- dependencies 블록 추가하고, RxJava 라이브러리 추가
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
dependencies {
// rx
implementation 'io.reactivex.rxjava2:rxjava:2.2.20'
}
dorian-steem-domain 모듈에 SteemRepository 인터페이스 정의
클린 아키텍처에서 Repository 패턴은 데이터 읽기 또는 기록을 담당하는 클래스, 인터페이스의 집합입니다. 스팀잇 지갑 정보를 읽을 메소드를 포함한 SteemRepository 인터페이스를 아래와 같이 정의합니다.
interface SteemRepository {
fun readSteemitWallet(account: String): Flowable<Array<SteemitWalletDTO>>
}
추가로 이 메소드를 호출하여 SteemitWalletDTO 배열을 구독할 수 있습니다. 단일 객체가 아닌 배열인 이유는요. condenser_api.get_accounts API가 주는 계정 정보가 0개 이상인 점을 감안했습니다. 배열의 길이가 0이면, 계정 정보를 읽지 못한 것으로 간주할 수 있습니다.
dorian-steem-data 모듈에 SteemRepositoryImpl 클래스 추가
dorian-steem-domain 모듈에 정의한 SteemRepository 인터페이스는 dorian-steem-data 모듈에서 이를 구현하는 클래스를 만듭니다. 이 클래스의 이름은 SteemRepositoryImpl로 정했습니다. 여기서 readSteemitWallet 메소드를 구현하고요. 여기에서 SteemClient를 통해 condenser_api.get_accounts API를 실행하여 계정 정보를 담은 GetAccountsResponseEntity를 받아오구요. 그것의 toSteemitWalletDTO() 메소드를 호출하여 SteemitWallet 객체를 만들어냅니다.
class SteemRepositoryImpl: SteemRepository {
override fun readSteemitWallet(account: String): Flowable<Array<SteemitWalletDTO>> {
val getAccountParams = GetAccountsParams(
params = arrayOf(arrayOf(account)),
id = 1
)
return SteemClient.apiService.getAccounts(getAccountParams).map { responseEntity ->
when (responseEntity.result.size) {
1 -> arrayOf(responseEntity.result[0].toSteemitWalletDTO())
else -> arrayOf()
}
}
}
}
SteemRepositoryImpl 클래스 테스트
유닛 테스트를 이용하여 이 클래스가 잘 작동하는지 테스트할 수 있습니다. 테스트 코드는 다음과 같이 작성했습니다.
class SteemRepositoryImplTest {
val steemRepository = SteemRepositoryImpl()
// Test case 1: Trying to get the wallet of a valid account.
@Test
fun readSteemitWallet_case1() {
steemRepository.readSteemitWallet(TestData.singleAccount).subscribe {
assertEquals(1, it.size)
assertEquals(TestData.singleAccount, it[0].account)
}
}
// Test case 2: Trying to get the wallet of an invalid account.
@Test
fun readSteemitWallet_case2() {
steemRepository.readSteemitWallet(TestData.invalidSingleAccount).subscribe {
assertEquals(0, it.size)
}
}
}
테스트 결과, SteemitWalletDTO 타입의 지갑 정보를 읽을 수 있음을 확인했습니다.
GitHub Commit
마치며...
드디어 Repository 패턴을 적용했습니다. 다음 포스트에서는 UseCase 패턴을 추가 적용하는 코드를 작성할 예정입니다.
지난 스팀 앱 개발기
- #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.
@추천해
안녕하세요.
이 글은 SteemitKorea팀(@jungjunghoon)님께서 저자이신 @dorian-mobileapp님을 추천하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!