Home [TIL] 2022-11-04
Post
Cancel

[TIL] 2022-11-04

๐Ÿ˜ฒ ์˜ค๋Š˜์˜ ๊ฐœ๋ฐœ ์ผ์ง€


  • Clean Architecture์—์„œ Paging์„ ์ ์šฉ์‹œํ‚ค๋Š”๋ฐ ์• ๋ฅผ ๋จน์—ˆ๋‹ค.
    • ์›๋ž˜ ViewModel์—์„œ PagingSource๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๋กœ Page ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ Clean Architecture ๊ตฌ์กฐ๋กœ ํ•ด์•ผํ–ˆ๊ธฐ์— ViewModel์—๋Š” UseCase๋งŒ ๋„ฃ์—ˆ๋‹ค.
    • Api๋กœ๋ถ€ํ„ฐ Page๊ฐ’์„ ๋ฐ›์•„์˜ค๊ณ  -> DataSource์—์„œ Repository๋กœ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋„˜๊ฒจ์ค€๋‹ค -> Repository์—์„œ Paging ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€ ํ›„ PagingSource.LoadResult ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • Repository๋Š” Domain ์˜์—ญ์ด๊ธฐ์— ์•ˆ๋“œ๋กœ์ด๋“œ์— ์˜์กดํ•˜๋ฉด ์•ˆ๋ผ์„œ Paging์„ ์•„๋ž˜์™€ ๊ฐ™์ด implent ํ–ˆ๋‹ค.
      1
      2
      
      // Paging3
      implementation "androidx.paging:paging-common:3.1.1"
      
  • ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š” ๊ณผ์ •์—์„œ ์นด์นด์˜ค์™€ ๋„ค์ด๋ฒ„์—์„œ ๋ฐ›์€ ํ† ํฐ ๊ฐ’์„ ๋„˜๊ฒจ accessToken ๊ฐ’์„ ๋ฐ›์•„์™€์•ผํ•˜๋Š”๋ฐ ์ž๊พธ 500 error๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

    • ์•Œ๊ณ  ๋ณด๋‹ˆ ์„œ๋ฒ„ํ•œํ…Œ ๋„˜๊ธฐ๋Š” ํ† ํฐ๊ฐ’ ๋งˆ์ง€๋ง‰์ด โ€˜=โ€™์œผ๋กœ ๋๋‚˜๋Š”๋ฐ ์ด๊ฒŒ ์ธ์‹์ด ์•ˆ๋ผ์„œ ์œ ๋‹ˆ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์„œ๋ฒ„์— ์ „์†ก๋๋‹ค.
    • ๊ฒ€์ƒ‰ํ•ด๋ณธ ๊ฒฐ๊ณผ gson ์„ค์ •์„ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜์—ˆ๋‹ค.
    1
    2
    3
    4
    5
    6
    7
    
    val gson = GsonBuilder().disableHtmlEscaping().create()
    
    Retrofit.Builder()
        .baseUrl(SERVER_URL)
        .client(OkHttpClient.Builder().addInterceptor(interceptor).build())
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()
    
  • ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ๋•Œ ๊ฒฐ๊ณผ๊ฐ’ ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ํ†ต์‹ ํ•˜๋‹ˆ ๋งŽ์ด ํŽธํ–ˆ๋‹ค.

    • ์ด์ฒ˜๋Ÿผ ResultState๋ผ๋Š” ํด๋ž˜์Šค๋กœ ํ†ต์‹  ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
        sealed class ResultState<out T> {
        object Uninitialized : ResultState<Nothing>()
        object Loading : ResultState<Nothing>()
        object Empty : ResultState<Nothing>()
        data class Success<T>(val data: T) : ResultState<T>()
        data class Error(val exception: Throwable) : ResultState<Nothing>() {
            val isNetworkError = exception is IOException
        }
    }
    

    ํ†ต์‹  ๊ณผ์ •

    1
    2
    3
    4
    5
    6
    7
    8
    
    override fun loginNaverUser(token: String): Flow<ResultState<User>> = flow {
        Log.d(TAG, "loginNaverUser: $TAG: Loading")
        emit(ResultState.Loading)
    
        userRemoteDataSource.loginNaverUser(token).collect {
            Log.d(TAG, "loginNaverUser $TAG: collect ${it.body()!!}")
            emit(ResultState.Success(mapperToUser(it.body()!!)))
        }
    

    ์ด๋ ‡๊ฒŒ ์ฒ˜์Œ์— Loading ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๊ณ  ๊ฐ’์„ ๋„˜๊ธฐ๋ฉด์„œ Success ์ƒํƒœ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

    • ์ด ๊ฒฝ์šฐ๋Š” flow๋ž‘ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์ด ํŽธํ•  ๊ฒƒ ๊ฐ™๋‹ค.
    • flow๋ถ€ํ„ฐ ๊ณต๋ถ€ํ•ด์•ผํ• ๋“ฏโ€ฆ.
This post is licensed under CC BY 4.0 by the author.

[Android] Clean Architecture

[TIL] 2022-11-07