diff --git a/app/build.gradle b/app/build.gradle
index 1462bad..1ce5ccf 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -3,6 +3,9 @@ plugins {
id 'org.jetbrains.kotlin.android'
id 'kotlin-parcelize'
id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.0'
+ id 'com.google.dagger.hilt.android'
+ id 'kotlin-android'
+ id 'kotlin-kapt'
}
Properties properties = new Properties()
@@ -74,4 +77,7 @@ dependencies {
implementation("com.squareup.okhttp3:logging-interceptor")
implementation ("com.github.bumptech.glide:glide:4.16.0")
+
+ implementation 'com.google.dagger:hilt-android:2.51'
+ kapt 'com.google.dagger:hilt-compiler:2.51.1'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 16fcdd1..e97c83e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,6 +5,7 @@
@@ -29,10 +30,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/datasource/AuthDataSource.kt b/app/src/main/java/com/sopt/now/data/datasource/AuthDataSource.kt
new file mode 100644
index 0000000..d6546fe
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/datasource/AuthDataSource.kt
@@ -0,0 +1,14 @@
+package com.sopt.now.data.datasource
+
+import com.sopt.now.data.dto.request.RequestLoginDto
+import com.sopt.now.data.dto.request.RequestSignUpDto
+import com.sopt.now.data.dto.response.ResponseLoginDto
+import com.sopt.now.data.dto.response.ResponseSignUpDto
+import retrofit2.Response
+import javax.inject.Singleton
+
+@Singleton
+interface AuthDataSource {
+ suspend fun signUp(request: RequestSignUpDto): Response
+ suspend fun login(request: RequestLoginDto): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/datasource/FriendDataSource.kt b/app/src/main/java/com/sopt/now/data/datasource/FriendDataSource.kt
new file mode 100644
index 0000000..e233ddc
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/datasource/FriendDataSource.kt
@@ -0,0 +1,10 @@
+package com.sopt.now.data.datasource
+
+import com.sopt.now.data.dto.response.ResponseFriendsDto
+import retrofit2.Response
+import javax.inject.Singleton
+
+@Singleton
+interface FriendDataSource {
+ suspend fun getFriends(page: Int): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/datasource/UserDataSource.kt b/app/src/main/java/com/sopt/now/data/datasource/UserDataSource.kt
new file mode 100644
index 0000000..128fd8b
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/datasource/UserDataSource.kt
@@ -0,0 +1,13 @@
+package com.sopt.now.data.datasource
+
+import com.sopt.now.data.dto.request.RequestChangePwdDto
+import com.sopt.now.data.dto.response.ResponseChangePwdDto
+import com.sopt.now.data.dto.response.ResponseUserInfoDto
+import retrofit2.Response
+import javax.inject.Singleton
+
+@Singleton
+interface UserDataSource {
+ suspend fun getUserInfo(userId: Int): Response
+ suspend fun changeUserPwd(userId: Int, pwd: RequestChangePwdDto): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/datasourceImpl/AuthDataSourceImpl.kt b/app/src/main/java/com/sopt/now/data/datasourceImpl/AuthDataSourceImpl.kt
new file mode 100644
index 0000000..1d8fa90
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/datasourceImpl/AuthDataSourceImpl.kt
@@ -0,0 +1,24 @@
+package com.sopt.now.data.datasourceImpl
+
+import com.sopt.now.data.datasource.AuthDataSource
+import com.sopt.now.data.dto.request.RequestLoginDto
+import com.sopt.now.data.dto.request.RequestSignUpDto
+import com.sopt.now.data.dto.response.ResponseLoginDto
+import com.sopt.now.data.dto.response.ResponseSignUpDto
+import com.sopt.now.data.service.AuthService
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class AuthDataSourceImpl @Inject constructor(
+ private val authService: AuthService
+) : AuthDataSource {
+ override suspend fun signUp(request: RequestSignUpDto): Response {
+ return authService.signUp(request)
+ }
+
+ override suspend fun login(request: RequestLoginDto): Response {
+ return authService.login(request)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/datasourceImpl/FriendDataSourceImpl.kt b/app/src/main/java/com/sopt/now/data/datasourceImpl/FriendDataSourceImpl.kt
new file mode 100644
index 0000000..83db98f
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/datasourceImpl/FriendDataSourceImpl.kt
@@ -0,0 +1,17 @@
+package com.sopt.now.data.datasourceImpl
+
+import com.sopt.now.data.datasource.FriendDataSource
+import com.sopt.now.data.dto.response.ResponseFriendsDto
+import com.sopt.now.data.service.FriendService
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class FriendDataSourceImpl @Inject constructor(
+ private val friendService: FriendService
+) : FriendDataSource {
+ override suspend fun getFriends(page: Int): Response {
+ return friendService.getFriends(page)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/datasourceImpl/UserDataSourceImpl.kt b/app/src/main/java/com/sopt/now/data/datasourceImpl/UserDataSourceImpl.kt
new file mode 100644
index 0000000..2e02b62
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/datasourceImpl/UserDataSourceImpl.kt
@@ -0,0 +1,26 @@
+package com.sopt.now.data.datasourceImpl
+
+import com.sopt.now.data.datasource.UserDataSource
+import com.sopt.now.data.dto.request.RequestChangePwdDto
+import com.sopt.now.data.dto.response.ResponseChangePwdDto
+import com.sopt.now.data.dto.response.ResponseUserInfoDto
+import com.sopt.now.data.service.UserService
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class UserDataSourceImpl @Inject constructor(
+ private val userService: UserService
+) : UserDataSource {
+ override suspend fun getUserInfo(userId: Int): Response {
+ return userService.getUserInfo(userId)
+ }
+
+ override suspend fun changeUserPwd(
+ userId: Int,
+ pwd: RequestChangePwdDto
+ ): Response {
+ return userService.changeUserPwd(userId, pwd)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/di/DataModule.kt b/app/src/main/java/com/sopt/now/data/di/DataModule.kt
new file mode 100644
index 0000000..d8bbdd5
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/di/DataModule.kt
@@ -0,0 +1,73 @@
+package com.sopt.now.data.di
+
+import com.sopt.now.data.datasource.AuthDataSource
+import com.sopt.now.data.datasource.FriendDataSource
+import com.sopt.now.data.datasource.UserDataSource
+import com.sopt.now.data.datasourceImpl.AuthDataSourceImpl
+import com.sopt.now.data.datasourceImpl.FriendDataSourceImpl
+import com.sopt.now.data.datasourceImpl.UserDataSourceImpl
+import com.sopt.now.data.repositoryImpl.AuthRepositoryImpl
+import com.sopt.now.data.repositoryImpl.FriendRepositoryImpl
+import com.sopt.now.data.repositoryImpl.UserRepositoryImpl
+import com.sopt.now.data.service.AuthService
+import com.sopt.now.data.service.FriendService
+import com.sopt.now.data.service.UserService
+import com.sopt.now.domain.repository.AuthRepository
+import com.sopt.now.domain.repository.FriendRepository
+import com.sopt.now.domain.repository.UserRepository
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object DataModule {
+ @Singleton
+ @Provides
+ fun provideAuthDataSource(
+ authService: AuthService
+ ): AuthDataSource {
+ return AuthDataSourceImpl(authService)
+ }
+
+ @Singleton
+ @Provides
+ fun provideAuthRepository(
+ authDataSource: AuthDataSource
+ ): AuthRepository {
+ return AuthRepositoryImpl(authDataSource)
+ }
+ @Singleton
+ @Provides
+ fun provideUserDataSource(
+ userService: UserService
+ ): UserDataSource {
+ return UserDataSourceImpl(userService)
+ }
+
+ @Singleton
+ @Provides
+ fun provideUserRepository(
+ userDataSource: UserDataSource
+ ): UserRepository {
+ return UserRepositoryImpl(userDataSource)
+ }
+
+ @Singleton
+ @Provides
+ fun provideFriendDataSource(
+ friendService: FriendService
+ ): FriendDataSource {
+ return FriendDataSourceImpl(friendService)
+ }
+
+ @Singleton
+ @Provides
+ fun provideFriendRepository(
+ friendDataSource: FriendDataSource
+ ): FriendRepository {
+ return FriendRepositoryImpl(friendDataSource)
+ }
+}
\ 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..2b56f02
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/di/NetworkModule.kt
@@ -0,0 +1,67 @@
+package com.sopt.now.data.di
+
+import android.util.Log
+import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
+import com.sopt.now.BuildConfig.AUTH_BASE_URL
+import com.sopt.now.BuildConfig.FRIEND_BASE_URL
+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("OkHttp", 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()
+ .addConverterFactory(json.asConverterFactory(CONTENT_TYPE.toMediaType()))
+ .client(okHttpClient)
+ }
+
+ @Singleton
+ @Provides
+ fun provideAuthService(retrofit: Retrofit.Builder): AuthService {
+ return retrofit.baseUrl(AUTH_BASE_URL).build().create(AuthService::class.java)
+ }
+
+ @Singleton
+ @Provides
+ fun provideUserService(retrofit: Retrofit.Builder): UserService {
+ return retrofit.baseUrl(AUTH_BASE_URL).build().create(UserService::class.java)
+ }
+
+ @Singleton
+ @Provides
+ fun provideFriendService(retrofit: Retrofit.Builder): FriendService {
+ return retrofit.baseUrl(FRIEND_BASE_URL).build().create(FriendService::class.java)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/remote/request/RequestChangePwdDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestChangePwdDto.kt
similarity index 90%
rename from app/src/main/java/com/sopt/now/remote/request/RequestChangePwdDto.kt
rename to app/src/main/java/com/sopt/now/data/dto/request/RequestChangePwdDto.kt
index d6f6914..0892694 100644
--- a/app/src/main/java/com/sopt/now/remote/request/RequestChangePwdDto.kt
+++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestChangePwdDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.remote.request
+package com.sopt.now.data.dto.request
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/remote/request/RequestLoginDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestLoginDto.kt
similarity index 86%
rename from app/src/main/java/com/sopt/now/remote/request/RequestLoginDto.kt
rename to app/src/main/java/com/sopt/now/data/dto/request/RequestLoginDto.kt
index 05e8c0f..696d54b 100644
--- a/app/src/main/java/com/sopt/now/remote/request/RequestLoginDto.kt
+++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestLoginDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.remote.request
+package com.sopt.now.data.dto.request
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/remote/request/RequestSignUpDto.kt b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt
similarity index 90%
rename from app/src/main/java/com/sopt/now/remote/request/RequestSignUpDto.kt
rename to app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt
index 7106e3e..ff95896 100644
--- a/app/src/main/java/com/sopt/now/remote/request/RequestSignUpDto.kt
+++ b/app/src/main/java/com/sopt/now/data/dto/request/RequestSignUpDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.remote.request
+package com.sopt.now.data.dto.request
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/remote/response/ResponseChangePwdDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseChangePwdDto.kt
similarity index 85%
rename from app/src/main/java/com/sopt/now/remote/response/ResponseChangePwdDto.kt
rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseChangePwdDto.kt
index 92c756a..e5febda 100644
--- a/app/src/main/java/com/sopt/now/remote/response/ResponseChangePwdDto.kt
+++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseChangePwdDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.remote.response
+package com.sopt.now.data.dto.response
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/remote/response/ResponseFriendsDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseFriendsDto.kt
similarity index 58%
rename from app/src/main/java/com/sopt/now/remote/response/ResponseFriendsDto.kt
rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseFriendsDto.kt
index 2d8a3b0..45efc90 100644
--- a/app/src/main/java/com/sopt/now/remote/response/ResponseFriendsDto.kt
+++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseFriendsDto.kt
@@ -1,5 +1,6 @@
-package com.sopt.now.remote.response
+package com.sopt.now.data.dto.response
+import com.sopt.now.domain.entity.FriendEntity
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@@ -14,24 +15,10 @@ data class ResponseFriendsDto(
@SerialName("total_pages")
val totalPages: Int,
@SerialName("data")
- val `data`: List,
+ val `data`: List,
@SerialName("support")
val support: Support
) {
- @Serializable
- data class Data(
- @SerialName("id")
- val id: Int,
- @SerialName("email")
- val email: String,
- @SerialName("first_name")
- val firstName: String,
- @SerialName("last_name")
- val lastName: String,
- @SerialName("avatar")
- val avatar: String
- )
-
@Serializable
data class Support(
@SerialName("url")
diff --git a/app/src/main/java/com/sopt/now/remote/response/ResponseLoginDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseLoginDto.kt
similarity index 85%
rename from app/src/main/java/com/sopt/now/remote/response/ResponseLoginDto.kt
rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseLoginDto.kt
index 7098a2d..6c6e79f 100644
--- a/app/src/main/java/com/sopt/now/remote/response/ResponseLoginDto.kt
+++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseLoginDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.remote.response
+package com.sopt.now.data.dto.response
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/remote/response/ResponseSignUpDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseSignUpDto.kt
similarity index 85%
rename from app/src/main/java/com/sopt/now/remote/response/ResponseSignUpDto.kt
rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseSignUpDto.kt
index 7a35329..9220331 100644
--- a/app/src/main/java/com/sopt/now/remote/response/ResponseSignUpDto.kt
+++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseSignUpDto.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.remote.response
+package com.sopt.now.data.dto.response
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/remote/response/ResponseUserInfoDto.kt b/app/src/main/java/com/sopt/now/data/dto/response/ResponseUserInfoDto.kt
similarity index 76%
rename from app/src/main/java/com/sopt/now/remote/response/ResponseUserInfoDto.kt
rename to app/src/main/java/com/sopt/now/data/dto/response/ResponseUserInfoDto.kt
index 069ab79..945a87e 100644
--- a/app/src/main/java/com/sopt/now/remote/response/ResponseUserInfoDto.kt
+++ b/app/src/main/java/com/sopt/now/data/dto/response/ResponseUserInfoDto.kt
@@ -1,6 +1,6 @@
-package com.sopt.now.remote.response
+package com.sopt.now.data.dto.response
-import com.sopt.now.util.user.User
+import com.sopt.now.presentation.home.User
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/data/repositoryImpl/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repositoryImpl/AuthRepositoryImpl.kt
new file mode 100644
index 0000000..12a3ac6
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/repositoryImpl/AuthRepositoryImpl.kt
@@ -0,0 +1,24 @@
+package com.sopt.now.data.repositoryImpl
+
+import com.sopt.now.data.datasource.AuthDataSource
+import com.sopt.now.data.dto.request.RequestLoginDto
+import com.sopt.now.data.dto.request.RequestSignUpDto
+import com.sopt.now.data.dto.response.ResponseLoginDto
+import com.sopt.now.data.dto.response.ResponseSignUpDto
+import com.sopt.now.domain.repository.AuthRepository
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class AuthRepositoryImpl @Inject constructor(
+ private val authDataSource: AuthDataSource
+) : AuthRepository {
+ override suspend fun signUp(request: RequestSignUpDto): Response {
+ return authDataSource.signUp(request)
+ }
+
+ override suspend fun login(request: RequestLoginDto): Response {
+ return authDataSource.login(request)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/repositoryImpl/FriendRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repositoryImpl/FriendRepositoryImpl.kt
new file mode 100644
index 0000000..188d121
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/repositoryImpl/FriendRepositoryImpl.kt
@@ -0,0 +1,17 @@
+package com.sopt.now.data.repositoryImpl
+
+import com.sopt.now.data.datasource.FriendDataSource
+import com.sopt.now.data.dto.response.ResponseFriendsDto
+import com.sopt.now.domain.repository.FriendRepository
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class FriendRepositoryImpl @Inject constructor(
+ private val friendDataSource: FriendDataSource
+) : FriendRepository {
+ override suspend fun getFriends(page: Int): Response {
+ return friendDataSource.getFriends(page)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/data/repositoryImpl/UserRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repositoryImpl/UserRepositoryImpl.kt
new file mode 100644
index 0000000..e6e8079
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/data/repositoryImpl/UserRepositoryImpl.kt
@@ -0,0 +1,26 @@
+package com.sopt.now.data.repositoryImpl
+
+import com.sopt.now.data.datasource.UserDataSource
+import com.sopt.now.data.dto.request.RequestChangePwdDto
+import com.sopt.now.data.dto.response.ResponseChangePwdDto
+import com.sopt.now.data.dto.response.ResponseUserInfoDto
+import com.sopt.now.domain.repository.UserRepository
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class UserRepositoryImpl @Inject constructor(
+ private val userDataSource: UserDataSource
+) : UserRepository {
+ override suspend fun getUserInfo(userId: Int): Response {
+ return userDataSource.getUserInfo(userId)
+ }
+
+ override suspend fun changeUserPwd(
+ userId: Int,
+ request: RequestChangePwdDto
+ ): Response {
+ return userDataSource.changeUserPwd(userId, request)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/remote/service/AuthService.kt b/app/src/main/java/com/sopt/now/data/service/AuthService.kt
similarity index 57%
rename from app/src/main/java/com/sopt/now/remote/service/AuthService.kt
rename to app/src/main/java/com/sopt/now/data/service/AuthService.kt
index 97e78d7..f8426b1 100644
--- a/app/src/main/java/com/sopt/now/remote/service/AuthService.kt
+++ b/app/src/main/java/com/sopt/now/data/service/AuthService.kt
@@ -1,10 +1,9 @@
-package com.sopt.now.remote.service
+package com.sopt.now.data.service
-import com.sopt.now.remote.request.RequestLoginDto
-import com.sopt.now.remote.request.RequestSignUpDto
-import com.sopt.now.remote.response.ResponseLoginDto
-import com.sopt.now.remote.response.ResponseSignUpDto
-import retrofit2.Call
+import com.sopt.now.data.dto.request.RequestLoginDto
+import com.sopt.now.data.dto.request.RequestSignUpDto
+import com.sopt.now.data.dto.response.ResponseLoginDto
+import com.sopt.now.data.dto.response.ResponseSignUpDto
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.POST
diff --git a/app/src/main/java/com/sopt/now/remote/service/FriendService.kt b/app/src/main/java/com/sopt/now/data/service/FriendService.kt
similarity index 73%
rename from app/src/main/java/com/sopt/now/remote/service/FriendService.kt
rename to app/src/main/java/com/sopt/now/data/service/FriendService.kt
index b0d07fa..f960634 100644
--- a/app/src/main/java/com/sopt/now/remote/service/FriendService.kt
+++ b/app/src/main/java/com/sopt/now/data/service/FriendService.kt
@@ -1,6 +1,6 @@
-package com.sopt.now.remote.service
+package com.sopt.now.data.service
-import com.sopt.now.remote.response.ResponseFriendsDto
+import com.sopt.now.data.dto.response.ResponseFriendsDto
import retrofit2.Call
import retrofit2.Response
import retrofit2.http.GET
diff --git a/app/src/main/java/com/sopt/now/remote/service/UserService.kt b/app/src/main/java/com/sopt/now/data/service/UserService.kt
similarity index 70%
rename from app/src/main/java/com/sopt/now/remote/service/UserService.kt
rename to app/src/main/java/com/sopt/now/data/service/UserService.kt
index 655cde3..e9abb70 100644
--- a/app/src/main/java/com/sopt/now/remote/service/UserService.kt
+++ b/app/src/main/java/com/sopt/now/data/service/UserService.kt
@@ -1,8 +1,8 @@
-package com.sopt.now.remote.service
+package com.sopt.now.data.service
-import com.sopt.now.remote.request.RequestChangePwdDto
-import com.sopt.now.remote.response.ResponseChangePwdDto
-import com.sopt.now.remote.response.ResponseUserInfoDto
+import com.sopt.now.data.dto.request.RequestChangePwdDto
+import com.sopt.now.data.dto.response.ResponseChangePwdDto
+import com.sopt.now.data.dto.response.ResponseUserInfoDto
import retrofit2.Call
import retrofit2.Response
import retrofit2.http.Body
diff --git a/app/src/main/java/com/sopt/now/domain/entity/FriendEntity.kt b/app/src/main/java/com/sopt/now/domain/entity/FriendEntity.kt
new file mode 100644
index 0000000..870ef57
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/domain/entity/FriendEntity.kt
@@ -0,0 +1,18 @@
+package com.sopt.now.domain.entity
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class FriendEntity(
+ @SerialName("id")
+ val id: Int,
+ @SerialName("email")
+ val email: String,
+ @SerialName("first_name")
+ val firstName: String,
+ @SerialName("last_name")
+ val lastName: String,
+ @SerialName("avatar")
+ val avatar: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt
new file mode 100644
index 0000000..2556fa2
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/domain/repository/AuthRepository.kt
@@ -0,0 +1,16 @@
+package com.sopt.now.domain.repository
+
+import com.sopt.now.data.dto.request.RequestLoginDto
+import com.sopt.now.data.dto.request.RequestSignUpDto
+import com.sopt.now.data.dto.response.ResponseLoginDto
+import com.sopt.now.data.dto.response.ResponseSignUpDto
+import com.sopt.now.data.service.AuthService
+import retrofit2.Response
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+interface AuthRepository{
+ suspend fun signUp(request: RequestSignUpDto): Response
+ suspend fun login(request: RequestLoginDto): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/domain/repository/FriendRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/FriendRepository.kt
new file mode 100644
index 0000000..c871123
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/domain/repository/FriendRepository.kt
@@ -0,0 +1,10 @@
+package com.sopt.now.domain.repository
+
+import com.sopt.now.data.dto.response.ResponseFriendsDto
+import retrofit2.Response
+import javax.inject.Singleton
+
+@Singleton
+interface FriendRepository {
+ suspend fun getFriends(page: Int): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/domain/repository/UserRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/UserRepository.kt
new file mode 100644
index 0000000..1d9f4f4
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/domain/repository/UserRepository.kt
@@ -0,0 +1,13 @@
+package com.sopt.now.domain.repository
+
+import com.sopt.now.data.dto.request.RequestChangePwdDto
+import com.sopt.now.data.dto.response.ResponseChangePwdDto
+import com.sopt.now.data.dto.response.ResponseUserInfoDto
+import retrofit2.Response
+import javax.inject.Singleton
+
+@Singleton
+interface UserRepository {
+ suspend fun getUserInfo(userId: Int): Response
+ suspend fun changeUserPwd(userId: Int, request: RequestChangePwdDto) : Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdActivity.kt b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdActivity.kt
similarity index 83%
rename from app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdActivity.kt
rename to app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdActivity.kt
index 339c259..d5b38a5 100644
--- a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdActivity.kt
+++ b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdActivity.kt
@@ -1,16 +1,19 @@
-package com.sopt.now.ui.changePwd
+package com.sopt.now.presentation.changePwd
import android.os.Bundle
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
+import com.sopt.now.data.dto.request.RequestChangePwdDto
import com.sopt.now.databinding.ActivityChangePwdBinding
-import com.sopt.now.remote.request.RequestChangePwdDto
-import com.sopt.now.ui.main.MainViewModel.Companion.USER_INFO
+import com.sopt.now.presentation.main.MainViewModel.Companion.USER_INFO
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class ChangePwdActivity : AppCompatActivity() {
private lateinit var binding: ActivityChangePwdBinding
- private val viewModel by viewModels()
+ private val viewModel: ChangePwdViewModel by viewModels()
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityChangePwdBinding.inflate(layoutInflater)
diff --git a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdState.kt b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdState.kt
similarity index 65%
rename from app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdState.kt
rename to app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdState.kt
index 80e48f9..67bee5f 100644
--- a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdState.kt
+++ b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdState.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.ui.changePwd
+package com.sopt.now.presentation.changePwd
data class ChangePwdState(
val isSuccess: Boolean,
diff --git a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdViewModel.kt b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdViewModel.kt
similarity index 69%
rename from app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdViewModel.kt
rename to app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdViewModel.kt
index a78c3ac..8bdbd31 100644
--- a/app/src/main/java/com/sopt/now/ui/changePwd/ChangePwdViewModel.kt
+++ b/app/src/main/java/com/sopt/now/presentation/changePwd/ChangePwdViewModel.kt
@@ -1,14 +1,19 @@
-package com.sopt.now.ui.changePwd
+package com.sopt.now.presentation.changePwd
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.sopt.now.remote.request.RequestChangePwdDto
-import com.sopt.now.ui.base.ServicePool.userService
+import com.sopt.now.data.dto.request.RequestChangePwdDto
+import com.sopt.now.domain.repository.UserRepository
+import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
+import javax.inject.Inject
-class ChangePwdViewModel : ViewModel() {
+@HiltViewModel
+class ChangePwdViewModel @Inject constructor(
+ private val userRepository: UserRepository
+) : ViewModel() {
private val _changePwdState = MutableLiveData()
val changePwdState: LiveData
get() = _changePwdState
@@ -16,7 +21,7 @@ class ChangePwdViewModel : ViewModel() {
fun changePwd(userId: Int, request: RequestChangePwdDto) {
viewModelScope.launch {
runCatching {
- userService.changeUserPwd(userId, request)
+ userRepository.changeUserPwd(userId, request)
}.onSuccess {
if (it.code() in 200..299) {
_changePwdState.value = ChangePwdState(true, "비밀번호 변경 성공")
diff --git a/app/src/main/java/com/sopt/now/util/friend/Friend.kt b/app/src/main/java/com/sopt/now/presentation/home/Friend.kt
similarity index 73%
rename from app/src/main/java/com/sopt/now/util/friend/Friend.kt
rename to app/src/main/java/com/sopt/now/presentation/home/Friend.kt
index 4f794b2..647493b 100644
--- a/app/src/main/java/com/sopt/now/util/friend/Friend.kt
+++ b/app/src/main/java/com/sopt/now/presentation/home/Friend.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.util.friend
+package com.sopt.now.presentation.home
data class Friend(
val profileImage: String,
diff --git a/app/src/main/java/com/sopt/now/util/friend/FriendAdapter.kt b/app/src/main/java/com/sopt/now/presentation/home/FriendAdapter.kt
similarity index 93%
rename from app/src/main/java/com/sopt/now/util/friend/FriendAdapter.kt
rename to app/src/main/java/com/sopt/now/presentation/home/FriendAdapter.kt
index 3996a75..29157d1 100644
--- a/app/src/main/java/com/sopt/now/util/friend/FriendAdapter.kt
+++ b/app/src/main/java/com/sopt/now/presentation/home/FriendAdapter.kt
@@ -1,12 +1,10 @@
-package com.sopt.now.util.friend
+package com.sopt.now.presentation.home
-import com.sopt.now.util.user.User
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.sopt.now.databinding.ItemFriendBinding
import com.sopt.now.databinding.ItemUserBinding
-import com.sopt.now.util.user.UserViewHolder
class FriendAdapter() : RecyclerView.Adapter() {
private var friendList: List = emptyList()
diff --git a/app/src/main/java/com/sopt/now/util/friend/FriendViewHolder.kt b/app/src/main/java/com/sopt/now/presentation/home/FriendViewHolder.kt
similarity index 87%
rename from app/src/main/java/com/sopt/now/util/friend/FriendViewHolder.kt
rename to app/src/main/java/com/sopt/now/presentation/home/FriendViewHolder.kt
index cf3fe28..d4dfcad 100644
--- a/app/src/main/java/com/sopt/now/util/friend/FriendViewHolder.kt
+++ b/app/src/main/java/com/sopt/now/presentation/home/FriendViewHolder.kt
@@ -1,8 +1,7 @@
-package com.sopt.now.util.friend
+package com.sopt.now.presentation.home
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
-import com.bumptech.glide.load.resource.bitmap.CircleCrop
import com.sopt.now.R
import com.sopt.now.databinding.ItemFriendBinding
diff --git a/app/src/main/java/com/sopt/now/ui/home/HomeFragment.kt b/app/src/main/java/com/sopt/now/presentation/home/HomeFragment.kt
similarity index 82%
rename from app/src/main/java/com/sopt/now/ui/home/HomeFragment.kt
rename to app/src/main/java/com/sopt/now/presentation/home/HomeFragment.kt
index e6d47bd..9a12d6a 100644
--- a/app/src/main/java/com/sopt/now/ui/home/HomeFragment.kt
+++ b/app/src/main/java/com/sopt/now/presentation/home/HomeFragment.kt
@@ -1,18 +1,18 @@
-package com.sopt.now.ui.home
+package com.sopt.now.presentation.home
import android.os.Bundle
import android.view.View
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import com.sopt.now.databinding.FragmentHomeBinding
-import com.sopt.now.ui.base.BindingFragment
-import com.sopt.now.ui.main.MainViewModel.Companion.LOGIN_INFO
-import com.sopt.now.util.friend.FriendAdapter
-import com.sopt.now.util.user.User
+import com.sopt.now.presentation.main.MainViewModel.Companion.LOGIN_INFO
+import com.sopt.now.util.BindingFragment
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class HomeFragment() : BindingFragment(FragmentHomeBinding::inflate) {
private val friendAdapter by lazy { FriendAdapter() }
- private val viewModel by activityViewModels()
+ private val viewModel: HomeViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
diff --git a/app/src/main/java/com/sopt/now/ui/home/HomeViewModel.kt b/app/src/main/java/com/sopt/now/presentation/home/HomeViewModel.kt
similarity index 74%
rename from app/src/main/java/com/sopt/now/ui/home/HomeViewModel.kt
rename to app/src/main/java/com/sopt/now/presentation/home/HomeViewModel.kt
index ce05954..306583b 100644
--- a/app/src/main/java/com/sopt/now/ui/home/HomeViewModel.kt
+++ b/app/src/main/java/com/sopt/now/presentation/home/HomeViewModel.kt
@@ -1,18 +1,22 @@
-package com.sopt.now.ui.home
+package com.sopt.now.presentation.home
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.sopt.now.ui.base.ServicePool.friendService
-import com.sopt.now.ui.base.ServicePool.userService
-import com.sopt.now.util.friend.Friend
-import com.sopt.now.util.user.User
+import com.sopt.now.domain.repository.FriendRepository
+import com.sopt.now.domain.repository.UserRepository
+import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import retrofit2.HttpException
+import javax.inject.Inject
-class HomeViewModel : ViewModel() {
+@HiltViewModel
+class HomeViewModel @Inject constructor(
+ private val friendRepository: FriendRepository,
+ private val userRepository: UserRepository
+) : ViewModel() {
private val _friends = MutableLiveData>()
val friends: LiveData>
get() = _friends
@@ -24,7 +28,7 @@ class HomeViewModel : ViewModel() {
fun fetchFriends(page: Int) {
viewModelScope.launch {
runCatching {
- friendService.getFriends(page)
+ friendRepository.getFriends(page)
}.onSuccess {
val friends = it.body()?.data ?: emptyList()
_friends.postValue(friends.map { Friend(it.avatar, it.firstName, it.email) })
@@ -43,7 +47,7 @@ class HomeViewModel : ViewModel() {
fun fetchUserInfo(userId: Int) {
viewModelScope.launch {
runCatching {
- userService.getUserInfo(userId)
+ userRepository.getUserInfo(userId)
}.onSuccess {
_userInfo.value = it.body()?.data
}.onFailure {
diff --git a/app/src/main/java/com/sopt/now/util/user/User.kt b/app/src/main/java/com/sopt/now/presentation/home/User.kt
similarity index 80%
rename from app/src/main/java/com/sopt/now/util/user/User.kt
rename to app/src/main/java/com/sopt/now/presentation/home/User.kt
index c06f1eb..114083f 100644
--- a/app/src/main/java/com/sopt/now/util/user/User.kt
+++ b/app/src/main/java/com/sopt/now/presentation/home/User.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.util.user
+package com.sopt.now.presentation.home
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/com/sopt/now/util/user/UserViewHolder.kt b/app/src/main/java/com/sopt/now/presentation/home/UserViewHolder.kt
similarity index 90%
rename from app/src/main/java/com/sopt/now/util/user/UserViewHolder.kt
rename to app/src/main/java/com/sopt/now/presentation/home/UserViewHolder.kt
index 40b8562..fef69ab 100644
--- a/app/src/main/java/com/sopt/now/util/user/UserViewHolder.kt
+++ b/app/src/main/java/com/sopt/now/presentation/home/UserViewHolder.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.util.user
+package com.sopt.now.presentation.home
import androidx.recyclerview.widget.RecyclerView
import com.sopt.now.databinding.ItemUserBinding
diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/presentation/login/LoginActivity.kt
similarity index 88%
rename from app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt
rename to app/src/main/java/com/sopt/now/presentation/login/LoginActivity.kt
index e04f3cf..9058603 100644
--- a/app/src/main/java/com/sopt/now/ui/login/LoginActivity.kt
+++ b/app/src/main/java/com/sopt/now/presentation/login/LoginActivity.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.ui.login
+package com.sopt.now.presentation.login
import android.content.Intent
import android.os.Bundle
@@ -8,15 +8,17 @@ import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.sopt.now.R
+import com.sopt.now.data.dto.request.RequestLoginDto
import com.sopt.now.databinding.ActivityLoginBinding
-import com.sopt.now.remote.request.RequestLoginDto
-import com.sopt.now.ui.main.MainActivity
-import com.sopt.now.ui.main.MainViewModel.Companion.LOGIN_INFO
-import com.sopt.now.ui.signUp.SignUpActivity
+import com.sopt.now.presentation.main.MainActivity
+import com.sopt.now.presentation.main.MainViewModel.Companion.LOGIN_INFO
+import com.sopt.now.presentation.signUp.SignUpActivity
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class LoginActivity : AppCompatActivity() {
private lateinit var binding: ActivityLoginBinding
- private val viewModel by viewModels()
+ private val viewModel: LoginViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginState.kt b/app/src/main/java/com/sopt/now/presentation/login/LoginState.kt
similarity index 73%
rename from app/src/main/java/com/sopt/now/ui/login/LoginState.kt
rename to app/src/main/java/com/sopt/now/presentation/login/LoginState.kt
index 2341c47..bd7c309 100644
--- a/app/src/main/java/com/sopt/now/ui/login/LoginState.kt
+++ b/app/src/main/java/com/sopt/now/presentation/login/LoginState.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.ui.login
+package com.sopt.now.presentation.login
data class LoginState(
val isSuccess: Boolean,
diff --git a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/presentation/login/LoginViewModel.kt
similarity index 70%
rename from app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt
rename to app/src/main/java/com/sopt/now/presentation/login/LoginViewModel.kt
index 4fe16e5..3cd0b56 100644
--- a/app/src/main/java/com/sopt/now/ui/login/LoginViewModel.kt
+++ b/app/src/main/java/com/sopt/now/presentation/login/LoginViewModel.kt
@@ -1,14 +1,19 @@
-package com.sopt.now.ui.login
+package com.sopt.now.presentation.login
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.sopt.now.remote.request.RequestLoginDto
-import com.sopt.now.ui.base.ServicePool.authService
+import com.sopt.now.data.dto.request.RequestLoginDto
+import com.sopt.now.domain.repository.AuthRepository
+import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
+import javax.inject.Inject
-class LoginViewModel : ViewModel() {
+@HiltViewModel
+class LoginViewModel @Inject constructor(
+ private val authRepository: AuthRepository
+) : ViewModel() {
private val _loginState = MutableLiveData()
val loginState: LiveData
get() = _loginState
@@ -16,7 +21,7 @@ class LoginViewModel : ViewModel() {
fun login(request: RequestLoginDto) {
viewModelScope.launch {
runCatching {
- authService.login(request)
+ authRepository.login(request)
}.onSuccess {
if (it.code() in 200..299) {
val userId = it.headers()["location"]
diff --git a/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt b/app/src/main/java/com/sopt/now/presentation/main/MainActivity.kt
similarity index 85%
rename from app/src/main/java/com/sopt/now/ui/main/MainActivity.kt
rename to app/src/main/java/com/sopt/now/presentation/main/MainActivity.kt
index 3ce6685..1d0a8d5 100644
--- a/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt
+++ b/app/src/main/java/com/sopt/now/presentation/main/MainActivity.kt
@@ -1,15 +1,16 @@
-package com.sopt.now.ui.main
+package com.sopt.now.presentation.main
import android.os.Bundle
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.ui.home.HomeFragment
-import com.sopt.now.ui.mypage.MyPageFragment
-import com.sopt.now.ui.search.SearchFragment
-
+import com.sopt.now.presentation.home.HomeFragment
+import com.sopt.now.presentation.mypage.MyPageFragment
+import com.sopt.now.presentation.search.SearchFragment
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
diff --git a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt b/app/src/main/java/com/sopt/now/presentation/main/MainViewModel.kt
similarity index 82%
rename from app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt
rename to app/src/main/java/com/sopt/now/presentation/main/MainViewModel.kt
index 00a3a15..020d9b5 100644
--- a/app/src/main/java/com/sopt/now/ui/main/MainViewModel.kt
+++ b/app/src/main/java/com/sopt/now/presentation/main/MainViewModel.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.ui.main
+package com.sopt.now.presentation.main
import androidx.lifecycle.ViewModel
diff --git a/app/src/main/java/com/sopt/now/ui/mypage/MyPageFragment.kt b/app/src/main/java/com/sopt/now/presentation/mypage/MyPageFragment.kt
similarity index 81%
rename from app/src/main/java/com/sopt/now/ui/mypage/MyPageFragment.kt
rename to app/src/main/java/com/sopt/now/presentation/mypage/MyPageFragment.kt
index 8e0c515..c37eaa0 100644
--- a/app/src/main/java/com/sopt/now/ui/mypage/MyPageFragment.kt
+++ b/app/src/main/java/com/sopt/now/presentation/mypage/MyPageFragment.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.ui.mypage
+package com.sopt.now.presentation.mypage
import android.content.Context.MODE_PRIVATE
import android.content.Intent
@@ -8,15 +8,17 @@ import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.activityViewModels
import com.sopt.now.R
import com.sopt.now.databinding.FragmentMyPageBinding
-import com.sopt.now.ui.base.BindingFragment
-import com.sopt.now.ui.changePwd.ChangePwdActivity
-import com.sopt.now.ui.login.LoginActivity
-import com.sopt.now.ui.login.LoginActivity.Companion.PREF_KEY
-import com.sopt.now.ui.main.MainViewModel.Companion.LOGIN_INFO
-import com.sopt.now.ui.main.MainViewModel.Companion.USER_INFO
+import com.sopt.now.presentation.changePwd.ChangePwdActivity
+import com.sopt.now.presentation.login.LoginActivity
+import com.sopt.now.presentation.login.LoginActivity.Companion.PREF_KEY
+import com.sopt.now.presentation.main.MainViewModel.Companion.LOGIN_INFO
+import com.sopt.now.presentation.main.MainViewModel.Companion.USER_INFO
+import com.sopt.now.util.BindingFragment
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class MyPageFragment() : BindingFragment(FragmentMyPageBinding::inflate) {
- private val viewModel by activityViewModels()
+ private val viewModel: MyPageViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
diff --git a/app/src/main/java/com/sopt/now/ui/mypage/MyPageViewModel.kt b/app/src/main/java/com/sopt/now/presentation/mypage/MyPageViewModel.kt
similarity index 65%
rename from app/src/main/java/com/sopt/now/ui/mypage/MyPageViewModel.kt
rename to app/src/main/java/com/sopt/now/presentation/mypage/MyPageViewModel.kt
index 1ccf1ed..929766b 100644
--- a/app/src/main/java/com/sopt/now/ui/mypage/MyPageViewModel.kt
+++ b/app/src/main/java/com/sopt/now/presentation/mypage/MyPageViewModel.kt
@@ -1,15 +1,18 @@
-package com.sopt.now.ui.mypage
+package com.sopt.now.presentation.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.remote.response.ResponseUserInfoDto
-import com.sopt.now.ui.base.ServicePool.userService
+import com.sopt.now.data.dto.response.ResponseUserInfoDto
+import com.sopt.now.domain.repository.UserRepository
import kotlinx.coroutines.launch
+import javax.inject.Inject
-class MyPageViewModel : ViewModel() {
+class MyPageViewModel @Inject constructor(
+ private val userRepository: UserRepository
+) : ViewModel() {
private val _userInfo = MutableLiveData()
val userInfo: LiveData
get() = _userInfo
@@ -17,7 +20,7 @@ class MyPageViewModel : ViewModel() {
fun fetchUserInfo(userId: Int) {
viewModelScope.launch {
runCatching {
- userService.getUserInfo(userId)
+ userRepository.getUserInfo(userId)
}.onSuccess {
_userInfo.postValue(it.body())
}.onFailure {
diff --git a/app/src/main/java/com/sopt/now/ui/search/SearchFragment.kt b/app/src/main/java/com/sopt/now/presentation/search/SearchFragment.kt
similarity index 65%
rename from app/src/main/java/com/sopt/now/ui/search/SearchFragment.kt
rename to app/src/main/java/com/sopt/now/presentation/search/SearchFragment.kt
index ad2a8ea..87ab701 100644
--- a/app/src/main/java/com/sopt/now/ui/search/SearchFragment.kt
+++ b/app/src/main/java/com/sopt/now/presentation/search/SearchFragment.kt
@@ -1,7 +1,7 @@
-package com.sopt.now.ui.search
+package com.sopt.now.presentation.search
import com.sopt.now.databinding.FragmentSearchBinding
-import com.sopt.now.ui.base.BindingFragment
+import com.sopt.now.util.BindingFragment
class SearchFragment : BindingFragment(FragmentSearchBinding::inflate) {
diff --git a/app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpActivity.kt
similarity index 86%
rename from app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt
rename to app/src/main/java/com/sopt/now/presentation/signUp/SignUpActivity.kt
index e79f3ad..fd319ad 100644
--- a/app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt
+++ b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpActivity.kt
@@ -1,15 +1,18 @@
-package com.sopt.now.ui.signUp
+package com.sopt.now.presentation.signUp
import android.os.Bundle
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
+import com.sopt.now.data.dto.request.RequestSignUpDto
import com.sopt.now.databinding.ActivitySignUpBinding
-import com.sopt.now.remote.request.RequestSignUpDto
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class SignUpActivity : AppCompatActivity() {
private lateinit var binding: ActivitySignUpBinding
- private val viewModel by viewModels()
+ private val viewModel: SignUpViewModel by viewModels()
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySignUpBinding.inflate(layoutInflater)
diff --git a/app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpState.kt
similarity index 65%
rename from app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt
rename to app/src/main/java/com/sopt/now/presentation/signUp/SignUpState.kt
index 30efd38..8fd04e2 100644
--- a/app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt
+++ b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpState.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.ui.signUp
+package com.sopt.now.presentation.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/presentation/signUp/SignUpViewModel.kt
similarity index 69%
rename from app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt
rename to app/src/main/java/com/sopt/now/presentation/signUp/SignUpViewModel.kt
index bcc4b59..f882ebd 100644
--- a/app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt
+++ b/app/src/main/java/com/sopt/now/presentation/signUp/SignUpViewModel.kt
@@ -1,14 +1,20 @@
-package com.sopt.now.ui.signUp
+package com.sopt.now.presentation.signUp
+
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.sopt.now.remote.request.RequestSignUpDto
-import com.sopt.now.ui.base.ServicePool.authService
+import com.sopt.now.data.dto.request.RequestSignUpDto
+import com.sopt.now.domain.repository.AuthRepository
+import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
+import javax.inject.Inject
-class SignUpViewModel : ViewModel() {
+@HiltViewModel
+class SignUpViewModel @Inject constructor(
+ private val authRepository: AuthRepository
+) : ViewModel() {
private val _signUpState = MutableLiveData()
val signUpState: LiveData
get() = _signUpState
@@ -16,7 +22,7 @@ class SignUpViewModel : ViewModel() {
fun signUp(request: RequestSignUpDto) {
viewModelScope.launch {
runCatching {
- authService.signUp(request)
+ authRepository.signUp(request)
}.onSuccess {
if (it.code() in 200..299) {
_signUpState.value = SignUpState(true, "회원가입 성공")
diff --git a/app/src/main/java/com/sopt/now/ui/base/ApiFactory.kt b/app/src/main/java/com/sopt/now/ui/base/ApiFactory.kt
deleted file mode 100644
index cfdf390..0000000
--- a/app/src/main/java/com/sopt/now/ui/base/ApiFactory.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.sopt.now.ui.base
-
-import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
-import com.sopt.now.BuildConfig.AUTH_BASE_URL
-import com.sopt.now.BuildConfig.FRIEND_BASE_URL
-import com.sopt.now.remote.service.AuthService
-import com.sopt.now.remote.service.FriendService
-import com.sopt.now.remote.service.UserService
-import kotlinx.serialization.json.Json
-import okhttp3.MediaType.Companion.toMediaType
-import retrofit2.Retrofit
-
-object ApiFactory {
- private const val CONTENT_TYPE = "application/json"
-
- fun retrofit(url: String): Retrofit {
- return Retrofit.Builder()
- .baseUrl(url)
- .addConverterFactory(Json.asConverterFactory(CONTENT_TYPE.toMediaType()))
- .build()
- }
-
- inline fun create(url: String): T = retrofit(url).create(T::class.java)
-}
-
-object ServicePool {
- val userService by lazy { ApiFactory.create(AUTH_BASE_URL) }
- val authService by lazy { ApiFactory.create(AUTH_BASE_URL) }
- val friendService by lazy { ApiFactory.create(FRIEND_BASE_URL) }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/util/BaseViewModelFactory.kt b/app/src/main/java/com/sopt/now/util/BaseViewModelFactory.kt
new file mode 100644
index 0000000..b14b1ca
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/util/BaseViewModelFactory.kt
@@ -0,0 +1,10 @@
+package com.sopt.now.util
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+
+class BaseViewModelFactory(private val creator: () -> T) : ViewModelProvider.Factory {
+ override fun create(modelClass: Class): V {
+ return creator() as V
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/ui/base/BindingFragment.kt b/app/src/main/java/com/sopt/now/util/BindingFragment.kt
similarity index 96%
rename from app/src/main/java/com/sopt/now/ui/base/BindingFragment.kt
rename to app/src/main/java/com/sopt/now/util/BindingFragment.kt
index 49a65df..96a1a3a 100644
--- a/app/src/main/java/com/sopt/now/ui/base/BindingFragment.kt
+++ b/app/src/main/java/com/sopt/now/util/BindingFragment.kt
@@ -1,4 +1,4 @@
-package com.sopt.now.ui.base
+package com.sopt.now.util
import android.os.Bundle
import android.view.LayoutInflater
diff --git a/app/src/main/res/layout/activity_change_pwd.xml b/app/src/main/res/layout/activity_change_pwd.xml
index 8a1c32a..c7b8d3e 100644
--- a/app/src/main/res/layout/activity_change_pwd.xml
+++ b/app/src/main/res/layout/activity_change_pwd.xml
@@ -6,7 +6,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="50dp"
- tools:context=".ui.changePwd.ChangePwdActivity">
+ tools:context=".presentation.changePwd.ChangePwdActivity">
+ tools:context=".presentation.login.LoginActivity">
+ tools:context=".presentation.main.MainActivity">
+ tools:context=".presentation.signUp.SignUpActivity">
+ tools:context=".presentation.home.HomeFragment">
+ tools:context=".presentation.main.MainActivity">
+ tools:context=".presentation.search.SearchFragment">