Conversation
minjun011026
left a comment
There was a problem hiding this comment.
수고하셨습니다!
iOS는 테스트해볼 수 없어 제거하셨다고 하셨으나 이 부분도 같이 구현해주시면 좋을 것 같습니다.
테스트는 XCode를 설치하시면 iOS 에뮬레이터를 돌려보실 수 있습니다.
만약 맥이 아니시라면 어쩔 수 없지만 가능하시다면 구현해주시면 감사하겠습니다.
composeApp/build.gradle.kts
Outdated
| // Android Credential Manager (구글 소셜 로그인) | ||
| implementation("androidx.credentials:credentials:1.2.2") | ||
| implementation("androidx.credentials:credentials-play-services-auth:1.2.2") | ||
| implementation("com.google.android.libraries.identity.googleid:googleid:1.1.1") |
There was a problem hiding this comment.
이런 라이브러리는 버전 카탈로그를 사용해서 `libs.~~' 구조로 변경해주세요
윈도우기준 ctrl+enter, 맥 기준 option+enter시 자동으로 변경해줍니다
버전 카탈로그로 변경하는 이유는
예를 들어 동일한 라이브러리나 플러그인을 다양한 모듈에서 사용하게 되는 경우가 있는데 이때 A모듈에서는 1.2.1 버전을 B 모듈에서는 1.3.1 버전을 사용하면 최신 버전과 이전 버전의 충돌이 발생할 수 있습니다.
이러한 문제를 해결하고자 버전 카탈로그라는 것을 사용하는데 동일한 라이브러리나 플러그인에 대해서 버전 관리를 한 곳에서 관리하도록 하는 방법입니다.
또한 이후의 버전 업데이트도 libs.version.toml 파일에서 한번에 수정할 수 있다는 장점이 있습니다.
There was a problem hiding this comment.
오... c언어 make처럼 버전 카탈로그라는게 있었네요.. 감사합니다. libs.version.toml 파일에 넣었고 libs 구조로 변경하였습니다.
| // Google Cloud Console에서 발급받은 '웹 애플리케이션' 클라이언트 ID를 넣으세요. | ||
| val googleIdOption = GetGoogleIdOption.Builder() | ||
| .setFilterByAuthorizedAccounts(false) | ||
| .setServerClientId("959466703756-co3djr6qc398j3jumc2n1u93tlqs5j5n.apps.googleusercontent.com") |
There was a problem hiding this comment.
클라이언트아이디를 코드에 포함하는 건 좋지 않은 구조로 보입니다.
보안상으로는 큰 문제가 없지만 실수로 아이디의 철자를 하나 지우거나 추가되는 문제가 발생할 수 있고 이런 불규칙한 문자열에서는 문제를 발견하기 어려울 수 있기 때문입니다.
또한 이런 구성 정보를 직접 코드에 추가하는 것은 권장되지 않는 구조로 분리하는 게 좋을 것 같습니다.
There was a problem hiding this comment.
kakao처럼 local properties에 추가해서 사용하겠습니다.
There was a problem hiding this comment.
고쳤습니다! 다른 부분도 전부 고쳐서 다시 푸시하겠습니다.
| MaterialTheme { | ||
| var showContent by remember { mutableStateOf(false) } | ||
| var isLoggedIn by remember { mutableStateOf(false) } | ||
| var userName by remember { mutableStateOf("") } |
There was a problem hiding this comment.
컴포저블 함수는 configure change(구성 변경)에서 안전하지 않습니다.
예를 들어 화면 화면, 글꼴 변경 등으로 액티비티가 재생성되면 기존의 값들은 유지되지 않습니다.
그렇기에 UI 함수가 remember로 isLoggedIn 등의 값을 가지고 있는 건 좋지 않은 구조입니다.
만약 사용자가 로그인후 화면을 돌리면 로그인이 풀릴테니까요.
이러한 부분에서 구성변경에서도 값을 유지하는 StateHolder 역할을 수행하는 객체의 필요성이 나타납니다.
대표적으로 AAC ViewModel이 있구요.
AAC ViewModel은 아키텍처 패턴 MVVM에서의 ViewModel과 이름은 같지만 조금은 다릅니다.
MVVM에서 중개자로서의 ViewModel이 아니라 StateHolder로서 AAC ViewModel에 대해 알아보시면 좋을 것 같아요.
아래의 공식 문서들을 참고해보시면 좋을 것 같아요
https://developer.android.com/develop/ui/compose/state-lifespans?hl=ko
https://developer.android.com/topic/architecture/ui-layer/stateholders?hl=ko
minjun011026
left a comment
There was a problem hiding this comment.
수고하셨습니다!
NowInAndroid와 같은 프로젝트를 살펴보며 안드로이드 아키텍처 구조를 조금 살펴보시면 좋을 것 같아요.
추가적인 리뷰는 대면해서 수행하겠습니다!
| pingpong-android-library = { id = "pingpong.android.library", version = "unspecified" } | ||
| pingpong-kmp-library = { id = "pingpong.kmp.library", version = "unspecified" } | ||
| pingpong-kmp-compose = { id = "pingpong.kmp.compose", version = "unspecified" } No newline at end of file | ||
| pingpong-kmp-compose = { id = "pingpong.kmp.compose", version = "unspecified" } |
There was a problem hiding this comment.
이런 컨벤션 플러그인은 버전 설정을 안하셔도 됩니다.
{ id = "~~" } 형태로 작성하셔도 괜찮아요.
컨벤션 플러그인은 프로젝트 내부에 위치하여 Maven과 같은 원격 저장소에서 다운로드되지 않고 프로젝트 코드와 함께 빌드됩니다.
즉 빌드 시점에 이미 gradle이 해당 소스 코드를 알고 있어 버전 명시를 별도로 하지 않습니다.
| loginHandler: SocialLoginHandler, | ||
| googleAuthManager: GoogleAuthManager, | ||
| // ViewModel을 주입 | ||
| viewModel: AuthViewModel = viewModel { AuthViewModel() } |
There was a problem hiding this comment.
함수명이 App이 된 순간 이 함수에서는 전체 앱 단위의 작업이 수행되는 것이 옳습니다.
지금 구조는 단순 인증에 치중되어있구요.
또한 만약 AuthViewModel이 다른 Repository나 UseCase를 사용하게 될 경우 주기적인 수정도 불가피하구요.
build.gradle.kts / settings.gradle.kts: 카카오·구글 로그인 SDK 의존성을 추가하고 local.properties에서 API 키를 불러오도록 설정했습니다. (구글 소셜 로그인은 아직 미적용..)
AndroidManifest.xml: 카카오 로그인 후 앱으로 돌아올 수 있도록 특정 스킴(kakao${KEY})을 가진 액티비티를 등록했습니다.
AuthManager.kt: 안드로이드의 최신 Credential Manager를 사용하여 구글 ID 토큰을 가져오는 실제 로직을 구현했습니다.
AndroidSocialLoginHandler.kt: 카카오톡 앱 호출 또는 계정 로그인을 처리하는 안드로이드 전용 핸들러를 구현했습니다.
SocialLoginHandler.kt: 공통 모듈에서 사용할 로그인/로그아웃 함수 형식을 정의한 인터페이스입니다. (iOS 때문에 인터페이스를 만들었는데 제가 쓴 것을 테스트를 못해봐서 그냥 지웠습니다. 어쩌다 보니 안드로이드만 남았습니다.)
MainActivity.kt: 앱 실행 시 카카오 SDK를 초기화하고 각 로그인 매니저를 생성하여 UI에 전달합니다.
App.kt: 로그인 상태(성공/실패)에 따라 버튼 UI를 전환하고 비동기로 로그인 함수를 실행합니다.