Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

week7: 7차 필수과제 진행 (xml) #19

Open
wants to merge 5 commits into
base: develop-xml
Choose a base branch
from
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
8 changes: 8 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ plugins {
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.0'
id 'com.google.dagger.hilt.android'
}

Properties properties = new Properties()
Expand Down Expand Up @@ -82,4 +83,11 @@ dependencies {
implementation platform('com.squareup.okhttp3:okhttp-bom:4.11.0')
implementation 'com.squareup.okhttp3:okhttp'
implementation 'com.squareup.okhttp3:logging-interceptor'

// Hilt
implementation 'com.google.dagger:hilt-android:2.48'
kapt 'com.google.dagger:hilt-compiler:2.48'

// fragment-ktx
implementation 'androidx.fragment:fragment-ktx:1.6.1'
}
2 changes: 2 additions & 0 deletions app/src/main/java/com/sopt/now/NowSopt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ 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()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
package com.sopt.now.data
package com.sopt.now.data.remote.di

import android.util.Log
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import com.sopt.now.BuildConfig
import com.sopt.now.data.remote.service.AuthService
import com.sopt.now.data.remote.service.FriendService
import com.sopt.now.data.remote.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 =
Expand All @@ -34,19 +40,38 @@ object NetworkModule {
.addInterceptor(getLogOkHttpClient())
.build()

fun provideRetrofit(url: String): Retrofit {
@Singleton
@Provides
fun provideRetrofit(): Retrofit.Builder {
return Retrofit.Builder()
.baseUrl(url)
.client(okHttpClient)
.addConverterFactory(json.asConverterFactory(CONTENT_TYPE.toMediaType()))
.build()
}

inline fun <reified T> create(url: String): T = provideRetrofit(url).create<T>(T::class.java)
}
@Singleton
@Provides
fun provideAuthService(
retrofitBuilder: Retrofit.Builder,
@AuthBaseUrl url: String,
): AuthService {
return retrofitBuilder.baseUrl(url).build().create(AuthService::class.java)
}

object ServicePool {
val authService = NetworkModule.create<AuthService>(BuildConfig.AUTH_BASE_URL)
val userService = NetworkModule.create<UserService>(BuildConfig.AUTH_BASE_URL)
val friendService = NetworkModule.create<FriendService>(BuildConfig.FRIEND_BASE_URL)
@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)
}
}
28 changes: 28 additions & 0 deletions app/src/main/java/com/sopt/now/data/remote/di/UrlModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.sopt.now.data.remote.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
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.sopt.now.data.remote.repository

import com.sopt.now.data.remote.request.SignInRequest
import com.sopt.now.data.remote.request.SignUpRequest
import com.sopt.now.data.remote.response.SignInResponse
import com.sopt.now.data.remote.response.SignUpResponse
import com.sopt.now.data.remote.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: SignUpRequest): Response<SignUpResponse> {

Choose a reason for hiding this comment

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

[2]
레포지토리 패턴은 데이터 소스를 추상화하는데 의미가 있습니다.
즉 뷰단에서는 이 값들이 우리 서버에서 왔는지, 로컬 디비에서 왔는지 혹은 파이어베이스에서 왔는지 관심이 없다는 뜻이죠.
그런 레포지토리가 레트로핏의 Response 형태로 값을 반환하게 된다면 네트워크 통신의 결과물이라는 의미를 내포하게 됩니다.
그러므로 Response로 래핑된 형태가 아닌 ResponseSignUpDto의 형태로 반환해보는 것은 어떨까요?

Copy link
Member Author

Choose a reason for hiding this comment

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

아하 무슨 뜻인지 알겠습니다 ㅋㅋㅋㅋ!! 감사합니다 앱잼 준비하다보니 답변이 늦었네요 ㅠㅠ
파이팅해보겠습니다 :) 용민님도 항상 건승하시길...!

return authService.signUp(request)
}

suspend fun signIn(request: SignInRequest): Response<SignInResponse> {
return authService.signIn(request)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.sopt.now.data.remote.repository

import com.sopt.now.data.remote.response.FriendsResponse
import com.sopt.now.data.remote.service.FriendService
import retrofit2.Response
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class FriendRepository
@Inject
constructor(
private val friendService: FriendService,
) {
suspend fun getFriends(page: Int): Response<FriendsResponse> {
return friendService.getFriends(page)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.sopt.now.data.remote.repository

import com.sopt.now.data.remote.request.ChangePasswordRequest
import com.sopt.now.data.remote.response.ChangePasswordResponse
import com.sopt.now.data.remote.response.UserResponse
import com.sopt.now.data.remote.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(userId: Int): Response<UserResponse> {
return userService.getUserInfo(userId)
}

suspend fun changePassword(
userId: Int,
request: ChangePasswordRequest,
): Response<ChangePasswordResponse> {
return userService.changePassword(userId, request)
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package com.sopt.now.data.remote.response


import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class GetFriendsResponse(
data class FriendsResponse(
@SerialName("page")
val page: Int,
@SerialName("per_page")
Expand All @@ -17,7 +16,7 @@ data class GetFriendsResponse(
@SerialName("data")
val `data`: List<Data>,
@SerialName("support")
val support: Support
val support: Support,
) {
@Serializable
data class Data(
Expand All @@ -30,14 +29,14 @@ data class GetFriendsResponse(
@SerialName("last_name")
val lastName: String,
@SerialName("avatar")
val avatar: String
val avatar: String,
)

@Serializable
data class Support(
@SerialName("url")
val url: String,
@SerialName("text")
val text: String
val text: String,
)
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.sopt.now.data.remote.response

import com.sopt.now.data.remote.response.GetUserResponse.User.Companion.defaultUser
import com.sopt.now.data.remote.response.UserResponse.User.Companion.defaultUser
import kotlinx.serialization.Serializable

@Serializable
data class GetUserResponse(
data class UserResponse(
val code: Int,
val message: String,
val data: User? = defaultUser,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.sopt.now.data.remote.service

import com.sopt.now.data.remote.response.GetFriendsResponse
import com.sopt.now.data.remote.response.FriendsResponse
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Query
Expand All @@ -9,5 +9,5 @@ interface FriendService {
@GET("users")
suspend fun getFriends(
@Query("page") page: Int,
): Response<GetFriendsResponse>
): Response<FriendsResponse>
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.sopt.now.data.remote.service

import com.sopt.now.data.remote.request.ChangePasswordRequest
import com.sopt.now.data.remote.response.ChangePasswordResponse
import com.sopt.now.data.remote.response.GetUserResponse
import com.sopt.now.data.remote.response.UserResponse
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.GET
Expand All @@ -13,7 +13,7 @@ interface UserService {
@GET("member/info")
suspend fun getUserInfo(
@Header("memberId") userId: Int,
): Response<GetUserResponse>
): Response<UserResponse>

@PATCH("member/password")
suspend fun changePassword(
Expand Down
11 changes: 0 additions & 11 deletions app/src/main/java/com/sopt/now/ui/common/base/BaseFactory.kt

This file was deleted.

13 changes: 4 additions & 9 deletions app/src/main/java/com/sopt/now/ui/main/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,30 @@ package com.sopt.now.ui.main
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.viewModels
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.sopt.now.R
import com.sopt.now.databinding.ActivityMainBinding
import com.sopt.now.ui.common.base.BaseFactory
import com.sopt.now.ui.common.base.BindingActivity
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 : BindingActivity<ActivityMainBinding>(R.layout.activity_main) {
private lateinit var mainViewModel: MainViewModel
private val mainViewModel: MainViewModel by viewModels()
private var userId: Int = 0

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setupViewModel()
getUserId()
initDefaultFragment(savedInstanceState)
setupDataBinding()
setupBottomNavigation()
}

private fun setupViewModel() {
val mainFactory = BaseFactory { MainViewModel() }
mainViewModel = ViewModelProvider(this, mainFactory)[MainViewModel::class.java]
}

private fun getUserId() {
userId = intent.getIntExtra(USER_ID, 0)
}
Expand Down
Loading