Retrofit + OkHttp + Coroutine 날씨 공공데이터 API 예제 - 3(Domain)

2022. 10. 8. 04:54android/날씨공공데이터앱

전 편이 궁금하신 분들은 아래에 링크로 ㄱㄱ

 

2022.10.07 - [분류 전체보기] - Retrofit + OkHttp + Coroutine 날씨 공공데이터 API 예제 - 2

 

Retrofit + OkHttp + Coroutine 날씨 공공데이터 API 예제 - 2 :: 개발하는무사시

 

dev-musa.tistory.com

 

 

이번 글에서는 Domain 영역을 어떻게 만들었는지 적으려고 합니다.

 

부족한 글 봐주셔서 감사합니다.

 

Domain 영역입니다.

 

WeatherRepository

Retrofit2를 이용하여 통신을 할 것이고 

1. getWeather 함수는 날씨 공공 데이터에서 받아올 단기예보를 위한 함수입니다.

2. getCurrentWeather 함수는 현재 시간의 날씨를 받아오기 위한 함수입니다. 

둘 다 반환 값은 Resource입니다. 

 

Resource

반환값으로 사용할 Resource 클래스입니다.

 

 

LocationTracker

아래는 위치서비스를 이용하기 위한 인터페이스 LocationTracker입니다.

반환 값으로 나중에 사용할 동네를 알기위한 주소와 Location 값이 있습니다.

 

 

 

WeatherData

각 화면에 보여줄 정보들이 들어있는 Data class입니다.

 

WeatherMap

아래는 나중에 받아올 이틀 동안의 날씨가 담길 Map입니다.

map의 Key는 당일날 , 다음날 이렇게 들어가고 Value의 List <WeatherData> 에는 

WeatherData가 시간 기준으로 들어있습니다. 

오늘 ,  07시 날씨 Data, 08시 날씨 Data, 09시 날씨, --- 이런 식으로 

내일 ,  00시 날씨, 01시 날씨, 02시 날씨, --- 이렇게 저장됩니다.

 

WeatherClassfication

아래는 날짜별 category를 그림과 멘트로 분류하는 클래스입니다.

package com.dev_musashi.weather.domain.data

import androidx.annotation.DrawableRes
import com.dev_musashi.weather.R.drawable as AppImg

sealed class WeatherClassification(
    val desc: String,
    @DrawableRes val iconRes: Int
) {
    object Sunny : WeatherClassification(
        desc = "맑음",
        iconRes = AppImg.ic_sunny
    )

    object Cloudy : WeatherClassification(
        desc = "구름낀 하늘",
        iconRes = AppImg.ic_cloudy
    )

    object FullCloudy : WeatherClassification(
        desc = "흐림",
        iconRes = AppImg.ic_fullcloudy
    )

    object SunnyNight : WeatherClassification(
        desc = "맑은 밤",
        iconRes = AppImg.ic_night_clear
    )

    object CloudyNight : WeatherClassification(
        desc = "약간 흐린 밤",
        iconRes = AppImg.ic_night_cloudy
    )

    object Rainy : WeatherClassification(
        desc = "비",
        iconRes = AppImg.ic_rain
    )

    object RainAndSnow : WeatherClassification(
        desc = "비&눈",
        iconRes = AppImg.ic_snow_rain_mix
    )

    object Snow : WeatherClassification(
        desc = "눈",
        iconRes = AppImg.ic_snow_rain_mix
    )

    object Shower : WeatherClassification(
        desc = "소나기",
        iconRes = AppImg.ic_showers
    )

    object Drizzling : WeatherClassification(
        desc = "빗방울",
        iconRes = AppImg.ic_raindrops
    )

    object Sleet : WeatherClassification(
        desc = "빗방울눈날림",
        iconRes = AppImg.ic_sleet
    )

    object SnowBlizzard : WeatherClassification(
        desc = "눈날림",
        iconRes = AppImg.ic_snow_wind
    )

    companion object {
        fun fromCategory(classification: String): WeatherClassification {
            return when (classification) {
                "맑음" -> Sunny
                "구름 많음" -> Cloudy
                "흐림" -> FullCloudy
                "밤맑음" -> SunnyNight
                "밤구름 많음" -> CloudyNight
                "비" -> Rainy
                "비/눈" -> RainAndSnow
                "눈" -> Snow
                "소나기" -> Shower
                "빗방울" -> Drizzling
                "빗방울눈날림" -> Sleet
                "눈날림" -> SnowBlizzard
                else -> Sunny
            }
        }
    }
}

 

 

Usecase

usecase는 굳이 안 만들어도 괜찮았겠지만 그래도 만들었습니다.

구현은 아래와 같습니다.

 

 

다음편에서는 Repository를 작성해보겠습니다.