관리 메뉴

나만을 위한 블로그

[Android] 코틀린으로 카카오 로그인 구현하기 본문

Android

[Android] 코틀린으로 카카오 로그인 구현하기

참깨빵위에참깨빵 2021. 2. 11. 00:07
728x90
반응형

※ 이 포스팅에서 다루는 카카오 SDK는 v2 버전이다.

 

이번 포스팅에선 코틀린으로 카카오 로그인을 어떻게 구현하는지에 대해 포스팅하려고 한다.

 

주의할 것은 프로젝트에 FCM까지 붙일 거라면 프로젝트 이름 중간에 example이란 글자가 들어가면 안된다.

아마 프로젝트명을 확인하면 com.example.app 형태일텐데, 중간의 example을 다른 글자로 바꿔야 한다.

카카오 로그인을 적용하고 나서 바꾸려면 좀 귀찮은 게 아니니 FCM을 붙일거라면 미리 바꿔주자. 바꾸는 것도 간단해서 시간도 얼마 안 걸린다.

FCM을 붙일 게 아니라면 그냥 아래로 쭉 읽어 내려가면 된다.

 

먼저 카카오 디벨로퍼에 앱을 등록해야 한다. 아래 링크를 통해 카카오 디벨로퍼로 이동해 로그인한다.

 

developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

로그인했다면 상단의 내 애플리케이션을 누르고 이렇게 생긴 버튼을 누른다.

 

 

그럼 아래 화면이 나온다.

 

앱 아이콘은 플레이 스토어에 릴리스로 내는 게 아니라면 굳이 넣을 필요는 없다. 공부용이라면 더더욱 넣을 필요가 없다.

앱 이름은 적당히 짓고, 사업자명에는 본인의 이름을 써주자. 사업자가 아니라고 이름을 안 쓰고 저장을 누르면 입력하라고 나오니 순순히 처음부터 입력해주자.

 

저장을 누르면 앱 이름으로 된 항목이 하나 생기는데 이걸 누르면 아래와 같은 화면이 나온다.

 

 

네이티브 앱 키는 복사해서 res/strings.xml에 추가한다.

<resources>
    <string name="app_name">AppName</string>
    <string name="kakao_app_key">asdfasdf</string>
</resources>

 

카카오 로그인을 활성화해야 하니 왼쪽의 카카오 로그인을 누른다.

 

OFF로 된 걸 클릭하면 ON으로 바뀐다. 이걸로 카카오 로그인 활성화는 끝이다.

그 다음 왼쪽 메뉴에서 앱 설정 > 플랫폼을 누른다.

 

 

안드로이드 앱에 붙일 것이기 때문에 Android 플랫폼 등록 버튼을 누른다. 그럼 아래 화면이 나온다.

 

패키지명에는 com.practice.app 형태의 문자열을 복사해서 그대로 붙여넣으면 된다. 이것은 앱 수준 gradle 파일이나 매니페스트, 코틀린 파일의 최상단을 확인해보면 바로 알 수 있다.

패키지명을 작성하면 마켓 URL은 자동으로 작성되니 패스한다. 문제는 키 해시다.

 

여기서 잠깐 프로젝트에 의존성 문구들을 복붙하고 가자.

아래 문구는 android {} 안의 buildTypes 밑에 붙여넣는다.

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }

 

다음으로 카카오 로그인을 쓰기 위한 의존성 문구들을 붙여넣는다. 카카오 디벨로퍼를 찾아보면 나오긴 하지만 미래의 나는 분명 어딨는지 까먹어서 찾느라 시간 버릴테니 그 때를 대비해서 그냥 다 넣었다.

implementation "com.kakao.sdk:v2-user:2.3.0" // 카카오 로그인
implementation "com.kakao.sdk:v2-talk:2.3.0" // 친구, 메시지(카카오톡)
implementation "com.kakao.sdk:v2-story:2.3.0" // 카카오스토리
implementation "com.kakao.sdk:v2-link:2.3.0" // 메시지(카카오링크)
implementation "com.kakao.sdk:v2-navi:2.3.0" // 카카오내비
implementation 'com.kakao.sdk:usermgmt:1.27.0' // 카카오 로그인 버튼 만들 때 사용

 

그리고 매니페스트에는 꼭 인터넷 퍼미션을 넣어준다. 안 넣고 카카오 로그인 안된다고 하면 할말이 없다.

<uses-permission android:name="android.permission.INTERNET" />

 

이제 키해시를 구해보자. 코틀린으로 작성하는 것이니 아래 메서드를 아무 액티비티에나 붙여넣는다.

임포트 문구도 꼭 넣어준다.

import com.kakao.sdk.common.util.Utility

val keyHash = Utility.getKeyHash(this)
Log.e("해시키", keyHash)

 

저렇게 한 다음 에뮬레이터든 실기기로든 앱을 빌드하면 로그창에 해시키가 출력된다. 그걸 복사해서 그대로 저 키 해시란에 붙여넣으면 된다.

다 붙여넣었으면 저장을 눌러 완료한다.

 

다음은 첫 카카오 로그인 시 유저한테 받을 항목들을 설정해야 한다.

 

동의항목을 누르면 위 화면이 나온다. 알아서 설정해주자.

 

이제 본격적으로 코드를 복붙할 시간이다. 먼저 GlobalApplication이라는 Application을 상속한 클래스를 만들어준다.

import android.app.Application
import com.kakao.auth.KakaoSDK

class GlobalApplication : Application()
{
    companion object
    {
        var instance: GlobalApplication? = null
    }
    
    override fun onCreate()
    {
        super.onCreate()

        instance = this
        KakaoSDK.init(KakaoSDKAdapter())
    }

    override fun onTerminate()
    {
        super.onTerminate()
        instance = null
    }

    fun getGlobalApplicationContext(): GlobalApplication
    {
        checkNotNull(instance) { "this application does not inherit com.kakao.GlobalApplication" }
        return instance!!
    }

}

 

카카오 SDK를 쓰려면 초기화 과정이 필요하다. 위 클래스가 초기화를 담당하는 클래스다. 싱글톤 패턴으로 코드를 바꿔도 무관하다.

여기서 KakaoSDKAdapter() 부분에 빨간 줄이 생길 것이다. 아직 만들지 않아서 그런 것이다.

아래는 KakaoSDKAdapter의 코드다.

import com.kakao.auth.*

open class KakaoSDKAdapter : KakaoAdapter()
{
    override fun getSessionConfig(): ISessionConfig
    {
        return object : ISessionConfig
        {
            override fun getAuthTypes(): Array<AuthType>
            {
                return arrayOf(AuthType.KAKAO_LOGIN_ALL)
            }

            override fun isUsingWebviewTimer(): Boolean
            {
                return false
            }

            override fun getApprovalType(): ApprovalType?
            {
                return ApprovalType.INDIVIDUAL
            }

            override fun isSaveFormData(): Boolean
            {
                return true
            }

            override fun isSecureMode(): Boolean
            {
                return true
            }
        }
    }

    override fun getApplicationConfig(): IApplicationConfig
    {
        return IApplicationConfig {
            GlobalApplication.instance?.getGlobalApplicationContext()
        }
    }
}

 

이제 액티비티를 코딩할 차례다. 코틀린 파일을 열어서 아래 코드를 적절한 위치에 붙여넣는다.

import com.kakao.auth.ApiErrorCode
import com.kakao.auth.ISessionCallback
import com.kakao.auth.Session
import com.kakao.network.ErrorResult
import com.kakao.usermgmt.UserManagement
import com.kakao.usermgmt.callback.MeV2ResponseCallback
import com.kakao.usermgmt.response.MeV2Response
import com.kakao.util.exception.KakaoException

override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        callback = SessionCallback()
        Session.getCurrentSession().addCallback(callback)
        Session.getCurrentSession().checkAndImplicitOpen()

        kakao_login.setOnClickListener {
            callback = SessionCallback()
            Session.getCurrentSession().addCallback(callback)
            Session.getCurrentSession().checkAndImplicitOpen()
        }

    }
    
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
    {
        if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data))
        {
            Log.e(TAG, "onActivityResult()에서 세션 획득!!")
            return
        }
        super.onActivityResult(requestCode, resultCode, data)
    }

    override fun onDestroy()
    {
        super.onDestroy()
        Session.getCurrentSession().removeCallback(callback)
    }
    
    inner class SessionCallback : ISessionCallback
    {
        override fun onSessionOpenFailed(exception: KakaoException?)
        {
            Log.e("Log", "Session Call back :: onSessionOpenFailed: ${exception?.message}")
        }

        override fun onSessionOpened()
        {
            UserManagement.getInstance().me(object : MeV2ResponseCallback()
            {

                override fun onFailure(errorResult: ErrorResult?)
                {
                    val result = errorResult?.errorCode
                    if (result == ApiErrorCode.CLIENT_ERROR_CODE)
                    {
                        Toast.makeText(this@MainActivity, "네트워크 연결이 불안정합니다. 다시 시도해 주세요", Toast.LENGTH_SHORT).show()
                        finish()
                    }
                    else
                    {
                        Toast.makeText(this@MainActivity, "로그인 도중 오류가 발생했습니다 : ${errorResult?.errorMessage}", Toast.LENGTH_SHORT).show()
                    }
                }

                override fun onSessionClosed(errorResult: ErrorResult?)
                {
                    Toast.makeText(this@MainActivity, "세션이 닫혔습니다. 다시 시도해 주세요", Toast.LENGTH_SHORT).show()
                }

                override fun onSuccess(result: MeV2Response?)
                {
                    Log.e("카카오 로그인", "결과 : $result")
                    Log.e("카카오 로그인", "아이디 : ${result!!.id}")
                    Log.e("카카오 로그인", "이메일 : ${result.kakaoAccount.email}")
                    Log.e("카카오 로그인", "프로필 이미지 : ${result.profileImagePath}")
                    val intent = Intent(this@MainActivity, AfterActivity::class.java)
                    startActivity(intent)
                    finish()
                }
            })
        }
    }

 

xml에 카카오 로그인 버튼을 만들고 싶다면 아래 코드를 xml의 원하는 위치에 붙여넣는다.

<com.kakao.usermgmt.LoginButton
        android:id="@+id/kakao_login"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintWidth_percent="1"
        app:layout_constraintHeight_percent=".07"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

 

 

이제 중요한 처리가 남았다. 위에서 만든 GlobalApplication을 매니페스트에 등록해줘야 한다.

아래와 같이 매니페스트의 <application>의 name 속성을 수정한다.

<application
        android:name=".GlobalApplication"

 

폴더 안에 넣었어도 .을 누르면 알아서 경로가 생성된다.

그리고 <activity> 태그들 사이에 아래 내용을 적절하게 붙여넣는다.

asdfasdf 부분은 지우고 자신의 네이티브 앱 키를 그대로 붙여넣으면 된다.

<activity android:name="com.kakao.auth.authorization.authcode.KakaoWebViewActivity"
            android:launchMode="singleTop"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:host="oauth"
                    android:scheme="kakaoasdfasdf" />
            </intent-filter>
        </activity>
        <meta-data
            android:name="com.kakao.sdk.AppKey"
            android:value="@string/kakao_app_key" />

 

이렇게 한 후 앱을 빌드하면 카카오 로그인이 작동하는 걸 볼 수 있다.

반응형
Comments