스팀 앱 개발기 #26 - condenser_api.get_accounts API로 받은 계정 자료를 SteemitWalletDTO 타입으로 변환하기

시작하며...

지난 포스트에서는 condenser_api.get_accounts API를 실행할 SteemService 인터페이스의 동작을 확인하기 위한 유닛 테스트 코드 작성 방법을 보여 드렸습니다. 이번 포스트에서는 이 API로 받은 계정 정보를 SteemitWalletDTO 타입으로 변환하는 코드를 작성해보겠습니다.

참고로 말씀드리자면, 데이터 읽기/쓰기를 담당할 Repository 패턴을 이 프로젝트에 적용할 예정입니다. 이 패턴 적용시 API로부터 읽은 데이터를 바로 사용하지 않구요. 그 대신 이를 가공(필요한 데이터만 추출한다거나 일부 데이터를 변형)한 DTO 객체를 앱의 View 담당 모듈에서 사용할 예정입니다.


사전 작업

dorian-steem-data 모듈은 아직 dorian-steem-domain 모듈을 알지 못합니다. 전자가 후자를 알게 하려면, 전자의 build.gradle 파일에 아래와 같이 코드를 추가로 작성해야 합니다.

dependencies {
    // To refer to other modules
    implementation project(":dorian-steem-domain")
 
    // ...
}

SteemitAccountEntity 타입을 SteemitWalletDTO 타입으로 변환

이전에도 알려드렸듯이 SteemitAccountEntity 타입에는 계정 관련 수많은 자료들이 있습니다. 그렇지만 지갑 화면에 보여줄 자료는 그 중의 일부지요. 이 화면에서 사용할 자료들을 따로 추출하여 SteemitWalletDTO 객체에 저장할 것입니다. 이를 위해 SteemitAccountEntity 클래스 안에 toSteemitWalletDTO() 메소드를 추가하였습니다. 이것은 말 그대로 현재의 계정 자료를 이용하여 지갑 관련 자료를 담은 SteemitWalletDTO 객체를 생성 및 리턴 합니다.

스팀 파워 관련 자료들의 데이터 포맷은 "XXX.XXXXXX VESTS"입니다. 그런데 파워 다운할 스팀 파워를 의미하는 to_withdraw는 이 형식을 따르지 않는 정수입니다. 이를 다른 스팀 파워 관련 자료들의 포맷과 동일하게 맞추는 코드를 추가로 작성했습니다.

data class SteemitAccountEntity(
    val id: String,
    val name: String,
    val owner: SteemitKeyEntity,
    val active: SteemitKeyEntity,
    val posting: SteemitKeyEntity,
    val memo_key: String,
    val json_metadata: String,
    val posting_json_metadata: String,
    val proxy: String,
    val last_owner_update: String,
    val last_account_update: String,
    val created: String,
    val mined: Boolean,
    val recovery_account: String,
    val last_account_recovery: String,
    val reset_account: String,
    val comment_count: Int,
    val lifetime_vote_count: Int,
    val post_count: Int,
    val can_vote: Boolean,
    val voting_manabar: ManabarEntity,
    val downvote_manabar: ManabarEntity,
    val voting_power: Int,
    val balance: String,
    val savings_balance: String,
    val sbd_balance: String,
    val sbd_seconds: String,
    val sbd_seconds_last_update: String,
    val sbd_last_interest_payment: String,
    val savings_sbd_balance: String,
    val savings_sbd_seconds: String,
    val savings_sbd_seconds_last_update: String,
    val savings_sbd_last_interest_payment: String,
    val savings_withdraw_requests: Int,
    val reward_sbd_balance: String,
    val reward_steem_balance: String,
    val reward_vesting_balance: String,
    val reward_vesting_steem: String,
    val vesting_shares: String,
    val delegated_vesting_shares: String,
    val received_vesting_shares: String,
    val vesting_withdraw_rate: String,
    val next_vesting_withdrawal: String,
    val withdrawn: String,
    val to_withdraw: String,
    val withdraw_routes: Int,
    val curation_rewards: Long,
    val posting_rewards: Long,
    val proxied_vsf_votes: Array<Any>,
    val witnesses_voted_for: Int,
    val last_post: String,
    val last_root_post: String,
    val last_vote_time: String,
    val post_bandwidth: Int,
    val pending_claimed_accounts: Int,
    val vesting_balance: String,
    val reputation: String,
    val transfer_history: Array<Any>,
    val market_history: Array<Any>,
    val post_history: Array<Any>,
    val vote_history: Array<Any>,
    val other_history: Array<Any>,
    val witness_votes: Array<Any>,
    val tags_usage: Array<Any>,
    val guest_bloggers: Array<Any>
) {

    fun toSteemitWalletDTO(): SteemitWalletDTO {
        val spToBeWithdrawn = try {
            "${to_withdraw.toDouble() / 1000000.0} VESTS"
        }
        catch (e: NumberFormatException) {
            "0 VESTS"
        }

        return SteemitWalletDTO(
            name,
            balance,
            sbd_balance,
            savings_balance,
            savings_sbd_balance,
            vesting_shares,
            delegated_vesting_shares,
            received_vesting_shares,
            vesting_withdraw_rate,
            spToBeWithdrawn
        )
    }

}

이 클래스를 사용하는 코드가 아직 없으므로 이번 포스트에서 유닛 테스트 코드는 작성하지 않습니다. 나중에 Repository 패턴을 적용하면서 테스트 코드를 만들 예정입니다.


GitHub Commit


마치며...

Repository 패턴을 프로젝트에 적용해야 하는데, 사전 작업이 예상보다 기네요. API 연동에 클린 아키텍처를 적용하는 과정이 간단치 않기 때문입니다. Entity 객체를 DTO 객체로 변환하는 코드를 이번에 작성했으니 다음 포스트에서 Repository 패턴 구현을 할 수 있을 것입니다.


지난 스팀 앱 개발기

Sort:  
 2 years ago 

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

Upvoted! Thank you for supporting witness @jswit.

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.029
BTC 57849.42
ETH 3122.29
USDT 1.00
SBD 2.43