로그인 구현 관련 문의

안녕하십니까. 안드로이드 스튜디오로 카카오톡 로그인 구현을 하고 싶은 학생입니다. 다름이 아니라 어느 정도 틀(?)까지는 만들었다고 생각을 했습니다. 하지만 디버깅을 하고 앱을 실행하는 순간 백지 상태가 되어 나옵니다. 어떤 것을 수정해야 되는지 알려주시면 감사하겠습니다! 만든 내용은 아래에 스크린샷을 첨부하여 보여드리겠습니다!












죄송합니다. 매번 번거롭게 하네요 제가 , ㅠㅠㅠ
참고로 테스트용으로 작업을 하고 있습니다!

안녕하세요

구현하신 코드에서 로그인 로직이 KakaoAuthViewModel에 구현되어있고, MainActivity.onCreate() 에서 KakaoAuthViewModel를 직접 초기화하고 있네요. 그런데 ViewModel 혹은 AndroidViewModel 객체는 자체적인 생명주기를 가지고 있어서 개발자가 직접 초기화를 하는 것이 아니라 별도의 메소드 호출을 통해 객체를 생성해야합니다.

ViewModel 객체를 초기화하는 방법은 다양한 방법이 있기 때문에 제가 구체적인 코드 안내를 드리는 것보다는 직접 공식문서 및 다양한 레퍼런스들을 확인해보는 것이 좋을 것 같아요.

이 부분을 수정하시면 정상적으로 동작할 것으로 보입니다.

안녕하십니까. 피드백 주신 내용 잘 읽었습니다. 권유하신 해당 사이트에 들어가 문서를 읽긴 하였으나 제가 개발 아예 초보 단계여서 이해를 하지 못했습니다, 구체적으로 제안이나 알려주실 수 있으실까요?
매번 번거롭게 해서 죄송합니다

작성해주신 코드를 조금 더 상세하게 확인해봤는데요, 왜 이렇게 작성하셨는지에 대한 의도는 알 수 없지만 우선은 작성하신 handleKakaoLogin 코드를 기능별로 나누어야할 것으로 보여요.

카카오SDK의 대부분의 기능은 서버와 네트워크 호출을 통해 동작하고, 호출 결과를 비동기적으로 callback을 통해 전달해주고 있습니다. 따라서 callback의 호출 시점은 개발자가 보장할 수 없고, 이러한 이유로 작성하신 코드는 동시에 여러 기능이 호출되고 있다고 볼 수 있습니다.

ex) 작성된 코드 중 일부

UserApiClient.instance.loginWithKakaoAccount(
    context,
    prompts = listOf(Prompt.SELECT_ACCOUNT)
) { token, error ->
    if (error != null) {
        Log.e(TAG, "로그인 실패", error)
    } else if (token != null) {
        Log.i(TAG, "로그인 성공 ${token.accessToken}")
    }
}

UserApiClient.instance.loginWithKakaoTalk(
    context,
    serviceTerms = serviceTerms
) { token, error ->
    if (error != null) {
        Log.e(TAG, "카카오톡으로 로그인 실패", error)
        if (error is ClientError && error.reason == ClientErrorCause.Cancelled) {
            return@loginWithKakaoTalk
        }
        UserApiClient.instance.loginWithKakaoAccount(context, callback = callback)
    } else if (token != null) {
        Log.i(TAG, "카카오톡으로 로그인 성공 ${token.accessToken}")
    }
}

위의 코드는 코드 윗 줄인 loginWithKakaoAccount 부터 실행된 뒤 callback 내부가 동작하고, 그 후에 loginWithKakaoTalk 이 동작한다고 생각할 수 있는데요, 실제로는 loginWithKakaoAccount이 실행되고, 곧바로 loginWithKakaoTalk이 실행됩니다. 이는 각각의 기능들이 비동기적으로 실행되어 각각의 동작이 끝나고 나서 callback 내부가 호출되기 때문입니다.


현재는 로그인 버튼 한 개를 누르면 여러 기능이 모두 실행되도록 되어있고, 로그인과 유저 정보 확인, 토큰 정보 확인, 로그아웃 등의 여러 기능이 비동기적으로 동시에 실행되고 있기 때문에 정상적으로 동작할 수 없습니다. 제대로 동작하시기를 원한다면 UI 상에 버튼을 여러 개 만들어서, 각각 확인하고 싶은 기능별로 기능을 분리해서 구현해야할 것 같아요.

그리고 카카오SDK 내부적으로 Activity를 사용하는 기능들이 있습니다. 이러한 기능들은 context를 전달받도록 구현되어있는데요, 안드로이드 시스템의 특성상 Activity를 실행시키기 위해서는 context가 Activity의 context이거나 실행하려고 하는 Activity 가 별도의 task에서 실행되도록 설정해야합니다. 이런 이유로 applicationContext를 전달해서 카카오SDK의 기능을 실행하면 일부 기능의 경우 정상적으로 동작하지 않을 수 있습니다.

또한 이전 댓글에서 간단하게 안내드린 것과 같이 안드로이드에서 제공하는 ViewModel 또는 AndroidViewModel 클래스는 자체적인 생명주기를 가지기 때문에 별도의 초기화 메소드를 호출해서 객체를 생성해야합니다.

작성하신 코드를 확인했을 때 개발에 대해 익숙하지 않으신 것으로 보이는데요, 개발 공부 목적이 아니라 단순 테스트의 목적이라면 카카오 디벨로퍼스에서 제공하는 샘플앱을 활용하는 것도 좋을 것 같습니다.

안드로이드에 대해 상세하게 설명드리기에는 너무 양이 방대하고, 어느 정도의 이해도를 가지고 계신지 알기 어려워 자세히 설명드리지 못하는 점은 양해 부탁드리겠습니다.