스팀 앱 개발기 #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 타입의 지갑 정보를 읽을 수 있음을 확인했습니다.

image.png


GitHub Commit


마치며...

드디어 Repository 패턴을 적용했습니다. 다음 포스트에서는 UseCase 패턴을 추가 적용하는 코드를 작성할 예정입니다.


지난 스팀 앱 개발기

Sort:  
 3 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.


안녕하세요.
이 글은 SteemitKorea팀(@jungjunghoon)님께서 저자이신 @dorian-mobileapp님을 추천하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!

Coin Marketplace

STEEM 0.09
TRX 0.31
JST 0.031
BTC 106603.58
ETH 3851.86
USDT 1.00
SBD 0.58