Conversation
- 카카오 SDK 의존성 추가 - AndroidManifest.xml에 AuthCodeHandlerActivity 추가 - Application 클래스에서 카카오 SDK 초기화 - 카카오 네이티브 앱 키 gradle.properties에서 관리
- LoginViewModel 추가 및 카카오 로그인 로직 구현 - LoginScreen에 임시 카카오 로그인 UI 및 이벤트 핸들링 추가
|
""" Walkthrough카카오 소셜 로그인을 위한 기능이 전반적으로 도입되었습니다. 카카오 SDK가 앱에 연동되고, 로그인 화면과 ViewModel, 인텐트/사이드이펙트/상태 모델이 추가되었습니다. 빌드 설정과 매니페스트가 카카오 인증에 맞게 수정되었으며, 관련 라이브러리와 저장소가 프로젝트에 반영되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant LoginScreenContainer
participant LoginViewModel
participant KakaoSDK
participant UserApiClient
User->>LoginScreenContainer: 카카오 로그인 버튼 클릭
LoginScreenContainer->>LoginViewModel: OnKakaoLoginClick 인텐트 전송
LoginViewModel->>LoginScreenContainer: (사이드이펙트) RequestKakaoTalkLogin 또는 RequestKakaoAccountLogin
LoginScreenContainer->>KakaoSDK: loginWithKakaoTalk/loginWithKakaoAccount 호출
KakaoSDK-->>LoginScreenContainer: OAuthToken, error 반환
LoginScreenContainer->>LoginViewModel: OnKakaoLoginResult 인텐트 전송
LoginViewModel->>UserApiClient: me()로 사용자 정보 요청 (성공 시)
UserApiClient-->>LoginViewModel: 사용자 정보 반환 또는 에러
Assessment against linked issues
Poem
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
⏰ Context from checks skipped due to timeout of 90000ms (1)
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: 3
🧹 Nitpick comments (5)
settings.gradle.kts (1)
23-24: 카카오 전용 레포지토리에 scope 제한을 두면 의도치 않은 의존성 충돌을 줄일 수 있습니다
google()레포지토리에서 사용한 것처럼content { includeGroup("com.kakao.sdk") }블록을 추가하면, 해당 레포지토리에서 com.kakao.sdk 그룹만 받아오도록 제한할 수 있습니다. 불필요한 중복 다운로드와 잠재적 충돌을 예방할 수 있으니 적용을 권장드립니다.- maven { url = java.net.URI("https://devrepo.kakao.com/nexus/content/groups/public/") } + maven { + url = java.net.URI("https://devrepo.kakao.com/nexus/content/groups/public/") + content { + includeGroup("com.kakao.sdk") + } + }presentation/src/main/java/com/threegap/bitnagil/presentation/login/model/LoginState.kt (1)
6-9: 불필요한is접두사로 인한 Kotlincopy()파라미터 네이밍 이슈
Kotlin 데이터 클래스에서Boolean필드에is접두사를 사용하면copy()시 파라미터명이isLoggedIn으로 그대로 노출되어 IDE 자동 완성 시 가독성이 약간 떨어집니다.loggedIn으로 네이밍하면copy(loggedIn = true)형태로 자연스러워집니다. 변경을 고려해 주세요.-data class LoginState( - val isLoggedIn: Boolean = false, -) : MviState +data class LoginState( + val loggedIn: Boolean = false, +) : MviStatepresentation/src/main/java/com/threegap/bitnagil/presentation/login/model/LoginSideEffect.kt (1)
5-9:data object대신object사용 고려
필드가 없는 singleton인 경우data object키워드는 의미적 이점이 거의 없습니다(구조 동등성 비교가 필요 없기 때문). 단순object로 선언하면 bytecode 와 직렬화 오버헤드를 약간 줄일 수 있습니다.- data object RequestKakaoTalkLogin : LoginSideEffect - ... - data object RequestKakaoAccountLogin : LoginSideEffect + object RequestKakaoTalkLogin : LoginSideEffect + ... + object RequestKakaoAccountLogin : LoginSideEffectapp/build.gradle.kts (1)
12-25: API 키 설정이 보안 관점에서 적절합니다.local.properties에서 민감한 API 키를 로드하는 방식이 올바르며, manifestPlaceholders와 buildConfigField 모두 정확히 설정되었습니다.
선택적 개선사항: local.properties 파일이 없거나 키가 누락된 경우에 대한 에러 처리를 추가하는 것을 고려해보세요:
val properties = Properties().apply { - load(rootProject.file("local.properties").inputStream()) + val localPropertiesFile = rootProject.file("local.properties") + if (localPropertiesFile.exists()) { + load(localPropertiesFile.inputStream()) + } } + +val kakaoAppKey = properties["kakao.native.app.key"] as? String + ?: throw GradleException("kakao.native.app.key not found in local.properties")presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginScreen.kt (1)
64-78: 플레이스홀더 UI에 TODO 주석 추가 권장현재 "빛나길 로고"와 "카카오 로그인버튼"이라는 플레이스홀더 텍스트가 사용되고 있습니다. 나중에 실제 UI 요소로 교체해야 함을 명확히 하기 위해 TODO 주석을 추가하는 것이 좋습니다.
+ // TODO: 실제 로고 이미지로 교체 필요 Text( text = "빛나길 로고", modifier = Modifier.align(Alignment.Center), ) Button( onClick = onKakaoLoginClick, modifier = Modifier .align(Alignment.BottomCenter) .padding(20.dp), ) { + // TODO: 카카오 로그인 버튼 디자인 적용 필요 Text( text = "카카오 로그인버튼", ) }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (12)
app/build.gradle.kts(3 hunks)app/src/main/AndroidManifest.xml(1 hunks)app/src/main/java/com/threegap/bitnagil/BitnagilApplication.kt(1 hunks)app/src/main/java/com/threegap/bitnagil/MainNavHost.kt(2 hunks)gradle/libs.versions.toml(2 hunks)presentation/build.gradle.kts(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginScreen.kt(2 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginViewModel.kt(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/login/model/LoginIntent.kt(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/login/model/LoginSideEffect.kt(1 hunks)presentation/src/main/java/com/threegap/bitnagil/presentation/login/model/LoginState.kt(1 hunks)settings.gradle.kts(1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (2)
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (1)
presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginScreen.kt (1)
LoginScreenContainer(23-51)
presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginViewModel.kt (1)
presentation/src/main/java/com/threegap/bitnagil/presentation/common/mviviewmodel/MviViewModel.kt (1)
sendSideEffect(23-23)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: build
🔇 Additional comments (9)
gradle/libs.versions.toml (1)
53-54: 카카오 SDK 버전 최신 여부 확인 필요
현재 추가된2.21.4버전은 24년 4월 릴리즈로, 최근 보안 패치가 포함된 2.22.x 이상이 존재합니다. 출시 시점에 맞춰 한 번 더 버전 확인을 권장드립니다.
또한 Kakao SDK 는v2-navi·v2-share등 모듈 간 의존성이 있으니, 추후 확장 시 bundle 정의를 고려해 두면 유지보수가 용이합니다.Also applies to: 119-120
presentation/build.gradle.kts (1)
16-17: Proguard/R8 설정 누락 여부 점검
kakao-v2-user의 경우@Keep어노테이션이 부족한 API 가 있어 난독화 시 문제를 일으키는 사례가 있습니다. 릴리즈 빌드에서 로그인 실패를 방지하려면consumer-rules.pro파일에 Kakao SDK keep 규칙을 추가했는지 확인해 주세요.
예:-keep class com.kakao.sdk.** { *; } -keep class okhttp3.internal.publicsuffix.PublicSuffixDatabaseapp/src/main/java/com/threegap/bitnagil/BitnagilApplication.kt (1)
4-4: 카카오 SDK 초기화 구현이 올바릅니다.Application 클래스에서 SDK를 초기화하는 것은 Android 모범 사례를 따르고 있으며, BuildConfig를 통한 API 키 사용도 보안상 적절합니다.
Also applies to: 11-11, 14-16
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (1)
8-8: 네비게이션 구조 개선이 적절합니다.LoginScreenContainer를 사용하여 로그인 로직을 컨테이너 내부로 캡슐화한 것은 관심사 분리 측면에서 좋은 설계입니다. ViewModel을 통한 상태 관리로 더 깔끔한 아키텍처가 되었습니다.
Also applies to: 21-21
app/build.gradle.kts (1)
40-40: 카카오 SDK 의존성 추가가 적절합니다.프레젠테이션 모듈과 일관성 있게 동일한 라이브러리를 사용하고 있습니다.
app/src/main/AndroidManifest.xml (1)
29-42: 카카오 OAuth 활동 설정이 정확합니다.AuthCodeHandlerActivity의 인텐트 필터 구성이 카카오 SDK 요구사항에 맞게 올바르게 설정되었으며, 매니페스트 플레이스홀더 사용도 build.gradle.kts와 일관성 있게 구현되었습니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/login/model/LoginIntent.kt (1)
6-13: MVI 패턴 구현이 적절합니다.LoginIntent sealed class가 카카오 로그인 플로우의 사용자 의도를 명확하게 정의하고 있으며, 옵셔널 타입을 적절히 사용하여 성공/실패 케이스를 처리할 수 있도록 설계되었습니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginViewModel.kt (1)
30-37: 카카오 로그인 타입 선택 로직이 적절합니다카카오톡 앱 사용 가능 여부에 따라 적절한 로그인 방식을 선택하는 로직이 잘 구현되었습니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginScreen.kt (1)
23-51: 컨테이너 패턴이 잘 구현되었습니다UI 로직과 비즈니스 로직을 효과적으로 분리한 좋은 구현입니다. 사이드이펙트 처리와 콜백 관리가 깔끔하게 구성되어 있습니다.
presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginViewModel.kt
Show resolved
Hide resolved
presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginViewModel.kt
Show resolved
Hide resolved
presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginViewModel.kt
Show resolved
Hide resolved
- GitHub Actions 워크플로우에 local.properties 파일 생성 단계 추가
There was a problem hiding this comment.
Actionable comments posted: 0
🔭 Outside diff range comments (1)
.github/workflows/develop_branch.yml (1)
30-38: ✅ 빌드 전에local.properties를 생성해야 합니다
assembleDebug작업이 먼저 실행되고, 그 이후에local.properties파일을 생성하고 있습니다.
Gradle 빌드 과정에서kakao.native.app.key속성을 필요로 한다면 현재 순서로는 해당 값을 읽지 못해 빌드 실패 혹은 런타임 오류가 발생할 수 있습니다.다음과 같이
Generate local.properties단계를Build with Gradle단계보다 위로 이동하세요.- - name: Build with Gradle - run: ./gradlew assembleDebug - - - name: Generate local.properties + - name: Generate local.properties env: KAKAO_NATIVE_APP_KEY: ${{ secrets.KAKAO_NATIVE_APP_KEY }} run: | echo "kakao.native.app.key=$KAKAO_NATIVE_APP_KEY" >> local.properties + + - name: Build with Gradle + run: ./gradlew assembleDebug
🧹 Nitpick comments (1)
.github/workflows/develop_branch.yml (1)
36-37:>>대신>사용 고려
>>(append) 연산자를 사용하면 이미 존재하는local.properties에 같은 키가 중복 기록될 수 있습니다. CI 환경에서 매번 새 파일을 만드는 목적이라면 덮어쓰는>연산자가 더 안전하고 의도에 부합합니다.- echo "kakao.native.app.key=$KAKAO_NATIVE_APP_KEY" >> local.properties + echo "kakao.native.app.key=$KAKAO_NATIVE_APP_KEY" > local.properties
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
.github/workflows/develop_branch.yml(1 hunks)app/build.gradle.kts(3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- app/build.gradle.kts
[ PR Content ]
카카오 소셜 로그인을 구현합니다.
Related issue
Screenshot 📸
default.mp4
Work Description
To Reviewers 📢
이 값들을 통해 회원가입하는 부분은 추후 network 설정과 서버 작업이 완료되는 시점에 고도화 해서 작업하겠습니다..!
필수 확인 사항
Summary by CodeRabbit
New Features
버그 수정
기타