diff --git a/app/build.gradle b/app/build.gradle
index 9e96163..fae80a1 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -2,6 +2,9 @@ plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.0'
id 'org.jetbrains.kotlin.android'
+ id 'kotlin-android'
+ id 'kotlin-kapt'
+ id 'com.google.dagger.hilt.android'
}
Properties properties = new Properties()
@@ -77,4 +80,12 @@ dependencies {
// Glide 라이브러리 추가
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
+
+ // Hilt
+ implementation 'com.google.dagger:hilt-android:2.48'
+ kapt 'com.google.dagger:hilt-compiler:2.48'
+}
+
+kapt {
+ correctErrorTypes = true
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ece8e3d..e790c9d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -7,6 +7,7 @@
@@ -26,10 +27,10 @@
diff --git a/app/src/main/java/com/sopt/now/NowSopt.kt b/app/src/main/java/com/sopt/now/NowSopt.kt
new file mode 100644
index 0000000..e087b64
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/NowSopt.kt
@@ -0,0 +1,21 @@
+package com.sopt.now
+
+import android.app.Application
+import android.content.Context
+import androidx.appcompat.app.AppCompatDelegate
+import dagger.hilt.android.HiltAndroidApp
+
+@HiltAndroidApp
+class NowSopt : Application() {
+ override fun onCreate() {
+ super.onCreate()
+ appContext = applicationContext
+
+ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
+ }
+
+ companion object {
+ lateinit var appContext: Context
+ private set
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/di/NetworkModule.kt b/app/src/main/java/com/sopt/now/data/di/NetworkModule.kt
new file mode 100644
index 0000000..2ca1f61
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/di/NetworkModule.kt
@@ -0,0 +1,77 @@
+package com.sopt.now.data.di
+
+import android.util.Log
+import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
+import com.sopt.now.data.service.AuthService
+import com.sopt.now.data.service.FriendService
+import com.sopt.now.data.service.UserService
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import kotlinx.serialization.json.Json
+import okhttp3.Interceptor
+import okhttp3.MediaType.Companion.toMediaType
+import okhttp3.OkHttpClient
+import okhttp3.logging.HttpLoggingInterceptor
+import retrofit2.Retrofit
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object NetworkModule {
+ private const val CONTENT_TYPE = "application/json"
+ private val json: Json =
+ Json {
+ ignoreUnknownKeys = true
+ }
+
+ private fun getLogOkHttpClient(): Interceptor {
+ val loggingInterceptor =
+ HttpLoggingInterceptor { message ->
+ Log.d("Retrofit2", "CONNECTION INFO -> $message")
+ }
+ loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
+ return loggingInterceptor
+ }
+
+ private val okHttpClient =
+ OkHttpClient.Builder()
+ .addInterceptor(getLogOkHttpClient())
+ .build()
+
+ @Singleton
+ @Provides
+ fun provideRetrofit(): Retrofit.Builder {
+ return Retrofit.Builder()
+ .client(okHttpClient)
+ .addConverterFactory(json.asConverterFactory(CONTENT_TYPE.toMediaType()))
+ }
+
+ @Singleton
+ @Provides
+ fun provideAuthService(
+ retrofitBuilder: Retrofit.Builder,
+ @AuthBaseUrl url: String,
+ ): AuthService {
+ return retrofitBuilder.baseUrl(url).build().create(AuthService::class.java)
+ }
+
+ @Singleton
+ @Provides
+ fun provideUserService(
+ retrofitBuilder: Retrofit.Builder,
+ @AuthBaseUrl url: String,
+ ): UserService {
+ return retrofitBuilder.baseUrl(url).build().create(UserService::class.java)
+ }
+
+ @Singleton
+ @Provides
+ fun provideFriendService(
+ retrofitBuilder: Retrofit.Builder,
+ @FriendBaseUrl url: String,
+ ): FriendService {
+ return retrofitBuilder.baseUrl(url).build().create(FriendService::class.java)
+ }
+}
diff --git a/app/src/main/java/com/sopt/now/data/di/UrlModule.kt b/app/src/main/java/com/sopt/now/data/di/UrlModule.kt
new file mode 100644
index 0000000..cca3d98
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/di/UrlModule.kt
@@ -0,0 +1,28 @@
+package com.sopt.now.data.di
+
+import com.sopt.now.BuildConfig
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Qualifier
+
+@Module
+@InstallIn(SingletonComponent::class)
+object UrlModule {
+ @AuthBaseUrl
+ @Provides
+ fun provideAuthBaseUrl(): String = BuildConfig.AUTH_BASE_URL
+
+ @FriendBaseUrl
+ @Provides
+ fun provideFriendBaseUrl(): String = BuildConfig.FRIEND_BASE_URL
+}
+
+@Retention(AnnotationRetention.BINARY)
+@Qualifier
+annotation class AuthBaseUrl
+
+@Retention(AnnotationRetention.BINARY)
+@Qualifier
+annotation class FriendBaseUrl
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/repository/AuthRepository.kt b/app/src/main/java/com/sopt/now/data/repository/AuthRepository.kt
new file mode 100644
index 0000000..b2b7d69
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/repository/AuthRepository.kt
@@ -0,0 +1,25 @@
+package com.sopt.now.data.repository
+
+import com.sopt.now.data.request.RequestSignInDto
+import com.sopt.now.data.request.RequestSignUpDto
+import com.sopt.now.data.response.ResponseSignInDto
+import com.sopt.now.data.response.ResponseSignUpDto
+import com.sopt.now.data.service.AuthService
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class AuthRepository
+@Inject
+constructor(
+ private val authService: AuthService,
+) {
+ suspend fun signUp(request: RequestSignUpDto): Response {
+ return authService.signUp(request)
+ }
+
+ suspend fun signIn(request: RequestSignInDto): Response {
+ return authService.signIn(request)
+ }
+}
diff --git a/app/src/main/java/com/sopt/now/data/repository/FriendRepository.kt b/app/src/main/java/com/sopt/now/data/repository/FriendRepository.kt
new file mode 100644
index 0000000..f1b805f
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/repository/FriendRepository.kt
@@ -0,0 +1,18 @@
+package com.sopt.now.data.repository
+
+import com.sopt.now.data.response.ResponseFriendsInfoDto
+import com.sopt.now.data.service.FriendService
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class FriendRepository
+@Inject
+constructor(
+ private val friendService: FriendService,
+) {
+ suspend fun getFriendsInfo(i: Int): Response {
+ return friendService.getFriendsInfo(2)
+ }
+}
diff --git a/app/src/main/java/com/sopt/now/data/repository/UserRepository.kt b/app/src/main/java/com/sopt/now/data/repository/UserRepository.kt
new file mode 100644
index 0000000..f2816f6
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/repository/UserRepository.kt
@@ -0,0 +1,18 @@
+package com.sopt.now.data.repository
+
+import com.sopt.now.data.response.ResponseUserInfoDto
+import com.sopt.now.data.service.UserService
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class UserRepository
+@Inject
+constructor(
+ private val userService: UserService,
+) {
+ suspend fun getUserInfo(memberId: Int): Response {
+ return userService.getUserInfo(memberId)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/signIn/RequestSignInDto.kt b/app/src/main/java/com/sopt/now/data/request/RequestSignInDto.kt
similarity index 88%
rename from app/src/main/java/com/sopt/now/signIn/RequestSignInDto.kt
rename to app/src/main/java/com/sopt/now/data/request/RequestSignInDto.kt
index 1bb6002..96f43f1 100644
--- a/app/src/main/java/com/sopt/now/signIn/RequestSignInDto.kt
+++ b/app/src/main/java/com/sopt/now/data/request/RequestSignInDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.signIn
+package com.sopt.now.data.request
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/signUp/RequestSignUpDto.kt b/app/src/main/java/com/sopt/now/data/request/RequestSignUpDto.kt
similarity index 91%
rename from app/src/main/java/com/sopt/now/signUp/RequestSignUpDto.kt
rename to app/src/main/java/com/sopt/now/data/request/RequestSignUpDto.kt
index 25c0ef9..0839a44 100644
--- a/app/src/main/java/com/sopt/now/signUp/RequestSignUpDto.kt
+++ b/app/src/main/java/com/sopt/now/data/request/RequestSignUpDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.signUp
+package com.sopt.now.data.request
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/ResponseFriendsInfoDto.kt b/app/src/main/java/com/sopt/now/data/response/ResponseFriendsInfoDto.kt
similarity index 95%
rename from app/src/main/java/com/sopt/now/main/homeFragment/ResponseFriendsInfoDto.kt
rename to app/src/main/java/com/sopt/now/data/response/ResponseFriendsInfoDto.kt
index dd06c50..d160658 100644
--- a/app/src/main/java/com/sopt/now/main/homeFragment/ResponseFriendsInfoDto.kt
+++ b/app/src/main/java/com/sopt/now/data/response/ResponseFriendsInfoDto.kt
@@ -1,7 +1,7 @@
-package com.sopt.now.main.homeFragment
+package com.sopt.now.data.response
-import kotlinx.serialization.Serializable
import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
@Serializable
data class ResponseFriendsInfoDto(
diff --git a/app/src/main/java/com/sopt/now/signIn/ResponseSignInDto.kt b/app/src/main/java/com/sopt/now/data/response/ResponseSignInDto.kt
similarity index 86%
rename from app/src/main/java/com/sopt/now/signIn/ResponseSignInDto.kt
rename to app/src/main/java/com/sopt/now/data/response/ResponseSignInDto.kt
index e27244d..83da1cf 100644
--- a/app/src/main/java/com/sopt/now/signIn/ResponseSignInDto.kt
+++ b/app/src/main/java/com/sopt/now/data/response/ResponseSignInDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.signIn
+package com.sopt.now.data.response
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/signUp/ResponseSignUpDto.kt b/app/src/main/java/com/sopt/now/data/response/ResponseSignUpDto.kt
similarity index 86%
rename from app/src/main/java/com/sopt/now/signUp/ResponseSignUpDto.kt
rename to app/src/main/java/com/sopt/now/data/response/ResponseSignUpDto.kt
index 5247516..3f8d721 100644
--- a/app/src/main/java/com/sopt/now/signUp/ResponseSignUpDto.kt
+++ b/app/src/main/java/com/sopt/now/data/response/ResponseSignUpDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.signUp
+package com.sopt.now.data.response
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/main/ResponseUserInfoDto.kt b/app/src/main/java/com/sopt/now/data/response/ResponseUserInfoDto.kt
similarity index 93%
rename from app/src/main/java/com/sopt/now/main/ResponseUserInfoDto.kt
rename to app/src/main/java/com/sopt/now/data/response/ResponseUserInfoDto.kt
index 7f3d7be..e86a735 100644
--- a/app/src/main/java/com/sopt/now/main/ResponseUserInfoDto.kt
+++ b/app/src/main/java/com/sopt/now/data/response/ResponseUserInfoDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.main
+package com.sopt.now.data.response
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/data/service/AuthService.kt b/app/src/main/java/com/sopt/now/data/service/AuthService.kt
new file mode 100644
index 0000000..f4dab62
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/service/AuthService.kt
@@ -0,0 +1,21 @@
+package com.sopt.now.data.service
+
+import com.sopt.now.data.request.RequestSignInDto
+import com.sopt.now.data.request.RequestSignUpDto
+import com.sopt.now.data.response.ResponseSignInDto
+import com.sopt.now.data.response.ResponseSignUpDto
+import retrofit2.Response
+import retrofit2.http.Body
+import retrofit2.http.POST
+
+interface AuthService {
+ @POST("member/join")
+ suspend fun signUp(
+ @Body request: RequestSignUpDto,
+ ): Response
+
+ @POST("member/login")
+ suspend fun signIn(
+ @Body request: RequestSignInDto,
+ ): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/service/FriendService.kt b/app/src/main/java/com/sopt/now/data/service/FriendService.kt
new file mode 100644
index 0000000..b015290
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/service/FriendService.kt
@@ -0,0 +1,13 @@
+package com.sopt.now.data.service
+
+import com.sopt.now.data.response.ResponseFriendsInfoDto
+import retrofit2.Response
+import retrofit2.http.GET
+import retrofit2.http.Query
+
+interface FriendService {
+ @GET("/api/users")
+ suspend fun getFriendsInfo(
+ @Query("page") page: Int,
+ ): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/service/UserService.kt b/app/src/main/java/com/sopt/now/data/service/UserService.kt
new file mode 100644
index 0000000..bd88829
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/service/UserService.kt
@@ -0,0 +1,13 @@
+package com.sopt.now.data.service
+
+import com.sopt.now.data.response.ResponseUserInfoDto
+import retrofit2.Response
+import retrofit2.http.GET
+import retrofit2.http.Header
+
+interface UserService {
+ @GET("member/info")
+ suspend fun getUserInfo(
+ @Header("memberId") memberId: Int,
+ ): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewModel.kt b/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewModel.kt
deleted file mode 100644
index c6db394..0000000
--- a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewModel.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.sopt.now.main.homeFragment
-
-import android.util.Log
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-import androidx.recyclerview.widget.RecyclerView
-import com.sopt.now.R
-import com.sopt.now.main.ResponseUserInfoDto
-import com.sopt.now.service.ServicePool
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-
-class HomeViewModel : ViewModel() {
-
- private val _userInfo = MutableLiveData()
- val userInfo: LiveData
- get() = _userInfo
-
- private val _friendsInfo = MutableLiveData?>()
- val friendsInfo: LiveData?>
- get() = _friendsInfo
-
- private val userService by lazy { ServicePool.userService }
- private val friendService by lazy { ServicePool.friendService }
-
- fun fetchUserInfo(userId: Int) {
- userService.getUserInfo(userId).enqueue(object : Callback {
- override fun onResponse(
- call: Call,
- response: Response
- ) {
- if (response.isSuccessful) {
- val responseUserInfoDto = response.body()
- val userProfileInfo = responseUserInfoDto?.data?.let { userData ->
- HomeData.UserProfile(
- R.drawable.sonminjae_profile,
- userData.nickname,
- userData.phone,
- userData.authenticationId)
- }
- _userInfo.value = userProfileInfo
- }
- }
- override fun onFailure(call: Call, t: Throwable) {
- Log.e("HomeViewModel", t.message.toString())
- }
- })
- }
-
- fun fetchFriendsInfo() {
- friendService.getFriendsInfo(2).enqueue(object : Callback {
- override fun onResponse(
- call: Call,
- response: Response
- ) {
- if (response.isSuccessful) {
- val responseFriendsInfoDto = response.body()
- val friendProfiles = responseFriendsInfoDto?.data?.map { friendData ->
- HomeData.FriendProfile(
- friendData.avatar,
- "${friendData.firstName} ${ friendData.lastName}",
- friendData.email
- )
- }
- _friendsInfo.postValue(friendProfiles)
- }
- }
-
- override fun onFailure(call: Call, t: Throwable) {
- Log.e("HomeViewModel", t.message.toString())
- }
- })
- }
- fun updateUserProfileUI(view: RecyclerView, it: HomeData.UserProfile) {
- val adapter = view.adapter as? HomeViewAdapter
- adapter?.setUserProfileList(it)
- }
-
-
- fun updateFriendProfilesUI(view: RecyclerView, it: List) {
- val adapter = view.adapter as? HomeViewAdapter
- adapter?.setFriendProfileList(it)
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/main/myPageFragment/MyPageFragment.kt b/app/src/main/java/com/sopt/now/main/myPageFragment/MyPageFragment.kt
deleted file mode 100644
index 45cc66a..0000000
--- a/app/src/main/java/com/sopt/now/main/myPageFragment/MyPageFragment.kt
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.sopt.now.main.myPageFragment
-
-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 com.sopt.now.service.ServicePool
-import com.sopt.now.main.ResponseUserInfoDto
-import com.sopt.now.databinding.FragmentMypageBinding
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-
-class MyPageFragment : Fragment() {
- private var _binding: FragmentMypageBinding? = null
- private val binding
- get() = requireNotNull(_binding) {
- "바인딩 객체를 생성해야 합니다."
- }
-
- private var memberId: String? = null
-
- companion object {
- fun newInstance(memberId: String?): MyPageFragment {
- val fragment = MyPageFragment()
- val args = Bundle().apply {
- putString("memberId", memberId)
- }
- fragment.arguments = args
- return fragment
- }
- }
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- _binding = FragmentMypageBinding.inflate(inflater, container, false)
- return binding.root
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- memberId = activity?.intent?.getStringExtra("memberId") ?: "0"
-
- memberId?.let { memberId ->
- ServicePool.userService.getUserInfo(memberId.toInt()).enqueue(object :
- Callback {
- override fun onResponse(
- call: Call,
- response: Response
- ) {
- if (response.isSuccessful) {
- val userInfo = response.body()?.data
-
- userInfo?.let {
- binding.tvMyPageId.text = " ${it.authenticationId}"
- binding.tvMyPagePw.text = " ${it.nickname}"
- binding.tvMyPagePhoneNumber.text = " ${it.phone}"
- }
- } else {
- Toast.makeText(requireContext(), "회원 정보를 가져오는데 실패했습니다.", Toast.LENGTH_SHORT)
- .show()
- }
- }
-
- override fun onFailure(call: Call, t: Throwable) {
- Log.e("MyPageFragment", "Failed to fetch user info: ${t.message}")
- Toast.makeText(requireContext(), "서버와의 통신 실패", Toast.LENGTH_SHORT).show()
- }
- })
- }
- }
-
- override fun onDestroyView() {
- super.onDestroyView()
- _binding = null
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/service/ApiFactory.kt b/app/src/main/java/com/sopt/now/service/ApiFactory.kt
deleted file mode 100644
index 3b58c85..0000000
--- a/app/src/main/java/com/sopt/now/service/ApiFactory.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.sopt.now.service
-
-import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
-import com.sopt.now.BuildConfig
-import com.sopt.now.BuildConfig.AUTH_BASE_URL
-import com.sopt.now.BuildConfig.FRIEND_BASE_URL
-import kotlinx.serialization.json.Json
-import okhttp3.MediaType.Companion.toMediaType
-import okhttp3.OkHttpClient
-import okhttp3.logging.HttpLoggingInterceptor
-import retrofit2.Retrofit
-import java.util.concurrent.TimeUnit
-
-
-object ApiFactory {
- private const val AUTH_BASE_URL: String = BuildConfig.AUTH_BASE_URL
- private const val FRIEND_BASE_URL: String = BuildConfig.FRIEND_BASE_URL
-
- // HTTP 로깅 인터셉터 설정
- private val loggingInterceptor = HttpLoggingInterceptor().apply {
- level = HttpLoggingInterceptor.Level.BODY
- }
-
- // OkHttpClient 설정
- private val okHttpClient = OkHttpClient.Builder()
- .addInterceptor(loggingInterceptor) // 로깅 인터셉터 추가
- .connectTimeout(30, TimeUnit.SECONDS) // 연결 타임아웃
- .readTimeout(30, TimeUnit.SECONDS) // 읽기 타임아웃
- .writeTimeout(30, TimeUnit.SECONDS) // 쓰기 타임아웃
- .build()
-
- fun provideRetrofit(url:String): Retrofit {
- return Retrofit.Builder()
- .baseUrl(url)
- .client(okHttpClient)
- .addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
- .build()
- }
- inline fun create(url: String): T = provideRetrofit(url).create(T::class.java)
-}
-
-object ServicePool {
- val authService = ApiFactory.create(AUTH_BASE_URL)
- val userService = ApiFactory.create(AUTH_BASE_URL)
- val friendService = ApiFactory.create(FRIEND_BASE_URL)
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/service/AuthService.kt b/app/src/main/java/com/sopt/now/service/AuthService.kt
deleted file mode 100644
index a4b7014..0000000
--- a/app/src/main/java/com/sopt/now/service/AuthService.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.sopt.now.service
-
-import com.sopt.now.main.ResponseUserInfoDto
-import com.sopt.now.signIn.RequestSignInDto
-import com.sopt.now.signUp.RequestSignUpDto
-import com.sopt.now.signIn.ResponseSignInDto
-import com.sopt.now.signUp.ResponseSignUpDto
-import retrofit2.Call
-import retrofit2.Response
-import retrofit2.http.Body
-import retrofit2.http.GET
-import retrofit2.http.Header
-import retrofit2.http.POST
-
-interface AuthService {
- @POST("member/join")
- suspend fun signUp(
- @Body request: RequestSignUpDto,
- ): Response
-
- @POST("member/login")
- fun signIn(
- @Body request: RequestSignInDto,
- ): Call
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/service/FriendService.kt b/app/src/main/java/com/sopt/now/service/FriendService.kt
deleted file mode 100644
index 276865c..0000000
--- a/app/src/main/java/com/sopt/now/service/FriendService.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.sopt.now.service
-
-import com.sopt.now.main.homeFragment.ResponseFriendsInfoDto
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Query
-
-interface FriendService {
- @GET("/api/users")
- fun getFriendsInfo(
- @Query("page") page: Int,
- ): Call
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/service/UserService.kt b/app/src/main/java/com/sopt/now/service/UserService.kt
deleted file mode 100644
index 58bea8c..0000000
--- a/app/src/main/java/com/sopt/now/service/UserService.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.sopt.now.service
-
-import com.sopt.now.main.ResponseUserInfoDto
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Header
-
-interface UserService {
- @GET("member/info")
- fun getUserInfo(
- @Header("memberId") memberId: Int,
- ): Call
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/signIn/SignInViewModel.kt b/app/src/main/java/com/sopt/now/signIn/SignInViewModel.kt
deleted file mode 100644
index 41a83bc..0000000
--- a/app/src/main/java/com/sopt/now/signIn/SignInViewModel.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.sopt.now.signIn
-
-import android.util.Log
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-import com.sopt.now.service.ServicePool
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-
-class SignInViewModel : ViewModel() {
- private val authService by lazy { ServicePool.authService }
- val liveData = MutableLiveData()
-
- fun signIn(request: RequestSignInDto) {
- authService.signIn(request).enqueue(object : Callback {
- override fun onResponse(
- call: Call,
- response: Response,
- ) {
- if (response.isSuccessful) {
- val data: ResponseSignInDto? = response.body()
- val memberId = response.headers()["location"]
- liveData.value = SignInState(
- isSuccess = true,
- message = "로그인 성공! 유저의 ID는 $memberId 입니둥",
- memberId = memberId
- )
- Log.d("SignIn", "data: $data, userId: $memberId")
- } else {
- val error = response.message()
- liveData.value = SignInState(
- isSuccess = false,
- message = "로그인 실패 $error",
- memberId = null
- )
- }
- }
-
- override fun onFailure(call: Call, t: Throwable) {
- liveData.value = SignInState(
- isSuccess = false,
- message = "서버 에러",
- memberId = null
- )
- }
- })
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/signUp/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/signUp/SignUpViewModel.kt
deleted file mode 100644
index d39f77d..0000000
--- a/app/src/main/java/com/sopt/now/signUp/SignUpViewModel.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.sopt.now.signUp
-
-import android.util.Log
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.viewModelScope
-import com.sopt.now.service.ServicePool
-import kotlinx.coroutines.launch
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-
-class SignUpViewModel : ViewModel() {
- private val authService by lazy { ServicePool.authService }
- val liveData = MutableLiveData()
-
- private val _navigateToSignIn = MutableLiveData()
- val navigateToSignIn: LiveData
- get() = _navigateToSignIn
-
- fun signUp(request: RequestSignUpDto) {
- viewModelScope.launch {
- runCatching {
- authService.signUp(request)
- }.onSuccess {
- liveData.value = SignUpState(true, "회원가입 성공")
- moveToSignInActivity()
- }.onFailure {
- liveData.value = SignUpState(false, "회원가입 실패")
- }
- }
- }
-
- private fun moveToSignInActivity() {
- _navigateToSignIn.value = true
- }
-
- fun doneNavigatingToSignIn() {
- _navigateToSignIn.value = false
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/main/MainActivity.kt b/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt
similarity index 86%
rename from app/src/main/java/com/sopt/now/main/MainActivity.kt
rename to app/src/main/java/com/sopt/now/ui/main/MainActivity.kt
index 4cb3d88..586e489 100644
--- a/app/src/main/java/com/sopt/now/main/MainActivity.kt
+++ b/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.main
+package com.sopt.now.ui.main
import android.os.Bundle
import android.util.Log
@@ -6,10 +6,12 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.sopt.now.R
import com.sopt.now.databinding.ActivityMainBinding
-import com.sopt.now.main.homeFragment.HomeFragment
-import com.sopt.now.main.myPageFragment.MyPageFragment
-import com.sopt.now.main.searchFragment.SearchFragment
+import com.sopt.now.ui.main.home.HomeFragment
+import com.sopt.now.ui.main.myPage.MyPageFragment
+import com.sopt.now.ui.main.search.SearchFragment
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
@@ -18,7 +20,7 @@ class MainActivity : AppCompatActivity() {
setContentView(binding.root)
val memberId = intent.getStringExtra("memberId")
- Log.e("MainActivity", "memberId: ${memberId}")
+ Log.e("MainActivity", "memberId: $memberId")
val currentFragment = supportFragmentManager.findFragmentById(binding.fcvMain.id)
if (currentFragment == null) {
diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/HomeData.kt b/app/src/main/java/com/sopt/now/ui/main/home/HomeData.kt
similarity index 75%
rename from app/src/main/java/com/sopt/now/main/homeFragment/HomeData.kt
rename to app/src/main/java/com/sopt/now/ui/main/home/HomeData.kt
index def39d7..3b205f8 100644
--- a/app/src/main/java/com/sopt/now/main/homeFragment/HomeData.kt
+++ b/app/src/main/java/com/sopt/now/ui/main/home/HomeData.kt
@@ -1,8 +1,6 @@
-package com.sopt.now.main.homeFragment
+package com.sopt.now.ui.main.home
import androidx.annotation.DrawableRes
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
class HomeData {
data class UserProfile(
diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/HomeFragment.kt b/app/src/main/java/com/sopt/now/ui/main/home/HomeFragment.kt
similarity index 84%
rename from app/src/main/java/com/sopt/now/main/homeFragment/HomeFragment.kt
rename to app/src/main/java/com/sopt/now/ui/main/home/HomeFragment.kt
index 73b2a62..2712daa 100644
--- a/app/src/main/java/com/sopt/now/main/homeFragment/HomeFragment.kt
+++ b/app/src/main/java/com/sopt/now/ui/main/home/HomeFragment.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.main.homeFragment
+package com.sopt.now.ui.main.home
import android.os.Bundle
import android.view.LayoutInflater
@@ -8,9 +8,10 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
import com.sopt.now.databinding.FragmentHomeBinding
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class HomeFragment : Fragment() {
private var _binding: FragmentHomeBinding? = null
private val binding
@@ -19,17 +20,6 @@ class HomeFragment : Fragment() {
}
private val viewModel by viewModels()
- companion object {
- fun newInstance(memberId: String?): HomeFragment {
- val fragment = HomeFragment()
- val args = Bundle().apply {
- putString("memberId", memberId)
- }
- fragment.arguments = args
- return fragment
- }
- }
-
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -42,11 +32,21 @@ class HomeFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val memberId = activity?.intent?.getStringExtra("memberId") ?: "0"
- val homeProfiledAdapter = HomeViewAdapter()
+ fetchUserInfo(memberId)
+ fetchFriendsInfo()
+ observeInfoList()
+ }
+
+ private fun fetchUserInfo(memberId: String?) {
+ viewModel.fetchUserInfo(memberId?.toInt() ?: 0)
+ }
- viewModel.fetchUserInfo(memberId.toInt())
+ private fun fetchFriendsInfo() {
viewModel.fetchFriendsInfo()
+ }
+ private fun observeInfoList() {
+ val homeProfiledAdapter = HomeViewAdapter()
binding.rvHomeFriendList.run {
adapter = homeProfiledAdapter
layoutManager = LinearLayoutManager(requireContext())
@@ -54,10 +54,10 @@ class HomeFragment : Fragment() {
homeProfiledAdapter.setFriendProfileList(viewModel.friendsInfo.value)
viewModel.userInfo.observe(viewLifecycleOwner, Observer { userProfile ->
- userProfile?.let { viewModel.updateUserProfileUI(this,it) }
+ userProfile?.let { viewModel.updateUserProfileUI(this, it) }
})
viewModel.friendsInfo.observe(viewLifecycleOwner, Observer { friendProfiles ->
- friendProfiles?.let { viewModel.updateFriendProfilesUI(this,it) }
+ friendProfiles?.let { viewModel.updateFriendProfilesUI(this, it) }
})
}
}
@@ -66,4 +66,15 @@ class HomeFragment : Fragment() {
super.onDestroyView()
_binding = null
}
+
+ companion object {
+ fun newInstance(memberId: String?): HomeFragment {
+ val fragment = HomeFragment()
+ val args = Bundle().apply {
+ putString("memberId", memberId)
+ }
+ fragment.arguments = args
+ return fragment
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewAdapter.kt b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewAdapter.kt
similarity index 98%
rename from app/src/main/java/com/sopt/now/main/homeFragment/HomeViewAdapter.kt
rename to app/src/main/java/com/sopt/now/ui/main/home/HomeViewAdapter.kt
index 89554e5..d57c985 100644
--- a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewAdapter.kt
+++ b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewAdapter.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.main.homeFragment
+package com.sopt.now.ui.main.home
import android.view.LayoutInflater
import android.view.ViewGroup
diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewHolder.kt b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewHolder.kt
similarity index 89%
rename from app/src/main/java/com/sopt/now/main/homeFragment/HomeViewHolder.kt
rename to app/src/main/java/com/sopt/now/ui/main/home/HomeViewHolder.kt
index 4e83498..ffcf1d1 100644
--- a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewHolder.kt
+++ b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewHolder.kt
@@ -1,12 +1,9 @@
-package com.sopt.now.main.homeFragment
+package com.sopt.now.ui.main.home
-import androidx.lifecycle.LiveData
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
-import com.sopt.now.R
import com.sopt.now.databinding.ItemFriendBinding
import com.sopt.now.databinding.ItemUserBinding
-import com.sopt.now.main.ResponseUserInfoDto
class HomeViewHolder {
class UserViewHolder(private val binding: ItemUserBinding) :
diff --git a/app/src/main/java/com/sopt/now/ui/main/home/HomeViewModel.kt b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewModel.kt
new file mode 100644
index 0000000..8562de1
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewModel.kt
@@ -0,0 +1,83 @@
+package com.sopt.now.ui.main.home
+
+import android.util.Log
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import androidx.recyclerview.widget.RecyclerView
+import com.sopt.now.R
+import com.sopt.now.data.repository.FriendRepository
+import com.sopt.now.data.repository.UserRepository
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class HomeViewModel
+@Inject constructor(
+ private val userRepository: UserRepository,
+ private val friendRepository: FriendRepository,
+) : ViewModel() {
+
+ private val _userInfo = MutableLiveData()
+ val userInfo: LiveData
+ get() = _userInfo
+
+ private val _friendsInfo = MutableLiveData?>()
+ val friendsInfo: LiveData?>
+ get() = _friendsInfo
+
+ fun fetchUserInfo(memberId: Int) {
+ viewModelScope.launch(Dispatchers.IO) {
+ runCatching {
+ userRepository.getUserInfo(memberId)
+ }.onSuccess {
+ val responseUserInfoDto = it.body()
+ val userProfileInfo = responseUserInfoDto?.data?.let { userData ->
+ HomeData.UserProfile(
+ R.drawable.sonminjae_profile,
+ userData.nickname,
+ userData.phone,
+ userData.authenticationId
+ )
+ }
+ _userInfo.postValue(userProfileInfo)
+ }.onFailure {
+ Log.e("HomeViewModel", it.message.toString())
+ }
+ }
+ }
+
+ fun fetchFriendsInfo() {
+ viewModelScope.launch(Dispatchers.IO) {
+ runCatching {
+ friendRepository.getFriendsInfo(2)
+ }.onSuccess {
+ val responseFriendsInfoDto = it.body()
+ val friendProfiles = responseFriendsInfoDto?.data?.map { friendData ->
+ HomeData.FriendProfile(
+ friendData.avatar,
+ "${friendData.firstName} ${friendData.lastName}",
+ friendData.email
+ )
+ }
+ _friendsInfo.postValue(friendProfiles)
+ }.onFailure {
+ Log.e("HomeViewModel", it.message.toString())
+ }
+ }
+ }
+
+ fun updateUserProfileUI(view: RecyclerView, it: HomeData.UserProfile) {
+ val adapter = view.adapter as? HomeViewAdapter
+ adapter?.setUserProfileList(it)
+ }
+
+
+ fun updateFriendProfilesUI(view: RecyclerView, it: List) {
+ val adapter = view.adapter as? HomeViewAdapter
+ adapter?.setFriendProfileList(it)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageFragment.kt b/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageFragment.kt
new file mode 100644
index 0000000..cbf873d
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageFragment.kt
@@ -0,0 +1,69 @@
+package com.sopt.now.ui.main.myPage
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import com.sopt.now.databinding.FragmentMypageBinding
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class MyPageFragment : Fragment() {
+ private var _binding: FragmentMypageBinding? = null
+ private val binding
+ get() = requireNotNull(_binding) {
+ "바인딩 객체를 생성해야 합니다."
+ }
+
+ private val viewModel by viewModels()
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentMypageBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ val memberId: String = activity?.intent?.getStringExtra("memberId") ?: "0"
+ fetchUserInfo(memberId)
+ observeUserInfo()
+ }
+
+ private fun fetchUserInfo(memberId: String?) {
+ viewModel.fetchUserInfo(memberId?.toInt() ?: 0)
+ }
+
+ private fun observeUserInfo() {
+ with(binding) {
+ viewModel.userInfo.observe(viewLifecycleOwner) {
+ it?.let {
+ tvMyPageShowName.text = it.data.nickname
+ tvMyPageShowId.text = it.data.authenticationId
+ tvMyPageShowPhoneNumber.text = it.data.phone
+ }
+ }
+ }
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+
+ companion object {
+ fun newInstance(memberId: String?): MyPageFragment {
+ val fragment = MyPageFragment()
+ val args = Bundle().apply {
+ putString("memberId", memberId)
+ }
+ fragment.arguments = args
+ return fragment
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageViewModel.kt b/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageViewModel.kt
new file mode 100644
index 0000000..e5daf9c
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageViewModel.kt
@@ -0,0 +1,35 @@
+package com.sopt.now.ui.main.myPage
+
+import android.util.Log
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.sopt.now.data.repository.UserRepository
+import com.sopt.now.data.response.ResponseUserInfoDto
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class MyPageViewModel
+@Inject constructor(
+ private val userRepository: UserRepository
+) : ViewModel() {
+ private val _userInfo = MutableLiveData()
+ val userInfo: LiveData
+ get() = _userInfo
+
+ fun fetchUserInfo(memberId: Int) {
+ viewModelScope.launch(Dispatchers.IO) {
+ runCatching {
+ userRepository.getUserInfo(memberId)
+ }.onSuccess {
+ _userInfo.postValue(it.body())
+ }.onFailure {
+ Log.e("MyPageViewModel", it.message.toString())
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/sopt/now/main/searchFragment/SearchFragment.kt b/app/src/main/java/com/sopt/now/ui/main/search/SearchFragment.kt
similarity index 90%
rename from app/src/main/java/com/sopt/now/main/searchFragment/SearchFragment.kt
rename to app/src/main/java/com/sopt/now/ui/main/search/SearchFragment.kt
index ec452e8..e7a5ad8 100644
--- a/app/src/main/java/com/sopt/now/main/searchFragment/SearchFragment.kt
+++ b/app/src/main/java/com/sopt/now/ui/main/search/SearchFragment.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.main.searchFragment
+package com.sopt.now.ui.main.search
import android.os.Bundle
import android.view.LayoutInflater
@@ -6,7 +6,9 @@ import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.sopt.now.databinding.FragmentSearchBinding
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class SearchFragment : Fragment() {
private var _binding: FragmentSearchBinding? = null
private val binding
diff --git a/app/src/main/java/com/sopt/now/signIn/SignInActivity.kt b/app/src/main/java/com/sopt/now/ui/signIn/SignInActivity.kt
similarity index 73%
rename from app/src/main/java/com/sopt/now/signIn/SignInActivity.kt
rename to app/src/main/java/com/sopt/now/ui/signIn/SignInActivity.kt
index e19c097..5c270a1 100644
--- a/app/src/main/java/com/sopt/now/signIn/SignInActivity.kt
+++ b/app/src/main/java/com/sopt/now/ui/signIn/SignInActivity.kt
@@ -1,14 +1,17 @@
-package com.sopt.now.signIn
+package com.sopt.now.ui.signIn
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
-import com.sopt.now.main.MainActivity
-import com.sopt.now.signUp.SignUpActivity
+import com.sopt.now.data.request.RequestSignInDto
import com.sopt.now.databinding.ActivitySigninBinding
+import com.sopt.now.ui.main.MainActivity
+import com.sopt.now.ui.signUp.SignUpActivity
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class SignInActivity : AppCompatActivity() {
private val binding by lazy { ActivitySigninBinding.inflate(layoutInflater) }
@@ -33,11 +36,10 @@ class SignInActivity : AppCompatActivity() {
private fun initObserver() {
viewModel.liveData.observe(this) {
- signInState ->
- Toast.makeText(this,signInState.message,Toast.LENGTH_SHORT).show()
- if(signInState.isSuccess) {
- val intent = Intent(this@SignInActivity, MainActivity::class.java).apply{
- signInState.memberId?.let { memberId -> putExtra("memberId",memberId) }
+ showToast(it.message)
+ if (it.isSuccess) {
+ val intent = Intent(this@SignInActivity, MainActivity::class.java).apply {
+ it.memberId?.let { memberId -> putExtra("memberId", memberId) }
}
startActivity(intent)
}
@@ -52,4 +54,8 @@ class SignInActivity : AppCompatActivity() {
password = password,
)
}
+
+ private fun showToast(message: String) {
+ Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/signIn/SignInState.kt b/app/src/main/java/com/sopt/now/ui/signIn/SignInState.kt
similarity index 78%
rename from app/src/main/java/com/sopt/now/signIn/SignInState.kt
rename to app/src/main/java/com/sopt/now/ui/signIn/SignInState.kt
index 8399f3f..f18b4a5 100644
--- a/app/src/main/java/com/sopt/now/signIn/SignInState.kt
+++ b/app/src/main/java/com/sopt/now/ui/signIn/SignInState.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.signIn
+package com.sopt.now.ui.signIn
data class SignInState(
val isSuccess: Boolean,
diff --git a/app/src/main/java/com/sopt/now/ui/signIn/SignInViewModel.kt b/app/src/main/java/com/sopt/now/ui/signIn/SignInViewModel.kt
new file mode 100644
index 0000000..bd4580d
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/ui/signIn/SignInViewModel.kt
@@ -0,0 +1,47 @@
+package com.sopt.now.ui.signIn
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.sopt.now.data.repository.AuthRepository
+import com.sopt.now.data.request.RequestSignInDto
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class SignInViewModel
+@Inject constructor(
+ private val authRepository: AuthRepository
+) : ViewModel() {
+ val liveData = MutableLiveData()
+
+ private val _navigateToMain = MutableLiveData()
+ val navigateToMain: LiveData
+ get() = _navigateToMain
+
+ fun signIn(request: RequestSignInDto) {
+ viewModelScope.launch(Dispatchers.IO) {
+ runCatching {
+ authRepository.signIn(request)
+ }.onSuccess {
+ val memberId = it.headers()["location"]
+ liveData.postValue(SignInState(true, "로그인 성공! 유저의 ID는 $memberId 입니둥", memberId))
+ moveToMainActivity()
+ }.onFailure {
+ val error = it.message
+ liveData.postValue(SignInState(false, "로그인 실패 $error", null))
+ }
+ }
+ }
+
+ private fun moveToMainActivity() {
+ _navigateToMain.postValue(true)
+ }
+
+ fun doneNavigatingToSignIn() {
+ _navigateToMain.postValue(false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/signUp/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt
similarity index 90%
rename from app/src/main/java/com/sopt/now/signUp/SignUpActivity.kt
rename to app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt
index d04813c..4fed723 100644
--- a/app/src/main/java/com/sopt/now/signUp/SignUpActivity.kt
+++ b/app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt
@@ -1,13 +1,16 @@
-package com.sopt.now.signUp
+package com.sopt.now.ui.signUp
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
+import com.sopt.now.data.request.RequestSignUpDto
import com.sopt.now.databinding.ActivitySignupBinding
-import com.sopt.now.signIn.SignInActivity
+import com.sopt.now.ui.signIn.SignInActivity
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class SignUpActivity : AppCompatActivity() {
private val binding by lazy { ActivitySignupBinding.inflate(layoutInflater) }
diff --git a/app/src/main/java/com/sopt/now/signUp/SignUpState.kt b/app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt
similarity index 71%
rename from app/src/main/java/com/sopt/now/signUp/SignUpState.kt
rename to app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt
index eb5b271..dcf5c9e 100644
--- a/app/src/main/java/com/sopt/now/signUp/SignUpState.kt
+++ b/app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.signUp
+package com.sopt.now.ui.signUp
data class SignUpState(
val isSuccess: Boolean,
diff --git a/app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt
new file mode 100644
index 0000000..e25e03e
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt
@@ -0,0 +1,45 @@
+package com.sopt.now.ui.signUp
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.sopt.now.data.repository.AuthRepository
+import com.sopt.now.data.request.RequestSignUpDto
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class SignUpViewModel
+@Inject constructor(
+ private val authRepository: AuthRepository
+) : ViewModel() {
+ val liveData = MutableLiveData()
+
+ private val _navigateToSignIn = MutableLiveData()
+ val navigateToSignIn: LiveData
+ get() = _navigateToSignIn
+
+ fun signUp(request: RequestSignUpDto) {
+ viewModelScope.launch(Dispatchers.IO) {
+ runCatching {
+ authRepository.signUp(request)
+ }.onSuccess {
+ liveData.postValue(SignUpState(true, "회원가입 성공"))
+ moveToSignInActivity()
+ }.onFailure {
+ liveData.postValue(SignUpState(false, "회원가입 실패"))
+ }
+ }
+ }
+
+ private fun moveToSignInActivity() {
+ _navigateToSignIn.postValue(true)
+ }
+
+ fun doneNavigatingToSignIn() {
+ _navigateToSignIn.postValue(false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mypage.xml b/app/src/main/res/layout/fragment_mypage.xml
index cf67fe2..c122dd0 100644
--- a/app/src/main/res/layout/fragment_mypage.xml
+++ b/app/src/main/res/layout/fragment_mypage.xml
@@ -59,32 +59,11 @@
app:layout_constraintTop_toBottomOf="@+id/tvMyPageId"
app:layout_constraintStart_toStartOf="parent"/>
-
-
-
-