From 45db24dad068dd587f6762ae82566b3903a9b90f Mon Sep 17 00:00:00 2001 From: chanu Date: Fri, 29 Dec 2023 21:52:22 +0900 Subject: [PATCH 01/36] =?UTF-8?q?[feat]=20:=20api=20factory=20=ED=95=98?= =?UTF-8?q?=EB=82=98=EB=A1=9C=20=ED=95=A9=EC=B9=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{network => data}/ApiFactory.kt | 26 +++++++++++++------ .../service}/ReqresService.kt | 3 ++- .../network/reqresApiFactory.kt | 25 ------------------ 3 files changed, 20 insertions(+), 34 deletions(-) rename app/src/main/java/org/sopt/dosopttemplate/{network => data}/ApiFactory.kt (67%) rename app/src/main/java/org/sopt/dosopttemplate/{network/doandroid => data/service}/ReqresService.kt (64%) delete mode 100644 app/src/main/java/org/sopt/dosopttemplate/network/reqresApiFactory.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/network/ApiFactory.kt b/app/src/main/java/org/sopt/dosopttemplate/data/ApiFactory.kt similarity index 67% rename from app/src/main/java/org/sopt/dosopttemplate/network/ApiFactory.kt rename to app/src/main/java/org/sopt/dosopttemplate/data/ApiFactory.kt index d2972ab..fd0b488 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/network/ApiFactory.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/ApiFactory.kt @@ -1,4 +1,4 @@ -package org.sopt.dosopttemplate.network +package org.sopt.dosopttemplate.data import android.util.Log import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory @@ -8,11 +8,13 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import org.sopt.dosopttemplate.BuildConfig -import org.sopt.dosopttemplate.network.login.AuthService +import org.sopt.dosopttemplate.data.service.AuthService +import org.sopt.dosopttemplate.data.service.ReqresService import retrofit2.Retrofit object ApiFactory { - private const val BASE_URL = BuildConfig.AUTH_BASE_URL + private const val AUTH_BASE_URL = BuildConfig.AUTH_BASE_URL + private const val USER_BASE_URL = BuildConfig.USER_BASE_URL /* 1. 일단 로깅을 해줄 인터셉트를 만들어 줍니다. 2. 이 함수는 Http통신 중 로깅을 담당 @@ -34,17 +36,25 @@ object ApiFactory { .addInterceptor(getLogOkHttpClient()) .build() - val retrofit: Retrofit by lazy { - Retrofit.Builder() - .baseUrl(BASE_URL) + private fun createRetrofit(baseUrl: String): Retrofit { + return Retrofit.Builder() + .baseUrl(baseUrl) .client(okHttpClient) // 여기에 달아준다. .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) .build() } - inline fun create(): T = retrofit.create(T::class.java) + private inline fun create(baseUrl: String): T { + return createRetrofit(baseUrl).create(T::class.java) + } object ServicePool { - val authService = ApiFactory.create() + val authService: AuthService by lazy { + create(AUTH_BASE_URL) + } + + val userService: ReqresService by lazy { + create(USER_BASE_URL) + } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/network/doandroid/ReqresService.kt b/app/src/main/java/org/sopt/dosopttemplate/data/service/ReqresService.kt similarity index 64% rename from app/src/main/java/org/sopt/dosopttemplate/network/doandroid/ReqresService.kt rename to app/src/main/java/org/sopt/dosopttemplate/data/service/ReqresService.kt index e9c4df3..25a78c6 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/network/doandroid/ReqresService.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/service/ReqresService.kt @@ -1,5 +1,6 @@ -package org.sopt.dosopttemplate.network.doandroid +package org.sopt.dosopttemplate.data.service +import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseReqresDto import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Query diff --git a/app/src/main/java/org/sopt/dosopttemplate/network/reqresApiFactory.kt b/app/src/main/java/org/sopt/dosopttemplate/network/reqresApiFactory.kt deleted file mode 100644 index 15761c1..0000000 --- a/app/src/main/java/org/sopt/dosopttemplate/network/reqresApiFactory.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.sopt.dosopttemplate.network // ktlint-disable filename - -import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory -import kotlinx.serialization.json.Json -import okhttp3.MediaType.Companion.toMediaType -import org.sopt.dosopttemplate.BuildConfig -import org.sopt.dosopttemplate.network.doandroid.ReqresService -import retrofit2.Retrofit - -object reqresApiFactory { - private const val BASE_URL = BuildConfig.USER_BASE_URL - - val retrofit: Retrofit by lazy { - Retrofit.Builder() - .baseUrl(BASE_URL) - .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) - .build() - } - - inline fun create(): T = retrofit.create(T::class.java) - - object ServicePool { - val reqresService = reqresApiFactory.create() - } -} From 1f815a4bd3242aea9791e8065e61ccbe411552a2 Mon Sep 17 00:00:00 2001 From: chanu Date: Fri, 29 Dec 2023 22:03:29 +0900 Subject: [PATCH 02/36] =?UTF-8?q?[chore]=20:=20=EB=94=94=EB=A0=89=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EB=B3=80=EA=B2=BD=20data-dto-remote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../login => data/dto/remote/request}/RequestLoginDto.kt | 2 +- .../login => data/dto/remote/request}/RequestSignUpDto.kt | 2 +- .../login => data/dto/remote/respose}/ResponseLoginDto.kt | 2 +- .../doandroid => data/dto/remote/respose}/ResponseReqresDto.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename app/src/main/java/org/sopt/dosopttemplate/{network/login => data/dto/remote/request}/RequestLoginDto.kt (80%) rename app/src/main/java/org/sopt/dosopttemplate/{network/login => data/dto/remote/request}/RequestSignUpDto.kt (83%) rename app/src/main/java/org/sopt/dosopttemplate/{network/login => data/dto/remote/respose}/ResponseLoginDto.kt (83%) rename app/src/main/java/org/sopt/dosopttemplate/{network/doandroid => data/dto/remote/respose}/ResponseReqresDto.kt (90%) diff --git a/app/src/main/java/org/sopt/dosopttemplate/network/login/RequestLoginDto.kt b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/request/RequestLoginDto.kt similarity index 80% rename from app/src/main/java/org/sopt/dosopttemplate/network/login/RequestLoginDto.kt rename to app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/request/RequestLoginDto.kt index ed7e423..dee2b2c 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/network/login/RequestLoginDto.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/request/RequestLoginDto.kt @@ -1,4 +1,4 @@ -package org.sopt.dosopttemplate.network.login +package org.sopt.dosopttemplate.data.dto.remote.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/org/sopt/dosopttemplate/network/login/RequestSignUpDto.kt b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/request/RequestSignUpDto.kt similarity index 83% rename from app/src/main/java/org/sopt/dosopttemplate/network/login/RequestSignUpDto.kt rename to app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/request/RequestSignUpDto.kt index 9c3ba32..469c792 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/network/login/RequestSignUpDto.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/request/RequestSignUpDto.kt @@ -1,4 +1,4 @@ -package org.sopt.dosopttemplate.network.login +package org.sopt.dosopttemplate.data.dto.remote.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/org/sopt/dosopttemplate/network/login/ResponseLoginDto.kt b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseLoginDto.kt similarity index 83% rename from app/src/main/java/org/sopt/dosopttemplate/network/login/ResponseLoginDto.kt rename to app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseLoginDto.kt index 6ddb8d2..f4d8f65 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/network/login/ResponseLoginDto.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseLoginDto.kt @@ -1,4 +1,4 @@ -package org.sopt.dosopttemplate.network.login +package org.sopt.dosopttemplate.data.dto.remote.respose import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/org/sopt/dosopttemplate/network/doandroid/ResponseReqresDto.kt b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseReqresDto.kt similarity index 90% rename from app/src/main/java/org/sopt/dosopttemplate/network/doandroid/ResponseReqresDto.kt rename to app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseReqresDto.kt index d9fb610..48b8557 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/network/doandroid/ResponseReqresDto.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseReqresDto.kt @@ -1,4 +1,4 @@ -package org.sopt.dosopttemplate.network.doandroid +package org.sopt.dosopttemplate.data.dto.remote.respose import kotlinx.serialization.Serializable From f03cee729c51dc4ef08354cccb7454057eb6c4a3 Mon Sep 17 00:00:00 2001 From: chanu Date: Sun, 31 Dec 2023 02:13:21 +0900 Subject: [PATCH 03/36] =?UTF-8?q?[chore]=20:=20=EB=94=94=EB=A0=89=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EB=B3=80=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{network/login => data/service}/AuthService.kt | 5 ++++- .../ui/doandroid/adapter/CarouselHeroAdapter.kt | 2 +- .../ui/doandroid/adapter/CarouselUserAdapter.kt | 2 +- .../java/org/sopt/dosopttemplate/ui/home/HomeFragment.kt | 2 +- .../java/org/sopt/dosopttemplate/ui/home/HomeViewModel.kt | 4 ++-- .../sopt/dosopttemplate/ui/home/adapter/HomeDiffCallBack.kt | 2 +- .../sopt/dosopttemplate/ui/home/adapter/HomeMainAdapter.kt | 2 +- .../ui/home/adapter/viewholder/BirthdayViewHolder.kt | 2 +- .../ui/home/adapter/viewholder/FriendViewHolder.kt | 2 +- .../ui/home/adapter/viewholder/ProfileViewHolder.kt | 2 +- .../ui/home/adapter/viewholder/TitleLineViewHolder.kt | 2 +- .../java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt | 6 +++--- .../java/org/sopt/dosopttemplate/ui/login/LoginState.kt | 2 +- .../java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt | 2 +- .../org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt | 6 +++--- .../{data/home => ui/model}/HomeSealedItem.kt | 2 +- .../sopt/dosopttemplate/{data/login => ui/model}/User.kt | 2 +- .../sopt/dosopttemplate/{data/user => ui/model}/UserInfo.kt | 4 +--- .../org/sopt/dosopttemplate/ui/mypage/MyPageFragment.kt | 2 +- 19 files changed, 27 insertions(+), 26 deletions(-) rename app/src/main/java/org/sopt/dosopttemplate/{network/login => data/service}/AuthService.kt (58%) rename app/src/main/java/org/sopt/dosopttemplate/{data/home => ui/model}/HomeSealedItem.kt (93%) rename app/src/main/java/org/sopt/dosopttemplate/{data/login => ui/model}/User.kt (82%) rename app/src/main/java/org/sopt/dosopttemplate/{data/user => ui/model}/UserInfo.kt (82%) diff --git a/app/src/main/java/org/sopt/dosopttemplate/network/login/AuthService.kt b/app/src/main/java/org/sopt/dosopttemplate/data/service/AuthService.kt similarity index 58% rename from app/src/main/java/org/sopt/dosopttemplate/network/login/AuthService.kt rename to app/src/main/java/org/sopt/dosopttemplate/data/service/AuthService.kt index 864ca1d..0901fbd 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/network/login/AuthService.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/service/AuthService.kt @@ -1,5 +1,8 @@ -package org.sopt.dosopttemplate.network.login +package org.sopt.dosopttemplate.data.service +import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto +import org.sopt.dosopttemplate.data.dto.remote.request.RequestSignUpDto +import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseLoginDto import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselHeroAdapter.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselHeroAdapter.kt index 9c10b5c..b8b47bc 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselHeroAdapter.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselHeroAdapter.kt @@ -6,8 +6,8 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import org.sopt.dosopttemplate.data.home.HomeSealedItem import org.sopt.dosopttemplate.databinding.ItemCarouselBinding +import org.sopt.dosopttemplate.ui.model.HomeSealedItem class CarouselHeroAdapter(context: Context) : ListAdapter(diffUtil) { diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselUserAdapter.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselUserAdapter.kt index fefe249..2e2fbc2 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselUserAdapter.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselUserAdapter.kt @@ -7,8 +7,8 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide +import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseReqresDto import org.sopt.dosopttemplate.databinding.ItemCarouselIntroduceBinding -import org.sopt.dosopttemplate.network.doandroid.ResponseReqresDto class CarouselUserAdapter(context: Context) : ListAdapter(diffUtil) { diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/home/HomeFragment.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/home/HomeFragment.kt index 7ceab6d..d6a2c2b 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/home/HomeFragment.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/home/HomeFragment.kt @@ -7,9 +7,9 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import org.sopt.dosopttemplate.data.home.HomeSealedItem import org.sopt.dosopttemplate.databinding.FragmentHomeBinding import org.sopt.dosopttemplate.ui.home.adapter.HomeMainAdapter +import org.sopt.dosopttemplate.ui.model.HomeSealedItem import java.time.LocalDate class HomeFragment : Fragment() { diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/home/HomeViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/home/HomeViewModel.kt index bfd03d5..df58546 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/home/HomeViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/home/HomeViewModel.kt @@ -2,8 +2,8 @@ package org.sopt.dosopttemplate.ui.home import androidx.lifecycle.ViewModel import org.sopt.dosopttemplate.R -import org.sopt.dosopttemplate.data.home.HomeSealedItem -import org.sopt.dosopttemplate.data.user.UserInfo +import org.sopt.dosopttemplate.ui.model.HomeSealedItem +import org.sopt.dosopttemplate.ui.model.UserInfo class HomeViewModel : ViewModel() { diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/HomeDiffCallBack.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/HomeDiffCallBack.kt index 2fc6fc1..804ed2f 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/HomeDiffCallBack.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/HomeDiffCallBack.kt @@ -1,7 +1,7 @@ package org.sopt.dosopttemplate.ui.home.adapter import androidx.recyclerview.widget.DiffUtil -import org.sopt.dosopttemplate.data.home.HomeSealedItem +import org.sopt.dosopttemplate.ui.model.HomeSealedItem object HomeDiffCallBack : DiffUtil.ItemCallback() { diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/HomeMainAdapter.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/HomeMainAdapter.kt index 605fba3..5f76373 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/HomeMainAdapter.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/HomeMainAdapter.kt @@ -6,7 +6,6 @@ import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ViewHolder -import org.sopt.dosopttemplate.data.home.HomeSealedItem import org.sopt.dosopttemplate.databinding.ItemBirthdayBinding import org.sopt.dosopttemplate.databinding.ItemFriendBinding import org.sopt.dosopttemplate.databinding.ItemMyProfileBinding @@ -15,6 +14,7 @@ import org.sopt.dosopttemplate.ui.home.adapter.viewholder.BirthdayViewHolder import org.sopt.dosopttemplate.ui.home.adapter.viewholder.FriendViewHolder import org.sopt.dosopttemplate.ui.home.adapter.viewholder.ProfileViewHolder import org.sopt.dosopttemplate.ui.home.adapter.viewholder.TitleLineViewHolder +import org.sopt.dosopttemplate.ui.model.HomeSealedItem import java.lang.IllegalArgumentException class HomeMainAdapter(context: Context) : diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/BirthdayViewHolder.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/BirthdayViewHolder.kt index 2b25b85..a7a7879 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/BirthdayViewHolder.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/BirthdayViewHolder.kt @@ -3,8 +3,8 @@ package org.sopt.dosopttemplate.ui.home.adapter.viewholder import DateUtils import android.view.View import androidx.recyclerview.widget.RecyclerView -import org.sopt.dosopttemplate.data.home.HomeSealedItem import org.sopt.dosopttemplate.databinding.ItemBirthdayBinding +import org.sopt.dosopttemplate.ui.model.HomeSealedItem import java.time.LocalDate import java.time.format.DateTimeFormatter diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/FriendViewHolder.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/FriendViewHolder.kt index 812b44d..f616ddd 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/FriendViewHolder.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/FriendViewHolder.kt @@ -2,8 +2,8 @@ package org.sopt.dosopttemplate.ui.home.adapter.viewholder import android.view.View import androidx.recyclerview.widget.RecyclerView -import org.sopt.dosopttemplate.data.home.HomeSealedItem import org.sopt.dosopttemplate.databinding.ItemFriendBinding +import org.sopt.dosopttemplate.ui.model.HomeSealedItem class FriendViewHolder(private val binding: ItemFriendBinding) : RecyclerView.ViewHolder(binding.root) { diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/ProfileViewHolder.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/ProfileViewHolder.kt index a60c603..fab2ba3 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/ProfileViewHolder.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/ProfileViewHolder.kt @@ -1,8 +1,8 @@ package org.sopt.dosopttemplate.ui.home.adapter.viewholder import androidx.recyclerview.widget.RecyclerView -import org.sopt.dosopttemplate.data.home.HomeSealedItem import org.sopt.dosopttemplate.databinding.ItemMyProfileBinding +import org.sopt.dosopttemplate.ui.model.HomeSealedItem class ProfileViewHolder(private val binding: ItemMyProfileBinding) : RecyclerView.ViewHolder(binding.root) { diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/TitleLineViewHolder.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/TitleLineViewHolder.kt index 4c54ea5..10ce673 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/TitleLineViewHolder.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/home/adapter/viewholder/TitleLineViewHolder.kt @@ -1,8 +1,8 @@ package org.sopt.dosopttemplate.ui.home.adapter.viewholder import androidx.recyclerview.widget.RecyclerView -import org.sopt.dosopttemplate.data.home.HomeSealedItem import org.sopt.dosopttemplate.databinding.ItemTitleLineBinding +import org.sopt.dosopttemplate.ui.model.HomeSealedItem class TitleLineViewHolder(private val binding: ItemTitleLineBinding) : RecyclerView.ViewHolder(binding.root) { diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt index 27e9041..067c2d0 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt @@ -9,9 +9,9 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import org.sopt.dosopttemplate.data.user.UserInfo -import org.sopt.dosopttemplate.network.ApiFactory.ServicePool.authService -import org.sopt.dosopttemplate.network.login.RequestLoginDto +import org.sopt.dosopttemplate.data.ApiFactory.ServicePool.authService +import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto +import org.sopt.dosopttemplate.ui.model.UserInfo class AuthViewModel : ViewModel() { private val _loginState = MutableStateFlow(LoginState.Loading) diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginState.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginState.kt index 52f16e7..ee25dca 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginState.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginState.kt @@ -1,6 +1,6 @@ package org.sopt.dosopttemplate.ui.login -import org.sopt.dosopttemplate.network.login.ResponseLoginDto +import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseLoginDto sealed class LoginState { object Loading : LoginState() diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt index 0d1cb71..baab88d 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt @@ -9,8 +9,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.launch import org.sopt.dosopttemplate.R -import org.sopt.dosopttemplate.data.login.User import org.sopt.dosopttemplate.databinding.ActivitySignUpBinding +import org.sopt.dosopttemplate.ui.model.User import org.sopt.dosopttemplate.utils.toast class SignUpActivity : AppCompatActivity() { diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt index 5cf63be..babe6c8 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt @@ -9,9 +9,9 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import org.sopt.dosopttemplate.data.login.User -import org.sopt.dosopttemplate.network.ApiFactory.ServicePool.authService -import org.sopt.dosopttemplate.network.login.RequestSignUpDto +import org.sopt.dosopttemplate.data.ApiFactory.ServicePool.authService +import org.sopt.dosopttemplate.data.dto.remote.request.RequestSignUpDto +import org.sopt.dosopttemplate.ui.model.User class SignUpViewModel : ViewModel() { private val _signUpState = MutableStateFlow(SignUpState.Loading) diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/home/HomeSealedItem.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/model/HomeSealedItem.kt similarity index 93% rename from app/src/main/java/org/sopt/dosopttemplate/data/home/HomeSealedItem.kt rename to app/src/main/java/org/sopt/dosopttemplate/ui/model/HomeSealedItem.kt index ca599e1..3b0bb34 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/home/HomeSealedItem.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/model/HomeSealedItem.kt @@ -1,4 +1,4 @@ -package org.sopt.dosopttemplate.data.home +package org.sopt.dosopttemplate.ui.model import androidx.annotation.DrawableRes diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/login/User.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/model/User.kt similarity index 82% rename from app/src/main/java/org/sopt/dosopttemplate/data/login/User.kt rename to app/src/main/java/org/sopt/dosopttemplate/ui/model/User.kt index 58fe7f4..8caf806 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/login/User.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/model/User.kt @@ -1,4 +1,4 @@ -package org.sopt.dosopttemplate.data.login +package org.sopt.dosopttemplate.ui.model import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/user/UserInfo.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/model/UserInfo.kt similarity index 82% rename from app/src/main/java/org/sopt/dosopttemplate/data/user/UserInfo.kt rename to app/src/main/java/org/sopt/dosopttemplate/ui/model/UserInfo.kt index 8f31944..826da2b 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/user/UserInfo.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/model/UserInfo.kt @@ -1,6 +1,4 @@ -package org.sopt.dosopttemplate.data.user - -import org.sopt.dosopttemplate.data.login.User +package org.sopt.dosopttemplate.ui.model object UserInfo { var userInfoList = User( diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/mypage/MyPageFragment.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/mypage/MyPageFragment.kt index 2bc57d1..0d90924 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/mypage/MyPageFragment.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/mypage/MyPageFragment.kt @@ -5,8 +5,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import org.sopt.dosopttemplate.data.user.UserInfo import org.sopt.dosopttemplate.databinding.FragmentMyPageBinding +import org.sopt.dosopttemplate.ui.model.UserInfo class MyPageFragment : Fragment() { From 2a2405156f7f2076892858321fdb5d464f8726e4 Mon Sep 17 00:00:00 2001 From: chanu Date: Sun, 31 Dec 2023 02:19:18 +0900 Subject: [PATCH 04/36] =?UTF-8?q?[add]=20:=20ReqresDataSource=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20data-datasource?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/ReqresDataSource.kt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/ReqresDataSource.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/ReqresDataSource.kt b/app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/ReqresDataSource.kt new file mode 100644 index 0000000..944e2d1 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/ReqresDataSource.kt @@ -0,0 +1,7 @@ +package org.sopt.dosopttemplate.data.datasource.remote + +import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseReqresDto + +interface ReqresDataSource { + suspend fun getReqresList(page: Int): ResponseReqresDto +} From de07656900485027108e8d2945a1cd7b3172b300 Mon Sep 17 00:00:00 2001 From: chanu Date: Sun, 31 Dec 2023 02:20:23 +0900 Subject: [PATCH 05/36] =?UTF-8?q?[add]=20:=20ReqresDataSourceImpl=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=20[da?= =?UTF-8?q?ta-datasourceimpl-remote]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasourceimpl/remote/ReqresDataSourceImpl.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/ReqresDataSourceImpl.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/ReqresDataSourceImpl.kt b/app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/ReqresDataSourceImpl.kt new file mode 100644 index 0000000..a3f6927 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/ReqresDataSourceImpl.kt @@ -0,0 +1,13 @@ +package org.sopt.dosopttemplate.data.datasourceimpl.remote + +import org.sopt.dosopttemplate.data.datasource.remote.ReqresDataSource +import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseReqresDto +import org.sopt.dosopttemplate.data.service.ReqresService + +class ReqresDataSourceImpl( + private val reqresService: ReqresService, +) : ReqresDataSource { + override suspend fun getReqresList(page: Int): ResponseReqresDto { + return reqresService.getUserList(page) + } +} From 4941b93861a9194ee674dd21b422723497c6ab4e Mon Sep 17 00:00:00 2001 From: chanu Date: Sun, 31 Dec 2023 02:20:54 +0900 Subject: [PATCH 06/36] =?UTF-8?q?[fix]=20:=20ReqresService=20suspend=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EB=B3=80=EA=B2=BD,=20return=20type=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/dosopttemplate/data/service/ReqresService.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/service/ReqresService.kt b/app/src/main/java/org/sopt/dosopttemplate/data/service/ReqresService.kt index 25a78c6..2dc6283 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/service/ReqresService.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/service/ReqresService.kt @@ -1,13 +1,12 @@ package org.sopt.dosopttemplate.data.service import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseReqresDto -import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Query interface ReqresService { @GET("api/users") - fun getUserList( + suspend fun getUserList( @Query("page") page: Int, - ): Call + ): ResponseReqresDto } From 84594ed94dcdfb5eac0279b3f4589c2ebce0a907 Mon Sep 17 00:00:00 2001 From: chanu Date: Sun, 31 Dec 2023 02:21:58 +0900 Subject: [PATCH 07/36] =?UTF-8?q?[add]=20:=20Reqres=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=98=81=EC=97=AD=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/dosopttemplate/domain/entity/ReqresEntity.kt | 9 +++++++++ .../dosopttemplate/domain/repository/ReqresRepository.kt | 7 +++++++ 2 files changed, 16 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/domain/entity/ReqresEntity.kt create mode 100644 app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/domain/entity/ReqresEntity.kt b/app/src/main/java/org/sopt/dosopttemplate/domain/entity/ReqresEntity.kt new file mode 100644 index 0000000..75cbb2f --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/domain/entity/ReqresEntity.kt @@ -0,0 +1,9 @@ +package org.sopt.dosopttemplate.domain.entity + +data class ReqresEntity( + val id: Int, + val avatar: String, + val email: String, + val first_name: String, + val last_name: String, +) diff --git a/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt b/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt new file mode 100644 index 0000000..3ad25b4 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt @@ -0,0 +1,7 @@ +package org.sopt.dosopttemplate.domain.repository + +import org.sopt.dosopttemplate.domain.entity.ReqresEntity + +interface ReqresRepository { + suspend fun getReqresList(page: Int): Result> +} From 66c0e58fcc61734e38ad9a75c1e1bf505afabc46 Mon Sep 17 00:00:00 2001 From: chanu Date: Sun, 31 Dec 2023 15:21:13 +0900 Subject: [PATCH 08/36] =?UTF-8?q?[add]=20:=20util=20UiState=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/dosopttemplate/utils/UiState.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/utils/UiState.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/utils/UiState.kt b/app/src/main/java/org/sopt/dosopttemplate/utils/UiState.kt new file mode 100644 index 0000000..61585e4 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/utils/UiState.kt @@ -0,0 +1,12 @@ +package org.sopt.dosopttemplate.utils + +sealed interface UiState { + + object Loading : UiState + + data class Success( + val data: T, + ) : UiState + + object Error : UiState +} From 68de139e8c40915432d64fc9d7b7c3a56f39b58c Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 04:48:36 +0900 Subject: [PATCH 09/36] =?UTF-8?q?[fix]=20:=20uistate=20Success=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EC=A0=9C=EB=84=88=EB=A6=AD=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/sopt/dosopttemplate/utils/UiState.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/utils/UiState.kt b/app/src/main/java/org/sopt/dosopttemplate/utils/UiState.kt index 61585e4..84c26d0 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/utils/UiState.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/utils/UiState.kt @@ -6,7 +6,7 @@ sealed interface UiState { data class Success( val data: T, - ) : UiState + ) : UiState object Error : UiState } From f11a2f1b7d0f58361c6c688c0444fc309f7e4658 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 04:52:06 +0900 Subject: [PATCH 10/36] =?UTF-8?q?[add]=20:=20AuthRepository=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repositoryimpl/AuthRepository.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepository.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepository.kt b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepository.kt new file mode 100644 index 0000000..638c734 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepository.kt @@ -0,0 +1,17 @@ +package org.sopt.dosopttemplate.data.repositoryimpl + +import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto +import org.sopt.dosopttemplate.data.dto.remote.request.RequestSignUpDto +import org.sopt.dosopttemplate.data.service.AuthService + +class AuthRepository(private val authService: AuthService) { + suspend fun postLogin(user: RequestLoginDto) = + kotlin.runCatching { + authService.postLogin(user) + } + + suspend fun postSignUp(signUpInfo: RequestSignUpDto) = + kotlin.runCatching { + authService.postSignUp(signUpInfo) + } +} From 4926d4065c8b6faaa19c4d269db4db3308a50bf2 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 04:52:42 +0900 Subject: [PATCH 11/36] =?UTF-8?q?[add]=20:=20ReqresRepository=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(=EC=B6=94=ED=9B=84=EC=97=90=20impl=EB=A1=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repositoryimpl/ReqresRepositoryImpl.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt new file mode 100644 index 0000000..5331d8e --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt @@ -0,0 +1,15 @@ +package org.sopt.dosopttemplate.data.repositoryimpl + +import org.sopt.dosopttemplate.data.service.ReqresService +import org.sopt.dosopttemplate.domain.entity.ReqresEntity +import org.sopt.dosopttemplate.domain.repository.ReqresRepository + +// 외부 데이터 소스(ReqresDataSource)로부터 데이터를 가져오고, 필요한 형태로 변환하여 비즈니스 로직 계층에게 제공 +class ReqresRepositoryImpl constructor(private val reqresService: ReqresService) : + ReqresRepository { + override suspend fun getReqresList(page: Int): Result> { + return runCatching { + reqresService.getUserList(page).toReqresList() + } + } +} From d95815f8351b0908ed7ed7e60bed7541014058b2 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 04:53:14 +0900 Subject: [PATCH 12/36] =?UTF-8?q?[feat]=20:=20ResponseReqresDto=20mapping?= =?UTF-8?q?=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/dto/remote/respose/ResponseReqresDto.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseReqresDto.kt b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseReqresDto.kt index 48b8557..d48f6dd 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseReqresDto.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseReqresDto.kt @@ -1,6 +1,7 @@ package org.sopt.dosopttemplate.data.dto.remote.respose import kotlinx.serialization.Serializable +import org.sopt.dosopttemplate.domain.entity.ReqresEntity @Serializable data class ResponseReqresDto( @@ -25,4 +26,14 @@ data class ResponseReqresDto( val text: String, val url: String, ) + + fun toReqresList(): List = data.map { + ReqresEntity( + id = it.id, + email = it.email, + first_name = it.first_name, + last_name = it.last_name, + avatar = it.avatar, + ) + } } From 9cfbe125c0e63359bcf4e41050d1b291fbb6e7e9 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 04:54:18 +0900 Subject: [PATCH 13/36] =?UTF-8?q?[add]=20:=20Do=20Andorid=20Viewmodel=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/doandroid/DoAndroidViewModel.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidViewModel.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidViewModel.kt new file mode 100644 index 0000000..8eb232f --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidViewModel.kt @@ -0,0 +1,40 @@ +package org.sopt.dosopttemplate.ui.doandroid + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.sopt.dosopttemplate.domain.entity.ReqresEntity +import org.sopt.dosopttemplate.domain.repository.ReqresRepository +import org.sopt.dosopttemplate.utils.UiState + +class DoAndroidViewModel(val reqresRepository: ReqresRepository) : ViewModel() { + + private val _reqresUserState = MutableStateFlow>>(UiState.Loading) + val reqresUserState get() = _reqresUserState.asStateFlow() + + fun getReqresUserList(page: Int) { + viewModelScope.launch { + reqresRepository.getReqresList(page).onSuccess { + if (it.isNotEmpty()) { + val reqresUserList = it.map { entity -> + ReqresEntity( + id = entity.id, + avatar = entity.avatar, + email = entity.email, + first_name = entity.first_name, + last_name = entity.last_name, + ) + } + _reqresUserState.value = UiState.Success(reqresUserList) + } else { + Log.d("reqres", "비었음") + } + }.onFailure { + Log.d("reqres", it.message.toString()) + } + } + } +} From 8843f981ed8e74daac6c001d0c306558293fbde7 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 04:56:07 +0900 Subject: [PATCH 14/36] =?UTF-8?q?[fix]=20:=20Auth,=20SignUp=20Viewmodel=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=88=98=EB=8F=99=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85,=20=EC=84=9C=EB=B2=84=20=ED=86=B5=EC=8B=A0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dosopttemplate/ui/login/AuthViewModel.kt | 39 +++++++++---------- .../ui/login/SignUpViewModel.kt | 31 +++++++-------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt index 067c2d0..9128ec8 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt @@ -9,11 +9,11 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import org.sopt.dosopttemplate.data.ApiFactory.ServicePool.authService import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto +import org.sopt.dosopttemplate.data.repositoryimpl.AuthRepository import org.sopt.dosopttemplate.ui.model.UserInfo -class AuthViewModel : ViewModel() { +class AuthViewModel(private val authRepository: AuthRepository) : ViewModel() { private val _loginState = MutableStateFlow(LoginState.Loading) val loginState: StateFlow = _loginState.asStateFlow() @@ -23,26 +23,25 @@ class AuthViewModel : ViewModel() { fun login(id: String, password: String) { viewModelScope.launch { - kotlin.runCatching { - authService.postLogin(RequestLoginDto(id, password)) - }.onSuccess { - if (it.isSuccessful) { - val response = it.body() - if (response != null) { - _loginState.value = LoginState.Success(response) - Log.d("server", _loginState.value.toString()) - UserInfo.updateUserInfo( - id = response.id.toString(), - nickName = response.nickname.toString(), - ) + authRepository.postLogin(RequestLoginDto(id, password)) + .onSuccess { + if (it.isSuccessful) { + val response = it.body() + if (response != null) { + _loginState.value = LoginState.Success(response) + Log.d("server", _loginState.value.toString()) + UserInfo.updateUserInfo( + id = response.id.toString(), + nickName = response.nickname.toString(), + ) + } + } else { + _loginState.value = LoginState.Error + Log.d("server", it.code().toString()) } - } else { - _loginState.value = LoginState.Error - Log.d("server", it.code().toString()) + }.onFailure { + Log.d("server", it.message.toString()) } - }.onFailure { - Log.d("server", it.message.toString()) - } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt index babe6c8..bbac1ec 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt @@ -9,13 +9,14 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import org.sopt.dosopttemplate.data.ApiFactory.ServicePool.authService import org.sopt.dosopttemplate.data.dto.remote.request.RequestSignUpDto +import org.sopt.dosopttemplate.data.repositoryimpl.AuthRepository import org.sopt.dosopttemplate.ui.model.User +import org.sopt.dosopttemplate.utils.UiState -class SignUpViewModel : ViewModel() { - private val _signUpState = MutableStateFlow(SignUpState.Loading) - val signUpState: StateFlow = _signUpState.asStateFlow() +class SignUpViewModel(private val authRepository: AuthRepository) : ViewModel() { + private val _signUpState = MutableStateFlow>(UiState.Loading) + val signUpState: StateFlow> = _signUpState.asStateFlow() private val id = MutableLiveData() private val password = MutableLiveData() @@ -103,21 +104,19 @@ class SignUpViewModel : ViewModel() { _isBtnSelected.value = isIdValid && isPasswordValid && isNickNameValid && isMbtiValid } - fun signUpServer(userEntity: User) { + fun postSignUp(userEntity: User) { viewModelScope.launch { - kotlin.runCatching { - authService.postSignUp( - RequestSignUpDto( - userEntity.id, - userEntity.pwd, - userEntity.nickName, - ), - ) - }.onSuccess { + authRepository.postSignUp( + RequestSignUpDto( + userEntity.id, + userEntity.pwd, + userEntity.nickName, + ), + ).onSuccess { if (it.isSuccessful) { - _signUpState.value = SignUpState.Success + _signUpState.value = UiState.Success(userEntity) } else { - _signUpState.value = SignUpState.Error + _signUpState.value = UiState.Error } }.onFailure { Log.e("SignUpActivity", "Error: ${it.message}") From 494c87f442f3f2515f5ca263ba3b3e5b62479608 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 04:57:14 +0900 Subject: [PATCH 15/36] =?UTF-8?q?[feat]=20:=20domain=20=EC=98=81=EC=97=AD?= =?UTF-8?q?=20ReqresRepository=20=EC=B6=94=EA=B0=80(=ED=98=84=EC=9E=AC?= =?UTF-8?q?=EB=8A=94=20=EC=9D=98=EB=AF=B8=20=EC=97=86=EC=9D=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/dosopttemplate/domain/repository/ReqresRepository.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt b/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt index 3ad25b4..99cca5e 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt @@ -2,6 +2,8 @@ package org.sopt.dosopttemplate.domain.repository import org.sopt.dosopttemplate.domain.entity.ReqresEntity +/*ReqresRepository 인터페이스는 도메인(Domain) 레이어에서 사용되며, +원격 데이터 소스(ReqresDataSource)로부터 Reqres 사용자 리스트를 가져오는 기능을 정의*/ interface ReqresRepository { suspend fun getReqresList(page: Int): Result> } From 2ba0067f66712891d7f62c726541286936a6201e Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 05:00:07 +0900 Subject: [PATCH 16/36] =?UTF-8?q?[fix]=20:=20adpater=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=98=81=EC=97=AD=20entity=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doandroid/adapter/CarouselUserAdapter.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselUserAdapter.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselUserAdapter.kt index 2e2fbc2..3072083 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselUserAdapter.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/adapter/CarouselUserAdapter.kt @@ -7,16 +7,16 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide -import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseReqresDto import org.sopt.dosopttemplate.databinding.ItemCarouselIntroduceBinding +import org.sopt.dosopttemplate.domain.entity.ReqresEntity class CarouselUserAdapter(context: Context) : - ListAdapter(diffUtil) { + ListAdapter(diffUtil) { private val inflater by lazy { LayoutInflater.from(context) } inner class CarouseViewHolder(private val binding: ItemCarouselIntroduceBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(data: ResponseReqresDto.Data) { + fun bind(data: ReqresEntity) { Glide.with(itemView) .load(data.avatar) .into(binding.imgCarousel) @@ -36,23 +36,23 @@ class CarouselUserAdapter(context: Context) : override fun getItemCount() = currentList.size // submitList 사용 - fun setCarouselList(imgList: List) { + fun setCarouselList(imgList: List) { submitList(imgList.toMutableList()) } // diffUtill callback companion object { - private var diffUtil = object : DiffUtil.ItemCallback() { + private var diffUtil = object : DiffUtil.ItemCallback() { override fun areItemsTheSame( - oldItem: ResponseReqresDto.Data, - newItem: ResponseReqresDto.Data, + oldItem: ReqresEntity, + newItem: ReqresEntity, ): Boolean { return oldItem.id == newItem.id } override fun areContentsTheSame( - oldItem: ResponseReqresDto.Data, - newItem: ResponseReqresDto.Data, + oldItem: ReqresEntity, + newItem: ReqresEntity, ): Boolean { return oldItem == newItem } From ddef6cbd47482557a1549eb7a4444f5bef915a65 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 05:02:06 +0900 Subject: [PATCH 17/36] =?UTF-8?q?[feat]=20:=20DoAndroidFragment=20?= =?UTF-8?q?=EC=84=9C=EB=B2=84=ED=86=B5=EC=8B=A0=20ui=20state=20=EA=B4=80?= =?UTF-8?q?=EC=B0=B0,=20ViewModelFactory=EB=A5=BC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=97=AC=20DoAndroidViewModel=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/doandroid/DoAndroidFragment.kt | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidFragment.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidFragment.kt index 241f0bc..772b021 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidFragment.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidFragment.kt @@ -1,30 +1,33 @@ package org.sopt.dosopttemplate.ui.doandroid import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope import com.google.android.material.carousel.CarouselLayoutManager import com.google.android.material.carousel.CarouselSnapHelper import com.google.android.material.carousel.HeroCarouselStrategy +import kotlinx.coroutines.launch import org.sopt.dosopttemplate.databinding.FragmentDoAndroidBinding -import org.sopt.dosopttemplate.network.doandroid.ResponseReqresDto -import org.sopt.dosopttemplate.network.reqresApiFactory.ServicePool.reqresService import org.sopt.dosopttemplate.ui.doandroid.adapter.CarouselHeroAdapter import org.sopt.dosopttemplate.ui.doandroid.adapter.CarouselUserAdapter import org.sopt.dosopttemplate.ui.home.HomeViewModel -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import org.sopt.dosopttemplate.utils.UiState +import org.sopt.dosopttemplate.utils.ViewModelFactory class DoAndroidFragment : Fragment() { private var _binding: FragmentDoAndroidBinding? = null private val viewModel by viewModels() + private val doAndroidViewModel: DoAndroidViewModel by viewModels { + ViewModelFactory() + } + private lateinit var carouselOriginalAdapter: CarouselUserAdapter private val binding: FragmentDoAndroidBinding @@ -48,26 +51,23 @@ class DoAndroidFragment : Fragment() { } private fun initUserApi() { - reqresService.getUserList(1).enqueue(object : Callback { - override fun onResponse( - call: Call, - response: Response, - ) { - if (response.isSuccessful) { - val data = response.body() ?: return - - data.let { - carouselOriginalAdapter.setCarouselList(it.data) + doAndroidViewModel.getReqresUserList(1) + lifecycleScope.launch { + doAndroidViewModel.reqresUserState.collect { + when (it) { + is UiState.Success -> { + val reqresData = it.data + carouselOriginalAdapter.setCarouselList(reqresData) } - } else { - Log.d("userlist", "fail") - } - } - override fun onFailure(call: Call, t: Throwable) { - Log.e("doandroid", "Error: ${t.message}") + is UiState.Error -> { + Toast.makeText(requireContext(), "서버 연결실패", Toast.LENGTH_SHORT).show() + } + + is UiState.Loading -> {} + } } - }) + } } private fun initHeroCarousel() = with(binding) { From 4f792d5f6b7f5cda9a4a1c836a9434651666d4ce Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 05:02:32 +0900 Subject: [PATCH 18/36] =?UTF-8?q?[feat]=20:=20=EC=84=9C=EB=B2=84=ED=86=B5?= =?UTF-8?q?=EC=8B=A0=20ui=20state=20=EA=B4=80=EC=B0=B0,=20ViewModelFactory?= =?UTF-8?q?=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=97=AC=20viewmodel=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/dosopttemplate/ui/login/LoginActivity.kt | 5 ++++- .../sopt/dosopttemplate/ui/login/SignUpActivity.kt | 14 +++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt index 7fe175d..f9475c9 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt @@ -8,12 +8,15 @@ import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.launch import org.sopt.dosopttemplate.databinding.ActivityLoginBinding import org.sopt.dosopttemplate.ui.HomeActivity +import org.sopt.dosopttemplate.utils.ViewModelFactory import org.sopt.dosopttemplate.utils.toast class LoginActivity : AppCompatActivity() { private lateinit var binding: ActivityLoginBinding - private val authViewModel by viewModels() + private val authViewModel by viewModels() { + ViewModelFactory() + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt index baab88d..24208ba 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt @@ -11,12 +11,16 @@ import kotlinx.coroutines.launch import org.sopt.dosopttemplate.R import org.sopt.dosopttemplate.databinding.ActivitySignUpBinding import org.sopt.dosopttemplate.ui.model.User +import org.sopt.dosopttemplate.utils.UiState +import org.sopt.dosopttemplate.utils.ViewModelFactory import org.sopt.dosopttemplate.utils.toast class SignUpActivity : AppCompatActivity() { private lateinit var binding: ActivitySignUpBinding - private val viewModel by viewModels() + private val viewModel by viewModels() { + ViewModelFactory() + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -41,7 +45,7 @@ class SignUpActivity : AppCompatActivity() { nickName = binding.editNickname.text.toString(), mbti = binding.editMbti.text.toString(), ) - viewModel.signUpServer(userEntity) + viewModel.postSignUp(userEntity) observeSignUpState(userEntity) } } @@ -50,13 +54,13 @@ class SignUpActivity : AppCompatActivity() { lifecycleScope.launch { viewModel.signUpState.collect { when (it) { - is SignUpState.Success -> { + is UiState.Success -> { sendUserData(userEntity) toast(getString(R.string.toast_signUp_compeleted)) } - is SignUpState.Error -> toast(getString(R.string.toast_signUp_fail)) - is SignUpState.Loading -> toast("회원가입 중") + is UiState.Error -> toast(getString(R.string.toast_signUp_fail)) + is UiState.Loading -> toast("회원가입 중") } } } From 28064d4ca4a07fcb924c2f0b25ef843b8527b0fb Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 05:03:46 +0900 Subject: [PATCH 19/36] =?UTF-8?q?[feat]=20:=20ViewModelFactory=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dosopttemplate/utils/ViewModelFactory.kt | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt b/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt new file mode 100644 index 0000000..9f38a11 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt @@ -0,0 +1,35 @@ +package org.sopt.dosopttemplate.utils + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import org.sopt.dosopttemplate.data.ApiFactory +import org.sopt.dosopttemplate.data.repositoryimpl.AuthRepository +import org.sopt.dosopttemplate.data.repositoryimpl.ReqresRepositoryImpl +import org.sopt.dosopttemplate.ui.doandroid.DoAndroidViewModel +import org.sopt.dosopttemplate.ui.login.AuthViewModel +import org.sopt.dosopttemplate.ui.login.SignUpViewModel + +class ViewModelFactory : + ViewModelProvider.Factory { + + override fun create(modelClass: Class): T { + return when { + modelClass.isAssignableFrom(AuthViewModel::class.java) -> { + val repository = AuthRepository(ApiFactory.ServicePool.authService) + AuthViewModel(repository) as T + } + + modelClass.isAssignableFrom(SignUpViewModel::class.java) -> { + val repository = AuthRepository(ApiFactory.ServicePool.authService) + SignUpViewModel(repository) as T + } + + modelClass.isAssignableFrom(DoAndroidViewModel::class.java) -> { + val repository = ReqresRepositoryImpl(ApiFactory.ServicePool.userService) + DoAndroidViewModel(repository) as T + } + // Add more ViewModel cases as needed + else -> throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}") + } + } +} From 5e83aedaf93bbcbe1e5d3e27adcb7a439e196798 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 05:10:40 +0900 Subject: [PATCH 20/36] =?UTF-8?q?[fix]=20:=20uistate=20util=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/dosopttemplate/ui/login/AuthViewModel.kt | 10 ++++++---- .../org/sopt/dosopttemplate/ui/login/LoginState.kt | 9 --------- .../org/sopt/dosopttemplate/ui/login/SignUpActivity.kt | 2 +- .../org/sopt/dosopttemplate/ui/login/SignUpState.kt | 7 ------- 4 files changed, 7 insertions(+), 21 deletions(-) delete mode 100644 app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginState.kt delete mode 100644 app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpState.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt index 9128ec8..d01834c 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt @@ -10,12 +10,14 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto +import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseLoginDto import org.sopt.dosopttemplate.data.repositoryimpl.AuthRepository import org.sopt.dosopttemplate.ui.model.UserInfo +import org.sopt.dosopttemplate.utils.UiState class AuthViewModel(private val authRepository: AuthRepository) : ViewModel() { - private val _loginState = MutableStateFlow(LoginState.Loading) - val loginState: StateFlow = _loginState.asStateFlow() + private val _loginState = MutableStateFlow>(UiState.Loading) + val loginState: StateFlow> get() = _loginState.asStateFlow() private val _isLoginButtonClicked: MutableLiveData = MutableLiveData(false) val isLoginButtonClicked: LiveData @@ -28,7 +30,7 @@ class AuthViewModel(private val authRepository: AuthRepository) : ViewModel() { if (it.isSuccessful) { val response = it.body() if (response != null) { - _loginState.value = LoginState.Success(response) + _loginState.value = UiState.Success(response) Log.d("server", _loginState.value.toString()) UserInfo.updateUserInfo( id = response.id.toString(), @@ -36,7 +38,7 @@ class AuthViewModel(private val authRepository: AuthRepository) : ViewModel() { ) } } else { - _loginState.value = LoginState.Error + _loginState.value = UiState.Error Log.d("server", it.code().toString()) } }.onFailure { diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginState.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginState.kt deleted file mode 100644 index ee25dca..0000000 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginState.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.sopt.dosopttemplate.ui.login - -import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseLoginDto - -sealed class LoginState { - object Loading : LoginState() - data class Success(val data: ResponseLoginDto) : LoginState() - object Error : LoginState() -} diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt index 24208ba..16ce88a 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt @@ -60,7 +60,7 @@ class SignUpActivity : AppCompatActivity() { } is UiState.Error -> toast(getString(R.string.toast_signUp_fail)) - is UiState.Loading -> toast("회원가입 중") + is UiState.Loading -> {} } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpState.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpState.kt deleted file mode 100644 index 6cfeff8..0000000 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpState.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.sopt.dosopttemplate.ui.login - -sealed class SignUpState { - object Loading : SignUpState() - object Success : SignUpState() - object Error : SignUpState() -} From 1ca2f3ac65d8b0f5e335efec906b8eb506de6210 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 05:11:10 +0900 Subject: [PATCH 21/36] =?UTF-8?q?[chore]=20:=20pareclize=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e14663b..d9f76bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.plugin.serialization' version '1.8.20' + id 'kotlin-parcelize' } Properties properties = new Properties() @@ -45,8 +46,6 @@ android { } dependencies { - // parcelize - apply plugin: 'kotlin-parcelize' // viewmodel 의존성 추가 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2" From 81a13ee4af115556d07c1d48ae3cd36413a8605e Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 06:45:44 +0900 Subject: [PATCH 22/36] =?UTF-8?q?[chore]=20:=20toast=20=EB=A7=A4=EC=84=B8?= =?UTF-8?q?=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/dosopttemplate/ui/doandroid/DoAndroidFragment.kt | 6 +++++- .../java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidFragment.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidFragment.kt index 772b021..773d630 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidFragment.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidFragment.kt @@ -64,7 +64,11 @@ class DoAndroidFragment : Fragment() { Toast.makeText(requireContext(), "서버 연결실패", Toast.LENGTH_SHORT).show() } - is UiState.Loading -> {} + is UiState.Loading -> Toast.makeText( + requireContext(), + "로딩 중", + Toast.LENGTH_SHORT, + ).show() } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt index f9475c9..e97a140 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.launch import org.sopt.dosopttemplate.databinding.ActivityLoginBinding import org.sopt.dosopttemplate.ui.HomeActivity +import org.sopt.dosopttemplate.utils.UiState import org.sopt.dosopttemplate.utils.ViewModelFactory import org.sopt.dosopttemplate.utils.toast @@ -57,13 +58,13 @@ class LoginActivity : AppCompatActivity() { lifecycleScope.launch { authViewModel.loginState.collect { loginState -> when (loginState) { - is LoginState.Success -> { + is UiState.Success -> { toast("로그인 성공") startActivity(Intent(this@LoginActivity, HomeActivity::class.java)) } - is LoginState.Error -> toast("로그인 실패") - is LoginState.Loading -> toast("로그인 중") + is UiState.Error -> toast("로그인 실패") + is UiState.Loading -> {} } } } From b6b52122592a9b6f15b9ff430652f37ef2438997 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 06:46:14 +0900 Subject: [PATCH 23/36] =?UTF-8?q?[chore]=20:=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dosopttemplate/data/datasource/remote/ReqresDataSource.kt | 1 + .../data/datasourceimpl/remote/ReqresDataSourceImpl.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/ReqresDataSource.kt b/app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/ReqresDataSource.kt index 944e2d1..e721d03 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/ReqresDataSource.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/ReqresDataSource.kt @@ -2,6 +2,7 @@ package org.sopt.dosopttemplate.data.datasource.remote import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseReqresDto +// 레포지터리 인터페이스, 데이터 접근을 추상화, 데이터를 요청하는 코드를 부름 interface ReqresDataSource { suspend fun getReqresList(page: Int): ResponseReqresDto } diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/ReqresDataSourceImpl.kt b/app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/ReqresDataSourceImpl.kt index a3f6927..267c737 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/ReqresDataSourceImpl.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/ReqresDataSourceImpl.kt @@ -4,6 +4,7 @@ import org.sopt.dosopttemplate.data.datasource.remote.ReqresDataSource import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseReqresDto import org.sopt.dosopttemplate.data.service.ReqresService +// 실제 데이터 소스를 구현하는 클래스, 네트워크 호출을 통해 데이터를 가져오는 역할 class ReqresDataSourceImpl( private val reqresService: ReqresService, ) : ReqresDataSource { From 24232f53383157b90d2fd835b3c70c034e8e1d33 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 06:46:46 +0900 Subject: [PATCH 24/36] =?UTF-8?q?[feat]=20:=20=EC=9D=98=EC=A1=B4=EC=84=B1?= =?UTF-8?q?=20=EC=88=98=EB=8F=99=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repositoryimpl/ReqresRepositoryImpl.kt | 6 +++--- .../java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt index 5331d8e..2ec8642 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt @@ -1,15 +1,15 @@ package org.sopt.dosopttemplate.data.repositoryimpl -import org.sopt.dosopttemplate.data.service.ReqresService +import org.sopt.dosopttemplate.data.datasource.remote.ReqresDataSource import org.sopt.dosopttemplate.domain.entity.ReqresEntity import org.sopt.dosopttemplate.domain.repository.ReqresRepository // 외부 데이터 소스(ReqresDataSource)로부터 데이터를 가져오고, 필요한 형태로 변환하여 비즈니스 로직 계층에게 제공 -class ReqresRepositoryImpl constructor(private val reqresService: ReqresService) : +class ReqresRepositoryImpl(private val reqresDataSource: ReqresDataSource) : ReqresRepository { override suspend fun getReqresList(page: Int): Result> { return runCatching { - reqresService.getUserList(page).toReqresList() + reqresDataSource.getReqresList(page).toReqresList() } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt b/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt index 9f38a11..a83f7dc 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt @@ -3,6 +3,7 @@ package org.sopt.dosopttemplate.utils import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import org.sopt.dosopttemplate.data.ApiFactory +import org.sopt.dosopttemplate.data.datasourceimpl.remote.ReqresDataSourceImpl import org.sopt.dosopttemplate.data.repositoryimpl.AuthRepository import org.sopt.dosopttemplate.data.repositoryimpl.ReqresRepositoryImpl import org.sopt.dosopttemplate.ui.doandroid.DoAndroidViewModel @@ -25,7 +26,8 @@ class ViewModelFactory : } modelClass.isAssignableFrom(DoAndroidViewModel::class.java) -> { - val repository = ReqresRepositoryImpl(ApiFactory.ServicePool.userService) + val repository = + ReqresRepositoryImpl(ReqresDataSourceImpl(ApiFactory.ServicePool.userService)) DoAndroidViewModel(repository) as T } // Add more ViewModel cases as needed From 2091a0bf067cecbf16f5e6db569c30d916a8570d Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 06:47:37 +0900 Subject: [PATCH 25/36] =?UTF-8?q?[chore]=20:=20di=20hilt=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=B8=8C=EB=9F=AC=EC=A7=80=20=EC=B6=94=EA=B0=80,=20?= =?UTF-8?q?=EC=9E=90=EB=B0=94=20=EB=B2=84=EC=A0=84=2017=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 15 +++++++++++---- build.gradle | 3 ++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d9f76bf..f8a2c40 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,8 @@ plugins { id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.plugin.serialization' version '1.8.20' id 'kotlin-parcelize' + id 'kotlin-kapt' + id 'com.google.dagger.hilt.android' } Properties properties = new Properties() @@ -31,21 +33,26 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = '11' + jvmTarget = '17' } buildFeatures { buildConfig true viewBinding true dataBinding true } - + // Allow references to generated code + kapt { + correctErrorTypes true + } } dependencies { + implementation "com.google.dagger:hilt-android:2.44" + kapt "com.google.dagger:hilt-compiler:2.44" // viewmodel 의존성 추가 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2" diff --git a/build.gradle b/build.gradle index fd3d478..205b53a 100644 --- a/build.gradle +++ b/build.gradle @@ -3,4 +3,5 @@ plugins { id 'com.android.application' version '8.0.2' apply false id 'com.android.library' version '8.0.2' apply false id 'org.jetbrains.kotlin.android' version '1.8.20' apply false -} \ No newline at end of file + id 'com.google.dagger.hilt.android' version '2.44' apply false +} From 04067128f596c3505610c1da7a8316b797b7d4f4 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 17:53:12 +0900 Subject: [PATCH 26/36] =?UTF-8?q?[add]=20:=20AuthDataSource=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/AuthDataSource.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/AuthDataSource.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/AuthDataSource.kt b/app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/AuthDataSource.kt new file mode 100644 index 0000000..70b848b --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/data/datasource/remote/AuthDataSource.kt @@ -0,0 +1,10 @@ +package org.sopt.dosopttemplate.data.datasource.remote + +import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto +import org.sopt.dosopttemplate.data.dto.remote.request.RequestSignUpDto +import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseLoginDto + +interface AuthDataSource { + suspend fun login(request: RequestLoginDto): ResponseLoginDto + suspend fun signUp(request: RequestSignUpDto): Unit +} From 305a3ac2b7838db95d4d41e3d168323a3081e8fc Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 17:53:23 +0900 Subject: [PATCH 27/36] =?UTF-8?q?[add]=20:=20AuthDomainRepository=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1,=20AuthDataSourceImpl=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/AuthDataSourceImpl.kt | 15 +++++++++ .../data/repositoryimpl/AuthRepository.kt | 17 ---------- .../data/repositoryimpl/AuthRepositoryImpl.kt | 31 +++++++++++++++++++ .../domain/repository/AuthDomainRepository.kt | 9 ++++++ 4 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/AuthDataSourceImpl.kt delete mode 100644 app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepository.kt create mode 100644 app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepositoryImpl.kt create mode 100644 app/src/main/java/org/sopt/dosopttemplate/domain/repository/AuthDomainRepository.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/AuthDataSourceImpl.kt b/app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/AuthDataSourceImpl.kt new file mode 100644 index 0000000..16fe254 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/data/datasourceimpl/remote/AuthDataSourceImpl.kt @@ -0,0 +1,15 @@ +package org.sopt.dosopttemplate.data.datasourceimpl.remote + +import org.sopt.dosopttemplate.data.datasource.remote.AuthDataSource +import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto +import org.sopt.dosopttemplate.data.dto.remote.request.RequestSignUpDto +import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseLoginDto +import org.sopt.dosopttemplate.data.service.AuthService + +class AuthDataSourceImpl(private val authService: AuthService) : AuthDataSource { + override suspend fun login(request: RequestLoginDto): ResponseLoginDto = + authService.postLogin(request) + + override suspend fun signUp(request: RequestSignUpDto): Unit = + authService.postSignUp(request) +} diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepository.kt b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepository.kt deleted file mode 100644 index 638c734..0000000 --- a/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepository.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.sopt.dosopttemplate.data.repositoryimpl - -import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto -import org.sopt.dosopttemplate.data.dto.remote.request.RequestSignUpDto -import org.sopt.dosopttemplate.data.service.AuthService - -class AuthRepository(private val authService: AuthService) { - suspend fun postLogin(user: RequestLoginDto) = - kotlin.runCatching { - authService.postLogin(user) - } - - suspend fun postSignUp(signUpInfo: RequestSignUpDto) = - kotlin.runCatching { - authService.postSignUp(signUpInfo) - } -} diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepositoryImpl.kt b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepositoryImpl.kt new file mode 100644 index 0000000..fc95198 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/AuthRepositoryImpl.kt @@ -0,0 +1,31 @@ +package org.sopt.dosopttemplate.data.repositoryimpl + +import org.sopt.dosopttemplate.data.datasource.remote.AuthDataSource +import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto +import org.sopt.dosopttemplate.data.dto.remote.request.RequestSignUpDto +import org.sopt.dosopttemplate.domain.entity.UserEntity +import org.sopt.dosopttemplate.domain.entity.UserRequestEntity +import org.sopt.dosopttemplate.domain.repository.AuthDomainRepository + +class AuthRepositoryImpl(private val authDataSource: AuthDataSource) : AuthDomainRepository { + override suspend fun login(userRequestEntity: UserRequestEntity): Result = + kotlin.runCatching { + authDataSource.login( + RequestLoginDto( + userRequestEntity.userName, + userRequestEntity.passWord, + ), + ).toUserEntity() + } + + override suspend fun signUp(userEntity: UserEntity): Result = + kotlin.runCatching { + authDataSource.signUp( + RequestSignUpDto( + userEntity.id, + userEntity.pwd, + userEntity.nickName, + ), + ) + } +} diff --git a/app/src/main/java/org/sopt/dosopttemplate/domain/repository/AuthDomainRepository.kt b/app/src/main/java/org/sopt/dosopttemplate/domain/repository/AuthDomainRepository.kt new file mode 100644 index 0000000..f1977c4 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/domain/repository/AuthDomainRepository.kt @@ -0,0 +1,9 @@ +package org.sopt.dosopttemplate.domain.repository + +import org.sopt.dosopttemplate.domain.entity.UserEntity +import org.sopt.dosopttemplate.domain.entity.UserRequestEntity + +interface AuthDomainRepository { + suspend fun login(userRequestEntity: UserRequestEntity): Result + suspend fun signUp(userEntity: UserEntity): Result +} From bfc726e4db9334eb8b70137aa68c16337d6c4a3c Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 17:54:18 +0900 Subject: [PATCH 28/36] =?UTF-8?q?[chore]=20:=20AuthService=20=EC=BD=9C?= =?UTF-8?q?=EB=B0=B1=20=ED=83=80=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/dosopttemplate/data/service/AuthService.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/service/AuthService.kt b/app/src/main/java/org/sopt/dosopttemplate/data/service/AuthService.kt index 0901fbd..676c1cc 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/service/AuthService.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/service/AuthService.kt @@ -3,7 +3,6 @@ package org.sopt.dosopttemplate.data.service import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto import org.sopt.dosopttemplate.data.dto.remote.request.RequestSignUpDto import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseLoginDto -import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST @@ -11,10 +10,10 @@ interface AuthService { @POST("api/v1/members/sign-in") suspend fun postLogin( @Body request: RequestLoginDto, - ): Response + ): ResponseLoginDto @POST("api/v1/members") suspend fun postSignUp( @Body request: RequestSignUpDto, - ): Response + ): Unit } From 5ebd6ba1232368d5825f2b777a0213963737a6f0 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 17:58:13 +0900 Subject: [PATCH 29/36] [chore] : rename [chore] : rename --- .../data/repositoryimpl/ReqresRepositoryImpl.kt | 4 ++-- .../{ReqresRepository.kt => ReqresDomainRepository.kt} | 2 +- .../sopt/dosopttemplate/ui/doandroid/DoAndroidViewModel.kt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename app/src/main/java/org/sopt/dosopttemplate/domain/repository/{ReqresRepository.kt => ReqresDomainRepository.kt} (91%) diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt index 2ec8642..3e0d4eb 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/repositoryimpl/ReqresRepositoryImpl.kt @@ -2,11 +2,11 @@ package org.sopt.dosopttemplate.data.repositoryimpl import org.sopt.dosopttemplate.data.datasource.remote.ReqresDataSource import org.sopt.dosopttemplate.domain.entity.ReqresEntity -import org.sopt.dosopttemplate.domain.repository.ReqresRepository +import org.sopt.dosopttemplate.domain.repository.ReqresDomainRepository // 외부 데이터 소스(ReqresDataSource)로부터 데이터를 가져오고, 필요한 형태로 변환하여 비즈니스 로직 계층에게 제공 class ReqresRepositoryImpl(private val reqresDataSource: ReqresDataSource) : - ReqresRepository { + ReqresDomainRepository { override suspend fun getReqresList(page: Int): Result> { return runCatching { reqresDataSource.getReqresList(page).toReqresList() diff --git a/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt b/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresDomainRepository.kt similarity index 91% rename from app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt rename to app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresDomainRepository.kt index 99cca5e..85736b4 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresRepository.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/domain/repository/ReqresDomainRepository.kt @@ -4,6 +4,6 @@ import org.sopt.dosopttemplate.domain.entity.ReqresEntity /*ReqresRepository 인터페이스는 도메인(Domain) 레이어에서 사용되며, 원격 데이터 소스(ReqresDataSource)로부터 Reqres 사용자 리스트를 가져오는 기능을 정의*/ -interface ReqresRepository { +interface ReqresDomainRepository { suspend fun getReqresList(page: Int): Result> } diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidViewModel.kt index 8eb232f..581bcfe 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/doandroid/DoAndroidViewModel.kt @@ -7,10 +7,10 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.sopt.dosopttemplate.domain.entity.ReqresEntity -import org.sopt.dosopttemplate.domain.repository.ReqresRepository +import org.sopt.dosopttemplate.domain.repository.ReqresDomainRepository import org.sopt.dosopttemplate.utils.UiState -class DoAndroidViewModel(val reqresRepository: ReqresRepository) : ViewModel() { +class DoAndroidViewModel(val reqresRepository: ReqresDomainRepository) : ViewModel() { private val _reqresUserState = MutableStateFlow>>(UiState.Loading) val reqresUserState get() = _reqresUserState.asStateFlow() From f84ee04aaed1208912ffb768c02c89364265de4f Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 17:59:31 +0900 Subject: [PATCH 30/36] =?UTF-8?q?[feat]=20:=20ResponseLoginDto=20map=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/dto/remote/respose/ResponseLoginDto.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseLoginDto.kt b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseLoginDto.kt index f4d8f65..167737e 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseLoginDto.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/data/dto/remote/respose/ResponseLoginDto.kt @@ -2,6 +2,7 @@ package org.sopt.dosopttemplate.data.dto.remote.respose import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import org.sopt.dosopttemplate.domain.entity.UserEntity @Serializable data class ResponseLoginDto( @@ -10,5 +11,12 @@ data class ResponseLoginDto( @SerialName("username") val username: String, @SerialName("nickname") - val nickname: String? = null, -) + val nickname: String, +) { + fun toUserEntity() = UserEntity( + id = username, + pwd = "", + nickName = nickname, + mbti = "", + ) +} From d6cbccb4babbdca1030a763332e47e9beaf89143 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 18:00:03 +0900 Subject: [PATCH 31/36] =?UTF-8?q?[add]=20:=20domain=20=EC=98=81=EC=97=AD?= =?UTF-8?q?=20UserEntity=20=EC=B6=94=EA=B0=80=20+=20Parcelize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/dosopttemplate/domain/entity/UserEntity.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/domain/entity/UserEntity.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/domain/entity/UserEntity.kt b/app/src/main/java/org/sopt/dosopttemplate/domain/entity/UserEntity.kt new file mode 100644 index 0000000..973da7e --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/domain/entity/UserEntity.kt @@ -0,0 +1,12 @@ +package org.sopt.dosopttemplate.domain.entity + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class UserEntity( + val id: String, + val pwd: String, + val nickName: String, + val mbti: String, +) : Parcelable From bb7110e1a11270df0260de1f2f01d36f60994dfa Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 18:00:31 +0900 Subject: [PATCH 32/36] =?UTF-8?q?[fix]=20:=20domain=20=EC=98=81=EC=97=AD?= =?UTF-8?q?=20entity=EB=A1=9C=20=EB=B3=80=EA=B2=BD,=20ui=EC=98=81=EC=97=AD?= =?UTF-8?q?=20model=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dosopttemplate/ui/login/SignUpActivity.kt | 12 ++++---- .../ui/login/SignUpViewModel.kt | 29 ++++++------------- .../org/sopt/dosopttemplate/ui/model/User.kt | 12 -------- .../sopt/dosopttemplate/ui/model/UserInfo.kt | 4 ++- 4 files changed, 18 insertions(+), 39 deletions(-) delete mode 100644 app/src/main/java/org/sopt/dosopttemplate/ui/model/User.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt index 16ce88a..bcbd17a 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpActivity.kt @@ -10,7 +10,7 @@ import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.launch import org.sopt.dosopttemplate.R import org.sopt.dosopttemplate.databinding.ActivitySignUpBinding -import org.sopt.dosopttemplate.ui.model.User +import org.sopt.dosopttemplate.domain.entity.UserEntity import org.sopt.dosopttemplate.utils.UiState import org.sopt.dosopttemplate.utils.ViewModelFactory import org.sopt.dosopttemplate.utils.toast @@ -39,23 +39,23 @@ class SignUpActivity : AppCompatActivity() { private fun initSignUp() { binding.btnLogin.setOnClickListener { - val userEntity = User( + val userEntity = UserEntity( id = binding.editId.text.toString(), pwd = binding.editPwd.text.toString(), nickName = binding.editNickname.text.toString(), mbti = binding.editMbti.text.toString(), ) viewModel.postSignUp(userEntity) - observeSignUpState(userEntity) + observeSignUpState() } } - private fun observeSignUpState(userEntity: User) { + private fun observeSignUpState() { lifecycleScope.launch { viewModel.signUpState.collect { when (it) { is UiState.Success -> { - sendUserData(userEntity) + sendUserData(it.data) toast(getString(R.string.toast_signUp_compeleted)) } @@ -66,7 +66,7 @@ class SignUpActivity : AppCompatActivity() { } } - private fun sendUserData(userEntity: User) { + private fun sendUserData(userEntity: UserEntity) { val intent = Intent(this@SignUpActivity, LoginActivity::class.java) intent.putExtra(USER_TAG, userEntity) // LoginActivity로 결과를 반환 diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt index bbac1ec..c0a9a6c 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/SignUpViewModel.kt @@ -1,6 +1,5 @@ package org.sopt.dosopttemplate.ui.login -import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -9,14 +8,13 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import org.sopt.dosopttemplate.data.dto.remote.request.RequestSignUpDto -import org.sopt.dosopttemplate.data.repositoryimpl.AuthRepository -import org.sopt.dosopttemplate.ui.model.User +import org.sopt.dosopttemplate.domain.entity.UserEntity +import org.sopt.dosopttemplate.domain.repository.AuthDomainRepository import org.sopt.dosopttemplate.utils.UiState -class SignUpViewModel(private val authRepository: AuthRepository) : ViewModel() { - private val _signUpState = MutableStateFlow>(UiState.Loading) - val signUpState: StateFlow> = _signUpState.asStateFlow() +class SignUpViewModel(private val authRepository: AuthDomainRepository) : ViewModel() { + private val _signUpState = MutableStateFlow>(UiState.Loading) + val signUpState: StateFlow> = _signUpState.asStateFlow() private val id = MutableLiveData() private val password = MutableLiveData() @@ -104,23 +102,14 @@ class SignUpViewModel(private val authRepository: AuthRepository) : ViewModel() _isBtnSelected.value = isIdValid && isPasswordValid && isNickNameValid && isMbtiValid } - fun postSignUp(userEntity: User) { + fun postSignUp(userEntity: UserEntity) { viewModelScope.launch { - authRepository.postSignUp( - RequestSignUpDto( - userEntity.id, - userEntity.pwd, - userEntity.nickName, - ), - ).onSuccess { - if (it.isSuccessful) { + authRepository.signUp(userEntity) + .onSuccess { _signUpState.value = UiState.Success(userEntity) - } else { + }.onFailure { _signUpState.value = UiState.Error } - }.onFailure { - Log.e("SignUpActivity", "Error: ${it.message}") - } } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/model/User.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/model/User.kt deleted file mode 100644 index 8caf806..0000000 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/model/User.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.sopt.dosopttemplate.ui.model - -import android.os.Parcelable -import kotlinx.parcelize.Parcelize - -@Parcelize -data class User( - var id: String, - var pwd: String, - var nickName: String, - var mbti: String, -) : Parcelable diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/model/UserInfo.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/model/UserInfo.kt index 826da2b..ffc895a 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/model/UserInfo.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/model/UserInfo.kt @@ -1,7 +1,9 @@ package org.sopt.dosopttemplate.ui.model +import org.sopt.dosopttemplate.domain.entity.UserEntity + object UserInfo { - var userInfoList = User( + var userInfoList = UserEntity( id = "", pwd = "", nickName = "", From 493d545098e5bd733879ce2eb761e61e146b9d2a Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 18:00:52 +0900 Subject: [PATCH 33/36] =?UTF-8?q?[add]=20:=20UserRequestEntity=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(=ED=95=84=EC=9A=94=20=EC=97=86=EC=9D=84=EC=A7=80?= =?UTF-8?q?=EB=8F=84=3F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/dosopttemplate/domain/entity/UserRequestEntity.kt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/java/org/sopt/dosopttemplate/domain/entity/UserRequestEntity.kt diff --git a/app/src/main/java/org/sopt/dosopttemplate/domain/entity/UserRequestEntity.kt b/app/src/main/java/org/sopt/dosopttemplate/domain/entity/UserRequestEntity.kt new file mode 100644 index 0000000..1d00d72 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/domain/entity/UserRequestEntity.kt @@ -0,0 +1,6 @@ +package org.sopt.dosopttemplate.domain.entity + +data class UserRequestEntity( + val userName: String, + val passWord: String, +) From b262f15546cf1aa4f2d7d3c8ca13412f61f1b2c4 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 18:05:03 +0900 Subject: [PATCH 34/36] =?UTF-8?q?[fix]=20:=20AuthViewModel=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20sharedflow=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dosopttemplate/ui/login/AuthViewModel.kt | 40 +++++++------------ 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt index d01834c..b3c98fc 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt @@ -5,19 +5,18 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch -import org.sopt.dosopttemplate.data.dto.remote.request.RequestLoginDto -import org.sopt.dosopttemplate.data.dto.remote.respose.ResponseLoginDto -import org.sopt.dosopttemplate.data.repositoryimpl.AuthRepository -import org.sopt.dosopttemplate.ui.model.UserInfo +import org.sopt.dosopttemplate.domain.entity.UserEntity +import org.sopt.dosopttemplate.domain.entity.UserRequestEntity +import org.sopt.dosopttemplate.domain.repository.AuthDomainRepository import org.sopt.dosopttemplate.utils.UiState -class AuthViewModel(private val authRepository: AuthRepository) : ViewModel() { - private val _loginState = MutableStateFlow>(UiState.Loading) - val loginState: StateFlow> get() = _loginState.asStateFlow() +class AuthViewModel(private val authRepository: AuthDomainRepository) : ViewModel() { + private val _loginState = MutableSharedFlow>() + val loginState: SharedFlow> get() = _loginState.asSharedFlow() private val _isLoginButtonClicked: MutableLiveData = MutableLiveData(false) val isLoginButtonClicked: LiveData @@ -25,24 +24,13 @@ class AuthViewModel(private val authRepository: AuthRepository) : ViewModel() { fun login(id: String, password: String) { viewModelScope.launch { - authRepository.postLogin(RequestLoginDto(id, password)) + authRepository.login(UserRequestEntity(id, password)) .onSuccess { - if (it.isSuccessful) { - val response = it.body() - if (response != null) { - _loginState.value = UiState.Success(response) - Log.d("server", _loginState.value.toString()) - UserInfo.updateUserInfo( - id = response.id.toString(), - nickName = response.nickname.toString(), - ) - } - } else { - _loginState.value = UiState.Error - Log.d("server", it.code().toString()) - } - }.onFailure { + _loginState.emit(UiState.Success(it)) + } + .onFailure { Log.d("server", it.message.toString()) + _loginState.emit(UiState.Error) } } } From 480b24540f1f42749fafc3e9983f39009a753642 Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 18:05:46 +0900 Subject: [PATCH 35/36] =?UTF-8?q?[fix]=20:=20LoginActivity=EC=97=90?= =?UTF-8?q?=EC=84=9C=20Success=EC=9D=B8=EA=B2=BD=EC=9A=B0=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=8B=B1=EA=B8=80=ED=86=A4=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt index e97a140..2a0c5e0 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/ui/login/LoginActivity.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.launch import org.sopt.dosopttemplate.databinding.ActivityLoginBinding import org.sopt.dosopttemplate.ui.HomeActivity +import org.sopt.dosopttemplate.ui.model.UserInfo import org.sopt.dosopttemplate.utils.UiState import org.sopt.dosopttemplate.utils.ViewModelFactory import org.sopt.dosopttemplate.utils.toast @@ -60,6 +61,11 @@ class LoginActivity : AppCompatActivity() { when (loginState) { is UiState.Success -> { toast("로그인 성공") + UserInfo.updateUserInfo( + id = loginState.data.id, + nickName = loginState.data.nickName, + mbti = loginState.data.mbti, + ) startActivity(Intent(this@LoginActivity, HomeActivity::class.java)) } From 8c30b7f9d31526dc93a04688ee6f6af5563c9a1f Mon Sep 17 00:00:00 2001 From: chanu Date: Wed, 3 Jan 2024 18:14:14 +0900 Subject: [PATCH 36/36] =?UTF-8?q?[fix]=20:=20ViewModelFactory=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=88=98=EB=8F=99=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/dosopttemplate/utils/ViewModelFactory.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt b/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt index a83f7dc..d2c0697 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/utils/ViewModelFactory.kt @@ -3,8 +3,9 @@ package org.sopt.dosopttemplate.utils import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import org.sopt.dosopttemplate.data.ApiFactory +import org.sopt.dosopttemplate.data.datasourceimpl.remote.AuthDataSourceImpl import org.sopt.dosopttemplate.data.datasourceimpl.remote.ReqresDataSourceImpl -import org.sopt.dosopttemplate.data.repositoryimpl.AuthRepository +import org.sopt.dosopttemplate.data.repositoryimpl.AuthRepositoryImpl import org.sopt.dosopttemplate.data.repositoryimpl.ReqresRepositoryImpl import org.sopt.dosopttemplate.ui.doandroid.DoAndroidViewModel import org.sopt.dosopttemplate.ui.login.AuthViewModel @@ -16,12 +17,14 @@ class ViewModelFactory : override fun create(modelClass: Class): T { return when { modelClass.isAssignableFrom(AuthViewModel::class.java) -> { - val repository = AuthRepository(ApiFactory.ServicePool.authService) + val repository = + AuthRepositoryImpl(AuthDataSourceImpl(ApiFactory.ServicePool.authService)) AuthViewModel(repository) as T } modelClass.isAssignableFrom(SignUpViewModel::class.java) -> { - val repository = AuthRepository(ApiFactory.ServicePool.authService) + val repository = + AuthRepositoryImpl(AuthDataSourceImpl(ApiFactory.ServicePool.authService)) SignUpViewModel(repository) as T }