From f514780cc412c67e44f3d0e5ab96f96e7cf9437c Mon Sep 17 00:00:00 2001 From: wjdrjs00 Date: Tue, 17 Mar 2026 20:12:49 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Chore:=20OkHttp=20=EB=B0=8F=20Retrofit=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../threegap/bitnagil/convention/extension/KotlinAndroid.kt | 1 + gradle/libs.versions.toml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinAndroid.kt b/build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinAndroid.kt index 5cf17dc0..b7859bd3 100644 --- a/build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinAndroid.kt +++ b/build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinAndroid.kt @@ -44,6 +44,7 @@ internal fun Project.configureKotlinAndroid(commonExtension: CommonExtension<*, resources { excludes.add("META-INF/AL2.0") excludes.add("META-INF/LGPL2.1") + excludes.add("META-INF/versions/9/OSGI-INF/MANIFEST.MF") } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 06ef7da1..3faa555b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -40,8 +40,8 @@ composeBom = "2025.06.00" composeNavigation = "2.9.0" # Network -okhttp = "4.11.0" -retrofit = "2.11.0" +okhttp = "5.3.2" +retrofit = "3.0.0" # Test junit = "4.13.2" From 2a3616d779e3f78e7bbf3eb43d5be742b80809eb Mon Sep 17 00:00:00 2001 From: wjdrjs00 Date: Tue, 17 Mar 2026 20:13:46 +0900 Subject: [PATCH 2/5] =?UTF-8?q?Refactor:=20LoginService=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20=EB=84=A4=ED=8A=B8=EC=9B=8C=ED=81=AC=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 인증이 필요 없는 API 처리를 위한 LoginService 추가 및 관련 로직 이동 - AuthInterceptor 내 No-Service-Token 헤더 체크 및 삭제 로직 제거 --- .../bitnagil/di/data/ServiceModule.kt | 6 +++++ .../bitnagil/network/auth/AuthInterceptor.kt | 16 +------------ .../AuthRemoteDataSourceImpl.kt | 6 +++-- .../bitnagil/data/auth/service/AuthService.kt | 17 -------------- .../data/auth/service/LoginService.kt | 23 +++++++++++++++++++ 5 files changed, 34 insertions(+), 34 deletions(-) create mode 100644 data/src/main/java/com/threegap/bitnagil/data/auth/service/LoginService.kt diff --git a/app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt b/app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt index de3a1797..ff2aba1b 100644 --- a/app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt +++ b/app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt @@ -2,6 +2,7 @@ package com.threegap.bitnagil.di.data import com.threegap.bitnagil.data.address.service.AddressService import com.threegap.bitnagil.data.auth.service.AuthService +import com.threegap.bitnagil.data.auth.service.LoginService import com.threegap.bitnagil.data.emotion.service.EmotionService import com.threegap.bitnagil.data.file.service.FileService import com.threegap.bitnagil.data.onboarding.service.OnBoardingService @@ -30,6 +31,11 @@ object ServiceModule { fun provideAuthService(@Auth retrofit: Retrofit): AuthService = retrofit.create(AuthService::class.java) + @Provides + @Singleton + fun provideLoginService(@NoneAuth retrofit: Retrofit): LoginService = + retrofit.create(LoginService::class.java) + @Provides @Singleton fun providerOnBoardingService(@Auth retrofit: Retrofit): OnBoardingService = diff --git a/core/network/src/main/java/com/threegap/bitnagil/network/auth/AuthInterceptor.kt b/core/network/src/main/java/com/threegap/bitnagil/network/auth/AuthInterceptor.kt index ea472e37..e94aff5d 100644 --- a/core/network/src/main/java/com/threegap/bitnagil/network/auth/AuthInterceptor.kt +++ b/core/network/src/main/java/com/threegap/bitnagil/network/auth/AuthInterceptor.kt @@ -3,7 +3,6 @@ package com.threegap.bitnagil.network.auth import com.threegap.bitnagil.network.token.TokenProvider import kotlinx.coroutines.runBlocking import okhttp3.Interceptor -import okhttp3.Request import okhttp3.Response class AuthInterceptor( @@ -11,16 +10,9 @@ class AuthInterceptor( ) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() - val noToken = originalRequest.header(HEADER_NO_SERVICE_TOKEN) - - if (noToken == "true") { - return chain.proceed(removeNoTokenHeader(originalRequest)) - } val token = runBlocking { tokenProvider.getAccessToken() } - if (token.isNullOrBlank()) { - return chain.proceed(originalRequest) - } + if (token.isNullOrBlank()) return chain.proceed(originalRequest) val newRequest = originalRequest.newBuilder() .addHeader(HEADER_AUTHORIZATION, "$TOKEN_PREFIX $token") @@ -29,13 +21,7 @@ class AuthInterceptor( return chain.proceed(newRequest) } - private fun removeNoTokenHeader(request: Request): Request = - request.newBuilder() - .removeHeader(HEADER_NO_SERVICE_TOKEN) - .build() - companion object { - private const val HEADER_NO_SERVICE_TOKEN = "No-Service-Token" private const val HEADER_AUTHORIZATION = "Authorization" private const val TOKEN_PREFIX = "Bearer" } diff --git a/data/src/main/java/com/threegap/bitnagil/data/auth/datasourceimpl/AuthRemoteDataSourceImpl.kt b/data/src/main/java/com/threegap/bitnagil/data/auth/datasourceimpl/AuthRemoteDataSourceImpl.kt index 05b67739..800b6d0d 100644 --- a/data/src/main/java/com/threegap/bitnagil/data/auth/datasourceimpl/AuthRemoteDataSourceImpl.kt +++ b/data/src/main/java/com/threegap/bitnagil/data/auth/datasourceimpl/AuthRemoteDataSourceImpl.kt @@ -6,16 +6,18 @@ import com.threegap.bitnagil.data.auth.model.request.TermsAgreementRequest import com.threegap.bitnagil.data.auth.model.request.WithdrawalReasonRequest import com.threegap.bitnagil.data.auth.model.response.LoginResponse import com.threegap.bitnagil.data.auth.service.AuthService +import com.threegap.bitnagil.data.auth.service.LoginService import com.threegap.bitnagil.data.common.safeApiCall import com.threegap.bitnagil.data.common.safeUnitApiCall import javax.inject.Inject class AuthRemoteDataSourceImpl @Inject constructor( private val authService: AuthService, + private val loginService: LoginService, ) : AuthRemoteDataSource { override suspend fun login(socialAccessToken: String, loginRequest: LoginRequest): Result = safeApiCall { - authService.postLogin(socialAccessToken, loginRequest) + loginService.postLogin(socialAccessToken, loginRequest) } override suspend fun submitAgreement(termsAgreementRequest: TermsAgreementRequest): Result = @@ -35,6 +37,6 @@ class AuthRemoteDataSourceImpl @Inject constructor( override suspend fun reissueToken(refreshToken: String): Result = safeApiCall { - authService.postReissueToken(refreshToken) + loginService.postReissueToken(refreshToken) } } diff --git a/data/src/main/java/com/threegap/bitnagil/data/auth/service/AuthService.kt b/data/src/main/java/com/threegap/bitnagil/data/auth/service/AuthService.kt index 8b74dc6a..ef5a1c8b 100644 --- a/data/src/main/java/com/threegap/bitnagil/data/auth/service/AuthService.kt +++ b/data/src/main/java/com/threegap/bitnagil/data/auth/service/AuthService.kt @@ -1,23 +1,12 @@ package com.threegap.bitnagil.data.auth.service -import com.threegap.bitnagil.data.auth.model.request.LoginRequest import com.threegap.bitnagil.data.auth.model.request.TermsAgreementRequest import com.threegap.bitnagil.data.auth.model.request.WithdrawalReasonRequest -import com.threegap.bitnagil.data.auth.model.response.LoginResponse import com.threegap.bitnagil.network.model.BaseResponse import retrofit2.http.Body -import retrofit2.http.Header -import retrofit2.http.Headers import retrofit2.http.POST interface AuthService { - @POST("/api/v1/auth/login") - @Headers("No-Service-Token: true") - suspend fun postLogin( - @Header("SocialAccessToken") socialAccessToken: String, - @Body loginRequest: LoginRequest, - ): BaseResponse - @POST("/api/v1/auth/agreements") suspend fun submitAgreement( @Body termsAgreementRequest: TermsAgreementRequest, @@ -28,10 +17,4 @@ interface AuthService { @POST("/api/v1/auth/logout") suspend fun postLogout(): BaseResponse - - @POST("/api/v1/auth/token/reissue") - @Headers("No-Service-Token: true", "Auto-Login: true") - suspend fun postReissueToken( - @Header("Refresh-Token") refreshToken: String, - ): BaseResponse } diff --git a/data/src/main/java/com/threegap/bitnagil/data/auth/service/LoginService.kt b/data/src/main/java/com/threegap/bitnagil/data/auth/service/LoginService.kt new file mode 100644 index 00000000..2ed38e31 --- /dev/null +++ b/data/src/main/java/com/threegap/bitnagil/data/auth/service/LoginService.kt @@ -0,0 +1,23 @@ +package com.threegap.bitnagil.data.auth.service + +import com.threegap.bitnagil.data.auth.model.request.LoginRequest +import com.threegap.bitnagil.data.auth.model.response.LoginResponse +import com.threegap.bitnagil.network.model.BaseResponse +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.Headers +import retrofit2.http.POST + +interface LoginService { + @POST("/api/v1/auth/login") + suspend fun postLogin( + @Header("SocialAccessToken") socialAccessToken: String, + @Body loginRequest: LoginRequest, + ): BaseResponse + + @POST("/api/v1/auth/token/reissue") + @Headers("Auto-Login: true") + suspend fun postReissueToken( + @Header("Refresh-Token") refreshToken: String, + ): BaseResponse +} From b37f90f59644bac5c1357c1ad38b788e2a6cd050 Mon Sep 17 00:00:00 2001 From: wjdrjs00 Date: Tue, 17 Mar 2026 20:29:33 +0900 Subject: [PATCH 3/5] =?UTF-8?q?Refactor:=20Auto-Login=20=ED=97=A4=EB=8D=94?= =?UTF-8?q?=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/threegap/bitnagil/network/auth/TokenAuthenticator.kt | 3 --- .../com/threegap/bitnagil/data/auth/service/LoginService.kt | 2 -- 2 files changed, 5 deletions(-) diff --git a/core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt b/core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt index 7988e4b7..5417781d 100644 --- a/core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt +++ b/core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt @@ -19,7 +19,6 @@ class TokenAuthenticator( private val authMutex = Mutex() override fun authenticate(route: Route?, response: Response): Request? { - if (response.request.header(AUTO_LOGIN_HEADER) != null) return null if (!shouldRetry(response)) return null val currentToken = runBlocking { tokenProvider.getAccessToken() } @@ -83,7 +82,6 @@ class TokenAuthenticator( private fun buildRequestWithToken(originalRequest: Request, token: String): Request { return originalRequest.newBuilder() .header(AUTHORIZATION, "$TOKEN_PREFIX $token") - .removeHeader(AUTO_LOGIN_HEADER) .build() } @@ -98,6 +96,5 @@ class TokenAuthenticator( private const val AUTHORIZATION = "Authorization" private const val TOKEN_PREFIX = "Bearer" private const val SUCCESS_CODE = "CO000" - private const val AUTO_LOGIN_HEADER = "Auto-Login" } } diff --git a/data/src/main/java/com/threegap/bitnagil/data/auth/service/LoginService.kt b/data/src/main/java/com/threegap/bitnagil/data/auth/service/LoginService.kt index 2ed38e31..c032f3f5 100644 --- a/data/src/main/java/com/threegap/bitnagil/data/auth/service/LoginService.kt +++ b/data/src/main/java/com/threegap/bitnagil/data/auth/service/LoginService.kt @@ -5,7 +5,6 @@ import com.threegap.bitnagil.data.auth.model.response.LoginResponse import com.threegap.bitnagil.network.model.BaseResponse import retrofit2.http.Body import retrofit2.http.Header -import retrofit2.http.Headers import retrofit2.http.POST interface LoginService { @@ -16,7 +15,6 @@ interface LoginService { ): BaseResponse @POST("/api/v1/auth/token/reissue") - @Headers("Auto-Login: true") suspend fun postReissueToken( @Header("Refresh-Token") refreshToken: String, ): BaseResponse From 014a278c07b9dbe4f06b1b90e47275513672d292 Mon Sep 17 00:00:00 2001 From: wjdrjs00 Date: Tue, 17 Mar 2026 20:49:16 +0900 Subject: [PATCH 4/5] =?UTF-8?q?Refactor:=20ServiceModule=20=EB=82=B4=20Ret?= =?UTF-8?q?rofit=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B0=84=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bitnagil/di/data/ServiceModule.kt | 37 +++++++------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt b/app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt index ff2aba1b..d3c76973 100644 --- a/app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt +++ b/app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt @@ -20,6 +20,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import retrofit2.Retrofit +import retrofit2.create import javax.inject.Singleton @Module @@ -28,61 +29,49 @@ object ServiceModule { @Provides @Singleton - fun provideAuthService(@Auth retrofit: Retrofit): AuthService = - retrofit.create(AuthService::class.java) + fun provideAuthService(@Auth retrofit: Retrofit): AuthService = retrofit.create() @Provides @Singleton - fun provideLoginService(@NoneAuth retrofit: Retrofit): LoginService = - retrofit.create(LoginService::class.java) + fun provideLoginService(@NoneAuth retrofit: Retrofit): LoginService = retrofit.create() @Provides @Singleton - fun providerOnBoardingService(@Auth retrofit: Retrofit): OnBoardingService = - retrofit.create(OnBoardingService::class.java) + fun providerOnBoardingService(@Auth retrofit: Retrofit): OnBoardingService = retrofit.create() @Provides @Singleton - fun provideRoutineService(@Auth retrofit: Retrofit): RoutineService = - retrofit.create(RoutineService::class.java) + fun provideRoutineService(@Auth retrofit: Retrofit): RoutineService = retrofit.create() @Provides @Singleton - fun providerEmotionService(@Auth retrofit: Retrofit): EmotionService = - retrofit.create(EmotionService::class.java) + fun providerEmotionService(@Auth retrofit: Retrofit): EmotionService = retrofit.create() @Provides @Singleton - fun provideReissueService(@NoneAuth retrofit: Retrofit): ReissueService = - retrofit.create(ReissueService::class.java) + fun provideReissueService(@NoneAuth retrofit: Retrofit): ReissueService = retrofit.create() @Provides @Singleton - fun provideUserService(@Auth retrofit: Retrofit): UserService = - retrofit.create(UserService::class.java) + fun provideUserService(@Auth retrofit: Retrofit): UserService = retrofit.create() @Provides @Singleton - fun provideRecommendRoutineService(@Auth retrofit: Retrofit): RecommendRoutineService = - retrofit.create(RecommendRoutineService::class.java) + fun provideRecommendRoutineService(@Auth retrofit: Retrofit): RecommendRoutineService = retrofit.create() @Provides @Singleton - fun provideVersionService(@NoneAuth retrofit: Retrofit): VersionService = - retrofit.create(VersionService::class.java) + fun provideVersionService(@NoneAuth retrofit: Retrofit): VersionService = retrofit.create() @Provides @Singleton - fun provideAddressService(@Kakao retrofit: Retrofit): AddressService = - retrofit.create(AddressService::class.java) + fun provideAddressService(@Kakao retrofit: Retrofit): AddressService = retrofit.create() @Provides @Singleton - fun provideFileService(@Auth retrofit: Retrofit): FileService = - retrofit.create(FileService::class.java) + fun provideFileService(@Auth retrofit: Retrofit): FileService = retrofit.create() @Provides @Singleton - fun provideReportService(@Auth retrofit: Retrofit): ReportService = - retrofit.create(ReportService::class.java) + fun provideReportService(@Auth retrofit: Retrofit): ReportService = retrofit.create() } From 91a9870a5bd41591faaab5b16b1de05aa5812903 Mon Sep 17 00:00:00 2001 From: wjdrjs00 Date: Tue, 17 Mar 2026 20:55:53 +0900 Subject: [PATCH 5/5] =?UTF-8?q?Refactor:=20NetworkModule=20=EB=82=B4=20OkH?= =?UTF-8?q?ttpClient=20=EA=B3=B5=ED=86=B5=20=EC=84=A4=EC=A0=95=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20=EC=A4=91=EB=B3=B5=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bitnagil/di/core/NetworkModule.kt | 61 +++++++++---------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt b/app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt index 1792fa7b..aee10ff7 100644 --- a/app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt +++ b/app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt @@ -92,18 +92,43 @@ object NetworkModule { @Provides @Singleton - @Kakao - fun provideKakaoOkHttpClient( + fun provideBaseOkHttpClient( httpLoggingInterceptor: HttpLoggingInterceptor, - @Kakao kakaoAuthInterceptor: Interceptor, ): OkHttpClient = OkHttpClient.Builder() - .addInterceptor(kakaoAuthInterceptor) .addInterceptor(httpLoggingInterceptor) .connectTimeout(10L, TimeUnit.SECONDS) .writeTimeout(30L, TimeUnit.SECONDS) .readTimeout(30L, TimeUnit.SECONDS) .build() + @Provides + @Singleton + @NoneAuth + fun provideNoneAuthOkHttpClient(baseClient: OkHttpClient): OkHttpClient = + baseClient.newBuilder().build() + + @Provides + @Singleton + @Auth + fun provideAuthOkHttpClient( + baseClient: OkHttpClient, + @Auth authInterceptor: Interceptor, + tokenAuthenticator: TokenAuthenticator, + ): OkHttpClient = baseClient.newBuilder() + .addInterceptor(authInterceptor) + .authenticator(tokenAuthenticator) + .build() + + @Provides + @Singleton + @Kakao + fun provideKakaoOkHttpClient( + baseClient: OkHttpClient, + @Kakao kakaoAuthInterceptor: Interceptor, + ): OkHttpClient = baseClient.newBuilder() + .addInterceptor(kakaoAuthInterceptor) + .build() + @Provides @Singleton @Kakao @@ -141,34 +166,6 @@ object NetworkModule { fun provideAuthInterceptor(tokenProvider: TokenProvider): Interceptor = AuthInterceptor(tokenProvider) - @Provides - @Singleton - @Auth - fun provideAuthOkHttpClient( - httpLoggingInterceptor: HttpLoggingInterceptor, - @Auth authInterceptor: Interceptor, - tokenAuthenticator: TokenAuthenticator, - ): OkHttpClient = OkHttpClient.Builder() - .addInterceptor(authInterceptor) - .addInterceptor(httpLoggingInterceptor) - .authenticator(tokenAuthenticator) - .connectTimeout(10L, TimeUnit.SECONDS) - .writeTimeout(30L, TimeUnit.SECONDS) - .readTimeout(30L, TimeUnit.SECONDS) - .build() - - @Provides - @Singleton - @NoneAuth - fun provideNoneAuthOkHttpClient( - httpLoggingInterceptor: HttpLoggingInterceptor, - ): OkHttpClient = OkHttpClient.Builder() - .addInterceptor(httpLoggingInterceptor) - .connectTimeout(10L, TimeUnit.SECONDS) - .writeTimeout(30L, TimeUnit.SECONDS) - .readTimeout(30L, TimeUnit.SECONDS) - .build() - @Provides @Singleton @Auth