Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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'
}
9 changes: 5 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".NowSopt"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
Expand All @@ -17,10 +18,10 @@
android:windowSoftInputMode="adjustResize"
tools:targetApi="31">
<activity
android:name=".ui.changePwd.ChangePwdActivity"
android:name=".presentation.changePwd.ChangePwdActivity"
android:exported="false" />
<activity
android:name=".ui.login.LoginActivity"
android:name=".presentation.login.LoginActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand All @@ -29,10 +30,10 @@
</intent-filter>
</activity>
<activity
android:name=".ui.signUp.SignUpActivity"
android:name=".presentation.signUp.SignUpActivity"
android:exported="false" />
<activity
android:name=".ui.main.MainActivity"
android:name=".presentation.main.MainActivity"
android:exported="false"></activity>
</application>

Expand Down
21 changes: 21 additions & 0 deletions app/src/main/java/com/sopt/now/NowSopt.kt
Original file line number Diff line number Diff line change
@@ -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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

함수로 분리하면 더 깔끔할 것 같아요

}

companion object {
lateinit var appContext: Context
private set
}
}
14 changes: 14 additions & 0 deletions app/src/main/java/com/sopt/now/data/datasource/AuthDataSource.kt
Original file line number Diff line number Diff line change
@@ -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<ResponseSignUpDto>
suspend fun login(request: RequestLoginDto): Response<ResponseLoginDto>
}
10 changes: 10 additions & 0 deletions app/src/main/java/com/sopt/now/data/datasource/FriendDataSource.kt
Original file line number Diff line number Diff line change
@@ -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<ResponseFriendsDto>
}
13 changes: 13 additions & 0 deletions app/src/main/java/com/sopt/now/data/datasource/UserDataSource.kt
Original file line number Diff line number Diff line change
@@ -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<ResponseUserInfoDto>
suspend fun changeUserPwd(userId: Int, pwd: RequestChangePwdDto): Response<ResponseChangePwdDto>
}
Original file line number Diff line number Diff line change
@@ -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<ResponseSignUpDto> {
return authService.signUp(request)
}
Comment on lines +17 to +19
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
override suspend fun signUp(request: RequestSignUpDto): Response<ResponseSignUpDto> {
return authService.signUp(request)
}
override suspend fun signUp(request: RequestSignUpDto): Response<ResponseSignUpDto> =
authService.signUp(request)

이렇게 리팩토링 할 수 있겠네요!


override suspend fun login(request: RequestLoginDto): Response<ResponseLoginDto> {
return authService.login(request)
}
}
Original file line number Diff line number Diff line change
@@ -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<ResponseFriendsDto> {
return friendService.getFriends(page)
}
}
Original file line number Diff line number Diff line change
@@ -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<ResponseUserInfoDto> {
return userService.getUserInfo(userId)
}

override suspend fun changeUserPwd(
userId: Int,
pwd: RequestChangePwdDto
): Response<ResponseChangePwdDto> {
return userService.changeUserPwd(userId, pwd)
}
}
73 changes: 73 additions & 0 deletions app/src/main/java/com/sopt/now/data/di/DataModule.kt
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

di 폴더는 밖으로 빼면 좋을 것 같아요! 또한 앱잼에서 따를 구조를 생각해서 data에서 remote와 local로 구분해보는 것도 좋을 것 같네욤

Original file line number Diff line number Diff line change
@@ -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)
}
Comment on lines +28 to +33
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Provides 어노테이션의 경우 객체 생성을 직접 관리해요. 저는 추가적인 유연성과 테스트에 용이하기 위해 @Binds와 interface를 사용하는 편이예요. 복잡도에 따라 적절하게 판단하여 활용하면 좋을 것 같네요!


@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)
}
}
67 changes: 67 additions & 0 deletions app/src/main/java/com/sopt/now/data/di/NetworkModule.kt
Original file line number Diff line number Diff line change
@@ -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)
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -14,24 +15,10 @@ data class ResponseFriendsDto(
@SerialName("total_pages")
val totalPages: Int,
@SerialName("data")
val `data`: List<Data>,
val `data`: List<FriendEntity>,
@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")
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Loading