Conversation
- AuthToken 데이터 클래스 추가
- Unit을 반환하는 API 호출을 위한 safeUnitApiCall 메소드 추가 - API 예외 처리를 위한 handleApiException 메소드 재사용성을 위해 분리
Walkthrough토큰 재발급 및 만료 처리 기능이 네트워크 계층에 도입되었습니다. TokenProvider와 TokenAuthenticator가 확장되어 토큰 저장, 갱신, 삭제가 가능해졌으며, 토큰 만료 시 메인 액티비티로 이동하는 콜백이 추가되었습니다. 또한, ReissueService와 AuthToken 모델이 새로 도입되었고, SafeApiCall의 예외 처리 로직이 개선되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
participant App
participant OkHttpClient
participant TokenAuthenticator
participant TokenProvider
participant ReissueService
participant MainActivity
App->>OkHttpClient: API 요청
OkHttpClient-->>TokenAuthenticator: 401 Unauthorized 응답
TokenAuthenticator->>TokenProvider: getAccessToken / getRefreshToken
alt Refresh token 존재
TokenAuthenticator->>ReissueService: reissueToken(Refresh-Token)
alt 재발급 성공
ReissueService-->>TokenAuthenticator: 새 access, refresh 토큰
TokenAuthenticator->>TokenProvider: saveTokens
TokenAuthenticator-->>OkHttpClient: 새 accessToken으로 재시도
else 재발급 실패
TokenAuthenticator->>TokenProvider: clearTokens
TokenAuthenticator->>MainActivity: onTokenExpired 콜백 (스택 클리어)
end
else Refresh token 없음
TokenAuthenticator->>TokenProvider: clearTokens
TokenAuthenticator->>MainActivity: onTokenExpired 콜백 (스택 클리어)
end
Estimated code review effort4 (~90분) Possibly related PRs
Suggested reviewers
Poem
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (2)
core/network/src/main/java/com/threegap/bitnagil/network/model/AuthToken.kt (1)
6-14: AuthToken 데이터 클래스가 잘 구현되었습니다.직렬화 설정과 JSON 매핑이 적절하게 구성되어 있습니다. role 프로퍼티 제거 TODO를 추적하여 향후 정리하시기 바랍니다.
role 프로퍼티 제거를 위한 이슈를 생성하거나 리팩토링 계획을 수립하는데 도움이 필요하시면 말씀해 주세요.
data/src/main/java/com/threegap/bitnagil/data/common/SafeApiCall.kt (1)
39-46: 예외 처리 개선이 필요합니다.JSON 파싱 실패 시 예외를 삼키고 있어 디버깅이 어려울 수 있습니다.
로깅을 추가하여 파싱 실패 원인을 추적할 수 있도록 개선을 고려해보세요:
private fun parseErrorResponse(errorBody: String?): ErrorResponse? = errorBody?.let { try { json.decodeFromString<ErrorResponse>(it) } catch (e: Exception) { + // 로깅 또는 디버그 정보 추가 고려 null } }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (7)
app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt(3 hunks)app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt(2 hunks)core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt(2 hunks)core/network/src/main/java/com/threegap/bitnagil/network/model/AuthToken.kt(1 hunks)core/network/src/main/java/com/threegap/bitnagil/network/token/ReissueService.kt(1 hunks)core/network/src/main/java/com/threegap/bitnagil/network/token/TokenProvider.kt(1 hunks)data/src/main/java/com/threegap/bitnagil/data/common/SafeApiCall.kt(1 hunks)
🧠 Learnings (6)
📓 Common learnings
Learnt from: wjdrjs00
PR: YAPP-Github/Bitnagil-Android#19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
Learnt from: wjdrjs00
PR: YAPP-Github/Bitnagil-Android#16
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:12-46
Timestamp: 2025-07-03T09:05:30.067Z
Learning: 이 프로젝트에서는 네트워크 모듈을 점진적으로 개발하고 있으며, TokenAuthenticator 같은 인증 관련 기능은 실제 API 연동 작업 시점에 NetworkModule에 연결할 예정입니다.
Learnt from: wjdrjs00
PR: YAPP-Github/Bitnagil-Android#25
File: presentation/src/main/java/com/threegap/bitnagil/presentation/splash/SplashViewModel.kt:50-65
Timestamp: 2025-07-11T03:54:23.348Z
Learning: AuthTokenDataStoreImpl.hasToken() 메소드에서 예외 발생 시 false를 반환하도록 이미 예외 처리가 구현되어 있어, 상위 레이어에서 추가적인 예외 처리가 불필요합니다.
Learnt from: wjdrjs00
PR: YAPP-Github/Bitnagil-Android#25
File: presentation/src/main/java/com/threegap/bitnagil/presentation/splash/SplashViewModel.kt:50-65
Timestamp: 2025-07-11T03:54:23.348Z
Learning: AuthTokenDataStoreImpl.hasToken() 메소드에서 예외 발생 시 false를 반환하도록 이미 예외 처리가 구현되어 있어, 상위 레이어에서 추가적인 예외 처리가 불필요합니다.
Learnt from: wjdrjs00
PR: YAPP-Github/Bitnagil-Android#25
File: presentation/src/main/java/com/threegap/bitnagil/presentation/splash/SplashViewModel.kt:50-65
Timestamp: 2025-07-11T03:54:23.348Z
Learning: AuthTokenDataStoreImpl.hasToken() 메소드에서 예외 발생 시 false를 반환하도록 이미 예외 처리가 구현되어 있어, 상위 레이어에서 추가적인 예외 처리가 불필요합니다.
core/network/src/main/java/com/threegap/bitnagil/network/token/TokenProvider.kt (1)
Learnt from: wjdrjs00
PR: #19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
core/network/src/main/java/com/threegap/bitnagil/network/token/ReissueService.kt (1)
Learnt from: wjdrjs00
PR: #19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
core/network/src/main/java/com/threegap/bitnagil/network/model/AuthToken.kt (2)
Learnt from: wjdrjs00
PR: #16
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:12-46
Timestamp: 2025-07-03T09:05:30.067Z
Learning: 이 프로젝트에서는 네트워크 모듈을 점진적으로 개발하고 있으며, TokenAuthenticator 같은 인증 관련 기능은 실제 API 연동 작업 시점에 NetworkModule에 연결할 예정입니다.
Learnt from: wjdrjs00
PR: #19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt (2)
Learnt from: wjdrjs00
PR: #16
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:12-46
Timestamp: 2025-07-03T09:05:30.067Z
Learning: 이 프로젝트에서는 네트워크 모듈을 점진적으로 개발하고 있으며, TokenAuthenticator 같은 인증 관련 기능은 실제 API 연동 작업 시점에 NetworkModule에 연결할 예정입니다.
Learnt from: wjdrjs00
PR: #19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt (2)
Learnt from: wjdrjs00
PR: #19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
Learnt from: wjdrjs00
PR: #16
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:12-46
Timestamp: 2025-07-03T09:05:30.067Z
Learning: 이 프로젝트에서는 네트워크 모듈을 점진적으로 개발하고 있으며, TokenAuthenticator 같은 인증 관련 기능은 실제 API 연동 작업 시점에 NetworkModule에 연결할 예정입니다.
🪛 detekt (1.23.8)
data/src/main/java/com/threegap/bitnagil/data/common/SafeApiCall.kt
[warning] 43-43: The caught exception is swallowed. The original exception could be lost.
(detekt.exceptions.SwallowedException)
🧰 Additional context used
🧠 Learnings (6)
📓 Common learnings
Learnt from: wjdrjs00
PR: YAPP-Github/Bitnagil-Android#19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
Learnt from: wjdrjs00
PR: YAPP-Github/Bitnagil-Android#16
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:12-46
Timestamp: 2025-07-03T09:05:30.067Z
Learning: 이 프로젝트에서는 네트워크 모듈을 점진적으로 개발하고 있으며, TokenAuthenticator 같은 인증 관련 기능은 실제 API 연동 작업 시점에 NetworkModule에 연결할 예정입니다.
Learnt from: wjdrjs00
PR: YAPP-Github/Bitnagil-Android#25
File: presentation/src/main/java/com/threegap/bitnagil/presentation/splash/SplashViewModel.kt:50-65
Timestamp: 2025-07-11T03:54:23.348Z
Learning: AuthTokenDataStoreImpl.hasToken() 메소드에서 예외 발생 시 false를 반환하도록 이미 예외 처리가 구현되어 있어, 상위 레이어에서 추가적인 예외 처리가 불필요합니다.
Learnt from: wjdrjs00
PR: YAPP-Github/Bitnagil-Android#25
File: presentation/src/main/java/com/threegap/bitnagil/presentation/splash/SplashViewModel.kt:50-65
Timestamp: 2025-07-11T03:54:23.348Z
Learning: AuthTokenDataStoreImpl.hasToken() 메소드에서 예외 발생 시 false를 반환하도록 이미 예외 처리가 구현되어 있어, 상위 레이어에서 추가적인 예외 처리가 불필요합니다.
Learnt from: wjdrjs00
PR: YAPP-Github/Bitnagil-Android#25
File: presentation/src/main/java/com/threegap/bitnagil/presentation/splash/SplashViewModel.kt:50-65
Timestamp: 2025-07-11T03:54:23.348Z
Learning: AuthTokenDataStoreImpl.hasToken() 메소드에서 예외 발생 시 false를 반환하도록 이미 예외 처리가 구현되어 있어, 상위 레이어에서 추가적인 예외 처리가 불필요합니다.
core/network/src/main/java/com/threegap/bitnagil/network/token/TokenProvider.kt (1)
Learnt from: wjdrjs00
PR: #19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
core/network/src/main/java/com/threegap/bitnagil/network/token/ReissueService.kt (1)
Learnt from: wjdrjs00
PR: #19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
core/network/src/main/java/com/threegap/bitnagil/network/model/AuthToken.kt (2)
Learnt from: wjdrjs00
PR: #16
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:12-46
Timestamp: 2025-07-03T09:05:30.067Z
Learning: 이 프로젝트에서는 네트워크 모듈을 점진적으로 개발하고 있으며, TokenAuthenticator 같은 인증 관련 기능은 실제 API 연동 작업 시점에 NetworkModule에 연결할 예정입니다.
Learnt from: wjdrjs00
PR: #19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt (2)
Learnt from: wjdrjs00
PR: #16
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:12-46
Timestamp: 2025-07-03T09:05:30.067Z
Learning: 이 프로젝트에서는 네트워크 모듈을 점진적으로 개발하고 있으며, TokenAuthenticator 같은 인증 관련 기능은 실제 API 연동 작업 시점에 NetworkModule에 연결할 예정입니다.
Learnt from: wjdrjs00
PR: #19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt (2)
Learnt from: wjdrjs00
PR: #19
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:16-20
Timestamp: 2025-07-06T04:26:03.870Z
Learning: TokenAuthenticator 클래스는 현재 임시 코드로 구현되어 있으며, 실제 토큰 재발급 API 연동 시점에 올바른 구현으로 수정될 예정입니다.
Learnt from: wjdrjs00
PR: #16
File: core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt:12-46
Timestamp: 2025-07-03T09:05:30.067Z
Learning: 이 프로젝트에서는 네트워크 모듈을 점진적으로 개발하고 있으며, TokenAuthenticator 같은 인증 관련 기능은 실제 API 연동 작업 시점에 NetworkModule에 연결할 예정입니다.
🪛 detekt (1.23.8)
data/src/main/java/com/threegap/bitnagil/data/common/SafeApiCall.kt
[warning] 43-43: The caught exception is swallowed. The original exception could be lost.
(detekt.exceptions.SwallowedException)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (16)
core/network/src/main/java/com/threegap/bitnagil/network/token/TokenProvider.kt (1)
5-7: 인터페이스 확장이 잘 구현되었습니다.토큰 생명주기 관리를 위한 새로운 메서드들이 적절하게 추가되었습니다.
suspend키워드 사용과 메서드 네이밍이 일관성 있고 명확합니다.app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt (2)
6-7: 필요한 import가 올바르게 추가되었습니다.NoneAuth와 ReissueService import가 적절합니다.
29-32: ReissueService DI 설정이 올바릅니다.토큰 재발급 API는 인증이 필요하지 않으므로
@NoneAuthRetrofit 인스턴스를 사용하는 것이 적절합니다. 기존 패턴을 잘 따르고 있습니다.core/network/src/main/java/com/threegap/bitnagil/network/token/ReissueService.kt (1)
8-13: ReissueService 인터페이스가 깔끔하게 구현되었습니다.토큰 재발급 API 설계가 적절합니다. Refresh-Token을 헤더로 전달하고 BaseResponse을 반환하는 구조가 일관성 있습니다.
data/src/main/java/com/threegap/bitnagil/data/common/SafeApiCall.kt (3)
10-25: safeApiCall 리팩토링이 잘 되었습니다.표현식 바디 사용과 예외 처리 로직 분리가 코드를 더 깔끔하게 만들었습니다. HTTP 응답 코드를 포함한 에러 코드 개선도 디버깅에 도움이 될 것입니다.
27-35: safeUnitApiCall 함수 추가가 적절합니다.PR 목표에서 언급한 Unit 타입 API 호출이 실패로 처리되는 문제를 해결하는 좋은 접근방식입니다. Unit 반환 API를 위한 전용 함수가 필요했습니다.
48-68: 예외 처리 로직이 체계적으로 구현되었습니다.HttpException, IOException, 기타 예외들을 적절히 분류하여 처리하고 있습니다. 에러 응답 파싱과 fallback 메시지 제공이 잘 구현되어 있습니다.
app/src/main/java/com/threegap/bitnagil/di/core/NetworkModule.kt (4)
3-10: import 구성이 적절합니다.토큰 만료 처리를 위한 필요한 import들이 잘 추가되었습니다. MainActivity에 대한 직접적인 의존성은 PR 설명에 따르면 네비게이션 로직이 확립된 후 이벤트 기반으로 리팩토링 예정이므로 현재로서는 적절합니다.
65-75: TokenProvider 구현이 잘 확장되었습니다.리프레시 토큰 관리를 위한 필수 메서드들이 적절히 구현되었습니다. dataStore를 통한 토큰 저장/조회/삭제 로직이 올바르게 처리되고 있습니다.
77-94: TokenAuthenticator 제공 메서드가 올바르게 구현되었습니다.토큰 만료 시 MainActivity로 이동하는 콜백이 적절한 플래그와 함께 구현되었습니다. PR 설명에 따르면 이는 임시 구현이며 추후 이벤트 기반으로 리팩토링될 예정입니다.
105-116: OkHttpClient에 TokenAuthenticator가 올바르게 통합되었습니다.401 응답 시 자동 토큰 재발급을 위한 authenticator 설정이 적절히 추가되었습니다.
core/network/src/main/java/com/threegap/bitnagil/network/auth/TokenAuthenticator.kt (5)
13-19: TokenAuthenticator가 실제 토큰 재발급 로직으로 올바르게 구현되었습니다.이전 학습 내용에 따르면 임시 구현이었던 TokenAuthenticator가 이제 TokenProvider, ReissueService와 함께 적절히 통합되었습니다. Mutex를 사용한 동시성 제어도 잘 구현되었습니다.
21-36: authenticate 메서드의 토큰 비교 및 동기화 로직이 우수합니다.현재 저장된 토큰과 요청의 토큰을 비교하여 불필요한 재발급을 방지하고, Mutex를 통해 동시 재발급 요청을 올바르게 제어합니다.
38-66: refreshAndRetry 메서드의 에러 처리가 견고합니다.리프레시 토큰 유효성 검사, API 호출 실패 처리, 응답 코드 검증이 모두 적절히 구현되었습니다. 모든 실패 케이스에서 일관되게 토큰 만료 처리가 수행됩니다.
78-91: 헬퍼 메서드들이 명확하고 올바르게 구현되었습니다.재시도 횟수 제한(2회), Bearer 토큰 헤더 생성, 토큰 만료 처리가 모두 적절합니다. PR 목표에 명시된 무한 루프 방지가 잘 구현되었습니다.
93-99: 상수 정의가 적절합니다. SUCCESS_CODE 확인 필요.HTTP 상태 코드와 Bearer 토큰 형식이 표준을 따르고 있습니다. SUCCESS_CODE "CO000"이 백엔드 API 명세와 일치하는지 확인하시기 바랍니다.
[ PR Content ]
api 호출 시 401 응답을 받을 경우 자동으로 토큰을 재발급하고 요청을 재시도하는 로직을 구현했습니다요~
추가로 기존 API 호출 에러 처리 로직도 같이 개선했습니다!
Related issue
Screenshot 📸
Work Description
토큰 재발급 로직 구현
API 에러 처리 개선 (safeApiCall)
To Reviewers 📢
Summary by CodeRabbit
신규 기능
버그 수정
리팩터링
문서화