Skip to content

Commit 94278b1

Browse files
authored
Merge pull request #197 from YAPP-Github/refactor/#196-network-layer-improvement
[Refactor/#196] 네트워크 모듈 리팩토링 및 라이브러리 업데이트
2 parents d289f4a + 91a9870 commit 94278b1

File tree

9 files changed

+75
-93
lines changed

9 files changed

+75
-93
lines changed

app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -92,18 +92,43 @@ object NetworkModule {
9292

9393
@Provides
9494
@Singleton
95-
@Kakao
96-
fun provideKakaoOkHttpClient(
95+
fun provideBaseOkHttpClient(
9796
httpLoggingInterceptor: HttpLoggingInterceptor,
98-
@Kakao kakaoAuthInterceptor: Interceptor,
9997
): OkHttpClient = OkHttpClient.Builder()
100-
.addInterceptor(kakaoAuthInterceptor)
10198
.addInterceptor(httpLoggingInterceptor)
10299
.connectTimeout(10L, TimeUnit.SECONDS)
103100
.writeTimeout(30L, TimeUnit.SECONDS)
104101
.readTimeout(30L, TimeUnit.SECONDS)
105102
.build()
106103

104+
@Provides
105+
@Singleton
106+
@NoneAuth
107+
fun provideNoneAuthOkHttpClient(baseClient: OkHttpClient): OkHttpClient =
108+
baseClient.newBuilder().build()
109+
110+
@Provides
111+
@Singleton
112+
@Auth
113+
fun provideAuthOkHttpClient(
114+
baseClient: OkHttpClient,
115+
@Auth authInterceptor: Interceptor,
116+
tokenAuthenticator: TokenAuthenticator,
117+
): OkHttpClient = baseClient.newBuilder()
118+
.addInterceptor(authInterceptor)
119+
.authenticator(tokenAuthenticator)
120+
.build()
121+
122+
@Provides
123+
@Singleton
124+
@Kakao
125+
fun provideKakaoOkHttpClient(
126+
baseClient: OkHttpClient,
127+
@Kakao kakaoAuthInterceptor: Interceptor,
128+
): OkHttpClient = baseClient.newBuilder()
129+
.addInterceptor(kakaoAuthInterceptor)
130+
.build()
131+
107132
@Provides
108133
@Singleton
109134
@Kakao
@@ -141,34 +166,6 @@ object NetworkModule {
141166
fun provideAuthInterceptor(tokenProvider: TokenProvider): Interceptor =
142167
AuthInterceptor(tokenProvider)
143168

144-
@Provides
145-
@Singleton
146-
@Auth
147-
fun provideAuthOkHttpClient(
148-
httpLoggingInterceptor: HttpLoggingInterceptor,
149-
@Auth authInterceptor: Interceptor,
150-
tokenAuthenticator: TokenAuthenticator,
151-
): OkHttpClient = OkHttpClient.Builder()
152-
.addInterceptor(authInterceptor)
153-
.addInterceptor(httpLoggingInterceptor)
154-
.authenticator(tokenAuthenticator)
155-
.connectTimeout(10L, TimeUnit.SECONDS)
156-
.writeTimeout(30L, TimeUnit.SECONDS)
157-
.readTimeout(30L, TimeUnit.SECONDS)
158-
.build()
159-
160-
@Provides
161-
@Singleton
162-
@NoneAuth
163-
fun provideNoneAuthOkHttpClient(
164-
httpLoggingInterceptor: HttpLoggingInterceptor,
165-
): OkHttpClient = OkHttpClient.Builder()
166-
.addInterceptor(httpLoggingInterceptor)
167-
.connectTimeout(10L, TimeUnit.SECONDS)
168-
.writeTimeout(30L, TimeUnit.SECONDS)
169-
.readTimeout(30L, TimeUnit.SECONDS)
170-
.build()
171-
172169
@Provides
173170
@Singleton
174171
@Auth

app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.threegap.bitnagil.di.data
22

33
import com.threegap.bitnagil.data.address.service.AddressService
44
import com.threegap.bitnagil.data.auth.service.AuthService
5+
import com.threegap.bitnagil.data.auth.service.LoginService
56
import com.threegap.bitnagil.data.emotion.service.EmotionService
67
import com.threegap.bitnagil.data.file.service.FileService
78
import com.threegap.bitnagil.data.onboarding.service.OnBoardingService
@@ -19,6 +20,7 @@ import dagger.Provides
1920
import dagger.hilt.InstallIn
2021
import dagger.hilt.components.SingletonComponent
2122
import retrofit2.Retrofit
23+
import retrofit2.create
2224
import javax.inject.Singleton
2325

2426
@Module
@@ -27,56 +29,49 @@ object ServiceModule {
2729

2830
@Provides
2931
@Singleton
30-
fun provideAuthService(@Auth retrofit: Retrofit): AuthService =
31-
retrofit.create(AuthService::class.java)
32+
fun provideAuthService(@Auth retrofit: Retrofit): AuthService = retrofit.create()
3233

3334
@Provides
3435
@Singleton
35-
fun providerOnBoardingService(@Auth retrofit: Retrofit): OnBoardingService =
36-
retrofit.create(OnBoardingService::class.java)
36+
fun provideLoginService(@NoneAuth retrofit: Retrofit): LoginService = retrofit.create()
3737

3838
@Provides
3939
@Singleton
40-
fun provideRoutineService(@Auth retrofit: Retrofit): RoutineService =
41-
retrofit.create(RoutineService::class.java)
40+
fun providerOnBoardingService(@Auth retrofit: Retrofit): OnBoardingService = retrofit.create()
4241

4342
@Provides
4443
@Singleton
45-
fun providerEmotionService(@Auth retrofit: Retrofit): EmotionService =
46-
retrofit.create(EmotionService::class.java)
44+
fun provideRoutineService(@Auth retrofit: Retrofit): RoutineService = retrofit.create()
4745

4846
@Provides
4947
@Singleton
50-
fun provideReissueService(@NoneAuth retrofit: Retrofit): ReissueService =
51-
retrofit.create(ReissueService::class.java)
48+
fun providerEmotionService(@Auth retrofit: Retrofit): EmotionService = retrofit.create()
5249

5350
@Provides
5451
@Singleton
55-
fun provideUserService(@Auth retrofit: Retrofit): UserService =
56-
retrofit.create(UserService::class.java)
52+
fun provideReissueService(@NoneAuth retrofit: Retrofit): ReissueService = retrofit.create()
5753

5854
@Provides
5955
@Singleton
60-
fun provideRecommendRoutineService(@Auth retrofit: Retrofit): RecommendRoutineService =
61-
retrofit.create(RecommendRoutineService::class.java)
56+
fun provideUserService(@Auth retrofit: Retrofit): UserService = retrofit.create()
6257

6358
@Provides
6459
@Singleton
65-
fun provideVersionService(@NoneAuth retrofit: Retrofit): VersionService =
66-
retrofit.create(VersionService::class.java)
60+
fun provideRecommendRoutineService(@Auth retrofit: Retrofit): RecommendRoutineService = retrofit.create()
6761

6862
@Provides
6963
@Singleton
70-
fun provideAddressService(@Kakao retrofit: Retrofit): AddressService =
71-
retrofit.create(AddressService::class.java)
64+
fun provideVersionService(@NoneAuth retrofit: Retrofit): VersionService = retrofit.create()
7265

7366
@Provides
7467
@Singleton
75-
fun provideFileService(@Auth retrofit: Retrofit): FileService =
76-
retrofit.create(FileService::class.java)
68+
fun provideAddressService(@Kakao retrofit: Retrofit): AddressService = retrofit.create()
7769

7870
@Provides
7971
@Singleton
80-
fun provideReportService(@Auth retrofit: Retrofit): ReportService =
81-
retrofit.create(ReportService::class.java)
72+
fun provideFileService(@Auth retrofit: Retrofit): FileService = retrofit.create()
73+
74+
@Provides
75+
@Singleton
76+
fun provideReportService(@Auth retrofit: Retrofit): ReportService = retrofit.create()
8277
}

build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinAndroid.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ internal fun Project.configureKotlinAndroid(commonExtension: CommonExtension<*,
4444
resources {
4545
excludes.add("META-INF/AL2.0")
4646
excludes.add("META-INF/LGPL2.1")
47+
excludes.add("META-INF/versions/9/OSGI-INF/MANIFEST.MF")
4748
}
4849
}
4950

core/network/src/main/java/com/threegap/bitnagil/network/auth/AuthInterceptor.kt

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,16 @@ package com.threegap.bitnagil.network.auth
33
import com.threegap.bitnagil.network.token.TokenProvider
44
import kotlinx.coroutines.runBlocking
55
import okhttp3.Interceptor
6-
import okhttp3.Request
76
import okhttp3.Response
87

98
class AuthInterceptor(
109
private val tokenProvider: TokenProvider,
1110
) : Interceptor {
1211
override fun intercept(chain: Interceptor.Chain): Response {
1312
val originalRequest = chain.request()
14-
val noToken = originalRequest.header(HEADER_NO_SERVICE_TOKEN)
15-
16-
if (noToken == "true") {
17-
return chain.proceed(removeNoTokenHeader(originalRequest))
18-
}
1913

2014
val token = runBlocking { tokenProvider.getAccessToken() }
21-
if (token.isNullOrBlank()) {
22-
return chain.proceed(originalRequest)
23-
}
15+
if (token.isNullOrBlank()) return chain.proceed(originalRequest)
2416

2517
val newRequest = originalRequest.newBuilder()
2618
.addHeader(HEADER_AUTHORIZATION, "$TOKEN_PREFIX $token")
@@ -29,13 +21,7 @@ class AuthInterceptor(
2921
return chain.proceed(newRequest)
3022
}
3123

32-
private fun removeNoTokenHeader(request: Request): Request =
33-
request.newBuilder()
34-
.removeHeader(HEADER_NO_SERVICE_TOKEN)
35-
.build()
36-
3724
companion object {
38-
private const val HEADER_NO_SERVICE_TOKEN = "No-Service-Token"
3925
private const val HEADER_AUTHORIZATION = "Authorization"
4026
private const val TOKEN_PREFIX = "Bearer"
4127
}

core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ class TokenAuthenticator(
1919
private val authMutex = Mutex()
2020

2121
override fun authenticate(route: Route?, response: Response): Request? {
22-
if (response.request.header(AUTO_LOGIN_HEADER) != null) return null
2322
if (!shouldRetry(response)) return null
2423

2524
val currentToken = runBlocking { tokenProvider.getAccessToken() }
@@ -83,7 +82,6 @@ class TokenAuthenticator(
8382
private fun buildRequestWithToken(originalRequest: Request, token: String): Request {
8483
return originalRequest.newBuilder()
8584
.header(AUTHORIZATION, "$TOKEN_PREFIX $token")
86-
.removeHeader(AUTO_LOGIN_HEADER)
8785
.build()
8886
}
8987

@@ -98,6 +96,5 @@ class TokenAuthenticator(
9896
private const val AUTHORIZATION = "Authorization"
9997
private const val TOKEN_PREFIX = "Bearer"
10098
private const val SUCCESS_CODE = "CO000"
101-
private const val AUTO_LOGIN_HEADER = "Auto-Login"
10299
}
103100
}

data/src/main/java/com/threegap/bitnagil/data/auth/datasourceimpl/AuthRemoteDataSourceImpl.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,18 @@ import com.threegap.bitnagil.data.auth.model.request.TermsAgreementRequest
66
import com.threegap.bitnagil.data.auth.model.request.WithdrawalReasonRequest
77
import com.threegap.bitnagil.data.auth.model.response.LoginResponse
88
import com.threegap.bitnagil.data.auth.service.AuthService
9+
import com.threegap.bitnagil.data.auth.service.LoginService
910
import com.threegap.bitnagil.data.common.safeApiCall
1011
import com.threegap.bitnagil.data.common.safeUnitApiCall
1112
import javax.inject.Inject
1213

1314
class AuthRemoteDataSourceImpl @Inject constructor(
1415
private val authService: AuthService,
16+
private val loginService: LoginService,
1517
) : AuthRemoteDataSource {
1618
override suspend fun login(socialAccessToken: String, loginRequest: LoginRequest): Result<LoginResponse> =
1719
safeApiCall {
18-
authService.postLogin(socialAccessToken, loginRequest)
20+
loginService.postLogin(socialAccessToken, loginRequest)
1921
}
2022

2123
override suspend fun submitAgreement(termsAgreementRequest: TermsAgreementRequest): Result<Unit> =
@@ -35,6 +37,6 @@ class AuthRemoteDataSourceImpl @Inject constructor(
3537

3638
override suspend fun reissueToken(refreshToken: String): Result<LoginResponse> =
3739
safeApiCall {
38-
authService.postReissueToken(refreshToken)
40+
loginService.postReissueToken(refreshToken)
3941
}
4042
}
Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,12 @@
11
package com.threegap.bitnagil.data.auth.service
22

3-
import com.threegap.bitnagil.data.auth.model.request.LoginRequest
43
import com.threegap.bitnagil.data.auth.model.request.TermsAgreementRequest
54
import com.threegap.bitnagil.data.auth.model.request.WithdrawalReasonRequest
6-
import com.threegap.bitnagil.data.auth.model.response.LoginResponse
75
import com.threegap.bitnagil.network.model.BaseResponse
86
import retrofit2.http.Body
9-
import retrofit2.http.Header
10-
import retrofit2.http.Headers
117
import retrofit2.http.POST
128

139
interface AuthService {
14-
@POST("/api/v1/auth/login")
15-
@Headers("No-Service-Token: true")
16-
suspend fun postLogin(
17-
@Header("SocialAccessToken") socialAccessToken: String,
18-
@Body loginRequest: LoginRequest,
19-
): BaseResponse<LoginResponse>
20-
2110
@POST("/api/v1/auth/agreements")
2211
suspend fun submitAgreement(
2312
@Body termsAgreementRequest: TermsAgreementRequest,
@@ -28,10 +17,4 @@ interface AuthService {
2817

2918
@POST("/api/v1/auth/logout")
3019
suspend fun postLogout(): BaseResponse<Unit>
31-
32-
@POST("/api/v1/auth/token/reissue")
33-
@Headers("No-Service-Token: true", "Auto-Login: true")
34-
suspend fun postReissueToken(
35-
@Header("Refresh-Token") refreshToken: String,
36-
): BaseResponse<LoginResponse>
3720
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.threegap.bitnagil.data.auth.service
2+
3+
import com.threegap.bitnagil.data.auth.model.request.LoginRequest
4+
import com.threegap.bitnagil.data.auth.model.response.LoginResponse
5+
import com.threegap.bitnagil.network.model.BaseResponse
6+
import retrofit2.http.Body
7+
import retrofit2.http.Header
8+
import retrofit2.http.POST
9+
10+
interface LoginService {
11+
@POST("/api/v1/auth/login")
12+
suspend fun postLogin(
13+
@Header("SocialAccessToken") socialAccessToken: String,
14+
@Body loginRequest: LoginRequest,
15+
): BaseResponse<LoginResponse>
16+
17+
@POST("/api/v1/auth/token/reissue")
18+
suspend fun postReissueToken(
19+
@Header("Refresh-Token") refreshToken: String,
20+
): BaseResponse<LoginResponse>
21+
}

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ composeBom = "2025.06.00"
4040
composeNavigation = "2.9.0"
4141

4242
# Network
43-
okhttp = "4.11.0"
44-
retrofit = "2.11.0"
43+
okhttp = "5.3.2"
44+
retrofit = "3.0.0"
4545

4646
# Test
4747
junit = "4.13.2"

0 commit comments

Comments
 (0)