[Android] RIOT API를 이용한 롤 전적검색 앱 만들기(1-2) - 데이터 관리

SangGun Park·2022년 3월 2일
0

Project

목록 보기
2/2

OP.GG 짭 1-2

(1)에 이어서 화면을 구현하기전 데이터 구조를 살펴보겠습니다.

데이터는 출처에 따라 API, DB 폴더로 분리하였고, Repository를 통해 캡슐화 하였습니다.


1. API

interface LeagueOfLegendAPI {
    @GET("summoner/v4/summoners/by-name/{summonerName}")
    suspend fun getSummoner(
        @Path("summonerName") summonerName: String,
        @Query("api_key") api_key: String
    ): Response<Summoner>

    @GET("league/v4/entries/by-summoner/{encryptedSummonerId}")
    suspend fun getLeague(
        @Path("encryptedSummonerId") encryptedSummonerId: String?,
        @Query("api_key") api_key: String
    ): Response<Set<LeagueEntryDTO>>

    @GET("spectator/v4/active-games/by-summoner/{encryptedSummonerId}")
    suspend fun getSpectator(
        @Path("encryptedSummonerId") encryptedSummonerId: String?,
        @Query("api_key") api_key: String
    ): Response<CurrentGameInfo>
}

Retrofit Interface로 사용할 api의 endPoint를 지정합니다.

2. DB

@Database(entities = [SummonerEntity::class, SearchEntity::class, ProfileEntity::class], version = 1)
@TypeConverters(
    value = [
        MiniSeriesTypeConverter::class
    ]
)
abstract class AppDatabase: RoomDatabase() {
    abstract fun LoLDao(): LoLDao
}

DataBase에서는 총 세 가지의 Entity를 사용하였고 Dao는 다음과 같이

@Dao
interface LoLDao {
    @Query("SELECT * FROM SummonerEntity")
    fun getSummoner(): LiveData<List<SummonerEntity>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertSummoner(summonerEntity: SummonerEntity)

    @Update
    suspend fun updateSummoner(summonerEntity: SummonerEntity)

    @Delete
    suspend fun deleteSummoner(summonerEntity: SummonerEntity)

    @Query("DELETE FROM SummonerEntity")
    suspend fun deleteSummonerAll()

    //Search

    @Query("SELECT * FROM SearchEntity")
    fun getSearch(): LiveData<List<SearchEntity>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertSearch(searchEntity: SearchEntity)

    @Delete
    suspend fun deleteSearch(searchEntity: SearchEntity)

    @Query("DELETE FROM SearchEntity")
    suspend fun deleteSearchAll()

    @Query("SELECT * FROM ProfileEntity")
    fun getProfile(): LiveData<ProfileEntity>

    @Insert
    suspend fun insertProfile(profileEntity: ProfileEntity)

    @Update
    suspend fun updateProfile(profileEntity: ProfileEntity)

    @Query("DELETE FROM ProfileEntity")
    suspend fun deleteProfile()


}

검색화연에 띄울 데이터와 메인화면에 띄울 데이터를 분리하여 구현 하였습니다.

3. Repository

class AppRepository constructor(private val dao: LoLDao, private val api: LeagueOfLegendAPI) {

    suspend fun searchSummoner(name: String, apiKey: String): Response<Summoner> = api.getSummoner(name,apiKey)

    suspend fun searchLeague(summonerId:String?, apiKey: String): Response<Set<LeagueEntryDTO>> = api.getLeague(summonerId,apiKey)

    suspend fun searchSpectator(summonerId:String?, apiKey: String): Response<CurrentGameInfo> = api.getSpectator(summonerId,apiKey)


    // Room Main
    fun getSummoner() = dao.getSummoner()

    suspend fun insertSummoner(summonerEntity: SummonerEntity){
        dao.insertSummoner(summonerEntity)
    }

    suspend fun updateSummoner(summonerEntity: SummonerEntity){
        dao.updateSummoner(summonerEntity)
    }

    suspend fun deleteSummoner(summonerEntity: SummonerEntity){
        dao.deleteSummoner(summonerEntity)
    }

    suspend fun deleteSummonerAll(){
        dao.deleteSummonerAll()
    }

    // Search
    fun getSearch() = dao.getSearch()

    suspend fun insertSearch(searchEntity: SearchEntity){
        dao.insertSearch(searchEntity)
    }

    suspend fun deleteSearch(searchEntity: SearchEntity){
        dao.deleteSearch(searchEntity)
    }

    suspend fun deleteSearchAll(){
        dao.deleteSearchAll()
    }

    // API KEY
    fun getApikey() = LoLApp.pref.getApikey()

    fun setApikey(value: String) {
        LoLApp.pref.setApikey(value)
    }

    fun delApikey() {
        LoLApp.pref.delApikey()
    }

    // Search
    fun getProfile() = dao.getProfile()

    suspend fun insertProfile(profileEntity: ProfileEntity){
        dao.insertProfile(profileEntity)
    }

    suspend fun updateProfile(profileEntity: ProfileEntity){
        dao.updateProfile(profileEntity)
    }

    suspend fun deleteProfile(){
        dao.deleteProfile()
    }

}

위에서 선언한 API와 Dao를 Repository에 모아 캡슐화 하였습니다.


데이터는 이런식으로 정리하였고 (2)에서는 검색화면을 구현 해보겠습니다.

profile
배우고 제때 익히니 즐겁지 아니한가

0개의 댓글