์ ๊ท๋ก ์นด์นด์ค ๋ก๊ทธ์ธ ์ฐ๋ํ๋ ๋ธ๋ก๊ทธ๋ค์ ๊ฝค๋ ๋ดค๋๋ฐ, v1.x.x ์์ v2.x.x๋ก ์ ๋ฐ์ดํธํ๋ ๊ธ๋ค์ ์ ๊ฐ ๋ชป ์ฐพ์์ ์ ๋ฆฌํ๊ฒ ๋์์ต๋๋ค.
์ ๊ท๋ก ์นด์นด์ค ๊ณ์ ๋ก๊ทธ์ธ ์๋น์ค๋ฅผ ๋ฃ๋ ๊ฒ์ด ์๋๋ผ ์๋ต๋ ๊ณผ์ ๋ค(ํค ํด์ ๋ฑ๋ก ๋ฑ)์ด ์์ต๋๋ค.๐
6๋ ์ ์ ๋ง๋ค์ด์ ธ ์ง๊ธ๊น์ง ์ ์ง๋ณด์๋๊ณ ์๋ ์ฑ์ด๋ผ ์์ ์ ์งํํ๋ ๋ฐ ์๋ฐ๋ฅผ ์ฐ๊ฒ ๋์์ต๋๋ค.๐ฉ๐ง๐จ๐ง
Gradle ์ค์ ํ๊ธฐ
ํ๋ก์ ํธ์ build.gradle
๊ธฐ์กด ๋ ๊ฑฐ์ ์ฝ๋
allprojects {
repositories {
....
maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }
....
}
}
์์ ์ฝ๋
allprojects {
repositories {
....
maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
....
}
}
๐โ settings.gradle ์ ๋ ํ์งํ ๋ฆฌ๋ฅผ ์ค์ ํ๋ค?
https://developer.android.com/studio/preview/features#settings-gradle
์ค... ๋ฐ๋ ๊ฑฐ ์ด์ ์์๋ค.
์์ ํ๋ ์ฑ์ ์๋ ์์ 6๋ ์ ์ ์์ฑ๋ ์ค๋ ํ์คํ ๋ฆฌ๊ฐ ์๋ ์ฑ์ด๋ ์ด๋ฐ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ ์ผ์ด ์์๋ค. top level์ build.gradle์ ์์ ํ๊ณ , ํ ์คํธํ๋ ์ ๋์๊ฐ๋ค.
๋ก๊ทธ์ธ ๋ชจ๋ ์ค์ ํ๊ธฐ
app์ build.gradle
๊ธฐ์กด ๋ ๊ฑฐ์ ์ฝ๋
๊ธฐ์กด ๋ ๊ฑฐ์ SDK ๋ฒ์ ์ ๋ณด๋ฉด ๋ถ๋๋ฝ๋ค... ๋๋ฌด ์ ๋ฐ์ดํธ ์ํ๊ณ ์ด์๋ค.
dependencies {
....
implementation 'com.kakao.sdk:usermgmt:1.27.0'
....
}
์์ ์ฝ๋
dependencies {
....
implementation 'com.kakao.sdk:v2-user:2.8.4'
....
}
ํ๋ก๊ฐ๋ ์ค์ ํ๊ธฐ
๊ธฐ์กด ๋ ๊ฑฐ์ ์ฝ๋
์์. (์๋๋ฉด ๋ด๊ฐ ๋ชจ๋ฅด๋ ๊ฒ์ผ ์๋ ์๋ค...)
์ถ๊ฐ ์ฝ๋
#์นด์นด์ค ๋ก๊ทธ์ธ
-keep class com.kakao.sdk.**.model.* { <fields>; }
-keep class * extends com.google.gson.TypeAdapter
๐์ฑ์์ ์นด์นด์ค ๋ฒกํฐ๋งต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ฉ ์ค์ด๊ณ , ์ด์ ๊ด๋ จํด์ ํ๋ก๊ฐ๋์ ์ฝ๋๊ฐ ์ค์ ๋์ด ์์๋ค. ํด๋น ํ๋ก๊ฐ๋ ์ฝ๋๋ค์ ์ฃผ์์ด "#kakao" ๋ผ๊ณ ๋ง ์ ํ์์ด์, ์นด์นด์ค ๋งต์ ์๊ฐ์ง๋ ๋ชปํ๊ณ ๊ธฐ์กด ๋ ๊ฑฐ์ ๋ก๊ทธ์ธ sdk ์ ๊ด๋ จ๋ ์ค ์๊ณ ๋ค ์ง์ ๋ค๊ฐ ๋์ค์ ํ ์คํธํ๋ฉฐ ํ์ฐธ์ ํค๋งธ๋ค. ์ด๋ฒ ์ฝ์ง์ ๊ตํ์ "ํ๋ก๊ฐ๋ ์ค์ ์ ์ํ ๋ฆด๋ฆฌ์ฆ ํ ์คํธ๋ ์ํ๋ค. ์ฃผ์์ ๋ ์์ธํ ์จ๋ ๋๊ฒ ๋ค."
Application ์์
๊ธฐ์กด ๋ ๊ฑฐ์ ์ฝ๋
public class App extends Application {
@Override
public void onCreate() {
....
KakaoSDk.init(new KakaoSDKAdapter());
....
}
....
private class KakaoSDKAdapter extends KakaoAdapter {
@Override
public ISessionConfig getSessionConfig() {
return new ISessionConfig() {
@Override
public AuthType[] getAuthTypes() {
return AuthType[]{AuthType.KAKAO_LOGIN_ALL};
}
@Override
public boolean isSecureMode() {
return false;
}
@Override
public boolean isUsingWebviewTimer() {
return false;
}
@Override
public ApprovalType getApprovalType() {
return ApprovalType.INDIVIDUAL;
}
@Override
public boolean isSaveFormData() {
return true;
}
}
}
@Override
public IApplicationConfig getApplicationConfig() {
return () -> {
return App.this;
};
}
}
....
}
์์ ์ฝ๋
public class App extends Application {
@Override
public void onCreate() {
....
//KakaoSDK ์ด๊ธฐํ ์ฝ๋ ์ญ์
KakaoSdk.init(this, getString(R.string.kakao_app_key));
....
}
....
//์นด์นด์ค sdk ์ด๋ํฐ ์ญ์
....
}
string value ์์
๊ธฐ์กด ๋ ๊ฑฐ์ ์ฝ๋
<resources>
....
<string name="kakao_app_key" translatable="false">{ํค}</string>
....
</resources>
์์ ์ฝ๋
<resources>
....
<string name="kakao_app_key" translatable="false">{ํค}</string> <!--๊ธฐ์กด-->
<string name="redirect_kakao_app_key" translatable="false">kakao{ํค}</string> <!--์ถ๊ฐ-->
....
</resources>
AndroidManifest ์์
๊ธฐ์กด ๋ ๊ฑฐ์ ์ฝ๋
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="llll">
....
<application
android:name=".App"
....>
....
<meta-data
android:name="com.kakao.sdk.AppKey"
android:value="@string/kakao_app_key" />
....
</application>
....
</manifest>
์์ ์ฝ๋
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
pacakge="llll">
...
<application
android:name=".App"
...>
<!-- ์นด์นด์ค sdk meta-data ์ญ์ -->
</application>
<!-- ์กํฐ๋นํฐ ์ถ๊ฐ -->
<activity
android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Redirect URI: "kakao{NATIVE_APP_KEY}://oauth" -->
<data android:host="oauth"
android:scheme="@string/redirect_kakao_app_key" />
</intent-filter>
</activity>
...
</manifest>
๋ก๊ทธ์ธ ํ๋ฉด layout xml ์์
๊ธฐ์กด ๋ ๊ฑฐ์ ์ฝ๋
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
....
<!--์ฌ์ฉ์๊ฐ ํด๋ฆญํ๋ ๋ฒํผ-->
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/btKakao"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="14dp"
android:layout_marginRight="24dp"
android:layout_marginBottom="40dp"
android:background="@drawable/login_btn_kakao"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/btnOther"
app:layout_constraintTop_toBottomOf="@id/description" />
....
<!--์นด์นด์ค ๋ก๊ทธ์ธ sdk ์ ๊ณต ๋ฒํผ-->
<com.kakao.usermgmt.LoginButton
android:id="@+id/btKakaoLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintLeft_toRightOf="@id/btnAnother" />
....
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
์์ ์ฝ๋
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
....
<!--์ฌ์ฉ์๊ฐ ํด๋ฆญํ๋ ๋ฒํผ-->
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/btKakao"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="14dp"
android:layout_marginRight="24dp"
android:layout_marginBottom="40dp"
android:background="@drawable/login_btn_kakao"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/btnOther"
app:layout_constraintTop_toBottomOf="@id/description" />
....
<!--์นด์นด์ค ๋ก๊ทธ์ธ sdk ์ ๊ณต ๋ฒํผ ์ญ์ -->
....
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฌ ์งํํ๋ ๋ก๊ทธ์ธ ์ฝ๋ ์์
๊ธฐ์กด ๋ ๊ฑฐ์ ์ฝ๋
์์งํ ๋งํด์ ๋ณด๊ธฐ ์ข๊ณ ์ ์ด ์ฝ๋๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค.
SessionCallback์ผ๋ก ์ธ์ open์ด ์ฑ๊ณตํ๋ฉด UserManagement๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ MeV2ResponseCallback์ ํธ์ถํด์ ์งํํ๊ณ ์์๋ค.
public class LoginFragment extends BaseFragment {
....
private SessionCallback callback; //KAKAO SESSION
....
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
....
initView();
setSessionLogin();
....
}
private void initView() {
....
binding.btnKakao.setOnClickListener(v ->{
....
Session.getCurrentSession().addCallback(callback);
binding.btnKakaoLogin.callOnClick();
});
....
}
private void setSessionLogin() {
....
callback = new SessionCallback();
Session.getCurrentSession().addCallback(callback);
....
String loginType = Preference.INSTANCE.getAccountType();
if(AccountType.KAKAO.name().equalsIgnoreCase(loginType)) {
if(Session.getCurrentSession().checkAndImpliciteOpen()) {
// ๋ก๋ฉ๋ฐ ๋
ธ์ถ ์ฝ๋
....
}
} else if(...) {
....
}
....
}
....
private class SessionCallback implements ISessionCallback {
@Override
public void onSessionOpen() {
//๋ก๋ฉ๋ฐ ๋
ธ์ถ ์ฝ๋
....
requestMe(Session.getCurrentSession().getTokenInfo().getAccessToken());
}
@Override
public void onSessionOpenFailed(KakaoExeption exception) {
String loginType = Preference.INSTANCE.getAccountType();
if(AccountType.KAKAO.name().equalsIgnoreCase(loginType)) {
Session.getCurrentSession().removeCallback(callback);
Session.getCurrentSession().close();
Preference.INSTANCE.clearAccountType()
//๋ก๋ฉ๋ฐ ์ ๊ฑฐ
//์ฌ์ฉ์ ์๋ฆผ ํ ์คํธ
....
}
}
}
private void requestMe(String accessToken) {
UserManagement.getInstance().me(new MeV2ResponseCallback() {
@Override
public void onFailure(ErrorResult errorResult) {
super.onFailure(errorResult)
Session.getCurrentSession().removeCallback(callback);
Session.getCurrentSession().close();
Preference.INSTANCE.clearAccountType()
//๋ก๋ฉ๋ฐ ์ ๊ฑฐ
//์ฌ์ฉ์ ์๋ฆผ ํ ์คํธ
....
}
@Override
public void onSessionClosed(ErrorResult errorResult) {
if (Session.getCurrentSession() != null) {
Session.getCurrentSession().removeCallback(callback);
Session.getCurrentSession().close();
}
}
@Override
public void onSuccess(MeV2Response result) {
//ํ์ํ ์ฌ์ฉ์ ์ ๋ณด ๋ฐ๊ธฐ
String accountId = String.valueOf(result.getId());
....
///์๋ฒ๋ก sns ๋ก๊ทธ์ธ ์์ฒญ
singInBySns(...);
}
});
}
}
์์ ์ฝ๋
์ธ์ ์ฝ๋ฐฑ ๋ถ๋ถ์ด ์ฌ๋ผ์ก๊ณ , ๋จ๋ง์ ์นดํก ์ค์น ์ฌ๋ถ๋ฅผ ํ์ธํด ๋ก๊ทธ์ธ ๋ฐฉ๋ฒ์ด ๊ฐ๋ฆฌ๋๋ก ์์ ๋์๋ค.
์นดํก ๋ก๊ทธ์ธ ํน์ ์นด์นด์ค ๊ณ์ ๋ก๊ทธ์ธ ์งํ์ ๋ฐ๋ฅธ ์ฝ๋ฐฑ ํจ์๋ Function2๋ฅผ ํตํด ๊ตฌํํ๋ค. ์นด์นด์ค sdk api๋ค์ ์ฝํ๋ฆฐ์ผ๋ก ์์ฑ๋์์ง๋ง ์ฑ์ ์ฝ๋๋ ์๋ฐ์ด๊ธฐ์ ์ด๊ฒ์ด ๋์ ์ต์ ์ด์๋ค.
public class LoginFragment extends BaseFragment {
....
//Session Callback ์ญ์
....
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
....
initView();
setSessionLogin();
....
}
private void initView() {
....
binding.btnKakao.setOnClickListener(v ->{
....
//์ธ์
์ฝ๋ฐฑ ๊ด๋ จ ์ฝ๋ ์ ๊ฑฐ
//์นด์นด์ค sdk ์ ๊ณต ๋ฒํผ ํด๋ฆญ ์ ๊ฑฐ
Function2<OAuthToken, Throwable, Unit> callback = (Function2<OAuthToken, Throwable, Unit>) (token, error) -> {
if (error != null) {
//๋ก๊ทธ์ธ ์คํจ
final String loginType = Prefrence.getACCOUNT_TYPE();
if (AccountType.KAKAO.name().equalsIgnoreCase(loginType)) {
Pref.Account.INSTANCE.clearAccountType();
//๋ก๋ฉ๋ฐ ์ ๊ฑฐ
//์ฌ์ฉ์ ์๋ฆผ ํ ์คํธ
....
}
} else if (token != null) {
//๋ก๊ทธ์ธ ์ฑ๊ณต
//๋ก๋ฉ๋ฐ ๋
ธ์ถ
....
String accessToken = token.getAccessToken();
requestMe(accessToken);
}
return null;
};
// ์นด์นด์คํก์ด ์ค์น๋์ด ์์ผ๋ฉด ์นด์นด์คํก์ผ๋ก ๋ก๊ทธ์ธ, ์๋๋ฉด ์นด์นด์ค๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ
if (UserApiClient.getInstance().isKakaoTalkLoginAvailable(requireContext())) {
UserApiClient.getInstance().loginWithKakaoTalk(requireContext(), callback);
} else {
UserApiClient.getInstance().loginWithKakaoAccount(requireContext(), callback);
}
});
....
}
....
private void requestMe(String accessToken) {
//UserManagement ๊ด๋ จ ์ฝ๋ ์ญ์
UserApiClient.getInstance().me((Function2<User, Throwable, Unit>) (user, error) -> {
if (error != null) {
//์ฌ์ฉ์ ์ ๋ณด ์์ฒญ ์คํจ
//๋ก๋ฉ๋ฐ ์ญ์
//์ฌ์ฉ์ ์๋ฆผ ํ ์คํธ ๋
ธ์ถ
....
} else if (user != null) {
//์ฌ์ฉ์ ์ ๋ณด ์์ฒญ ์ฑ๊ณต
//ํ์ํ ์ฌ์ฉ์ ์ ๋ณด ๋ฐ์์ค๊ธฐ
accountId = String.valueOf(user.getId());
com.kakao.sdk.user.model.Account account = user.getKakaoAccount();
if (account != null) {
com.kakao.sdk.user.model.Profile profile = account.getProfile();
if (profile != null) {
profileURL = profile.getProfileImageUrl();
...
}
...
}
//์๋ฒ๋ก sns ๋ก๊ทธ์ธ ์์ฒญ
signInBySNS(....);
}
return null;
});
}
}
์ธ์ ์ด ๋จ์ ์๋ ๊ฒฝ์ฐ ์ฑ ์ง์ ์ ์๋ ๋ก๊ทธ์ธ ์ฝ๋ ์์
์ด ๋ถ๋ถ์ ๋ํด์ ์ค๋ช ํ๊ฑฐ๋ ์์ ๊ฐ ์๋ ๋ธ๋ก๊ทธ๋ค์ ์ฐพ์ง ๋ชปํ๋ค. ์ด๋ ๊ฒ ์งํํ๋ ๊ฒ์ด ๋ง๋ ๊ธด๊ฐ๋ฏผ๊ฐ ํ๋ฉด์ ์์ ํ๋ค. ํ ์คํธํด๋ณด๋ ์ ์๋์ํ๋ค.
๊ธฐ์กด ๋ ๊ฑฐ์ ์ฝ๋
์์งํ ๋งํด์ ๋ณด๊ธฐ ์ข๊ณ ์ ์ด ์ฝ๋๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค.
์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํด์ ๋ก๊ทธ์ธ์ ์๋ํ๋ ๊ฒ๊ณผ, ๋จ์ ์ธ์ ์ด ์ ํจํด์ ๋ฐ๋ก ๋ก๊ทธ์ธ์ ์๋ํ๋ ๊ฒ ๋ชจ๋ session callback์ผ๋ก ์งํ๋๊ณ ์์๋ค.
SessionCallback์ผ๋ก ์ธ์ open์ด ์ฑ๊ณตํ๋ฉด UserManagement๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ MeV2ResponseCallback์ ํธ์ถํด์ ์งํํ๊ณ ์์๋ค.
public class LoginFragment extends BaseFragment {
....
private SessionCallback callback; //KAKAO SESSION
....
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
....
setSessionLogin();
....
}
private void setSessionLogin() {
....
callback = new SessionCallback();
Session.getCurrentSession().addCallback(callback);
....
String loginType = Preference.INSTANCE.getAccountType();
if(AccountType.KAKAO.name().equalsIgnoreCase(loginType)) {
if(Session.getCurrentSession().checkAndImpliciteOpen()) {
// ๋ก๋ฉ๋ฐ ๋
ธ์ถ ์ฝ๋
....
}
} else if(...) {
....
}
....
}
....
private class SessionCallback implements ISessionCallback {
@Override
public void onSessionOpen() {
//๋ก๋ฉ๋ฐ ๋
ธ์ถ ์ฝ๋
....
requestMe(Session.getCurrentSession().getTokenInfo().getAccessToken());
}
@Override
public void onSessionOpenFailed(KakaoExeption exception) {
String loginType = Preference.INSTANCE.getAccountType();
if(AccountType.KAKAO.name().equalsIgnoreCase(loginType)) {
Session.getCurrentSession().removeCallback(callback);
Session.getCurrentSession().close();
Preference.INSTANCE.clearAccountType()
//๋ก๋ฉ๋ฐ ์ ๊ฑฐ
//์ฌ์ฉ์ ์๋ฆผ ํ ์คํธ
....
}
}
}
private void requestMe(String accessToken) {
UserManagement.getInstance().me(new MeV2ResponseCallback() {
@Override
public void onFailure(ErrorResult errorResult) {
super.onFailure(errorResult)
Session.getCurrentSession().removeCallback(callback);
Session.getCurrentSession().close();
Preference.INSTANCE.clearAccountType()
//๋ก๋ฉ๋ฐ ์ ๊ฑฐ
//์ฌ์ฉ์ ์๋ฆผ ํ ์คํธ
....
}
@Override
public void onSessionClosed(ErrorResult errorResult) {
if (Session.getCurrentSession() != null) {
Session.getCurrentSession().removeCallback(callback);
Session.getCurrentSession().close();
}
}
@Override
public void onSuccess(MeV2Response result) {
//ํ์ํ ์ฌ์ฉ์ ์ ๋ณด ๋ฐ๊ธฐ
String accountId = String.valueOf(result.getId());
....
///์๋ฒ๋ก sns ๋ก๊ทธ์ธ ์์ฒญ
singInBySns(...);
}
});
}
}
์์ ์ฝ๋
SessionCallback ํด๋์ค๋ ์ญ์ ๋์๊ณ , requestMe()๋ ๋ฒํผ ํด๋ฆญ์ผ๋ก ๋ก๊ทธ์ธํ ๋์ ์ฑ ์ง์ ํ ์ธ์ ๋ก๊ทธ์ธํ ๋ ๋ ๋ค ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ค.
requestMe(String accessToken)์ ํ๋ผ๋ฏธํฐ๋ก ํ ํฐ๊ฐ์ด ํ์ํ๋ฐ, accessTokenInfo ์ฝ๋ฐฑ ํจ์์ token์ด ์ด๋ฆ๋ง ํ ํฐ์ด๋ผ๊ณ ์ ๊น ์๊ฐํ์ ์ ๋๋ก ์์ธ์ค ํ ํฐ ๊ฐ์ ๋นผ๊ณ ๋ค๋ฅธ ์ ๋ณด๋ค์ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋์ TokenManager๋ก ์ง์ ํ ํฐ๊ฐ์ ๊ฐ์ ธ๋ค๊ฐ requestMe()๋ฅผ ํธ์ถํ๋ค.
public class LoginFragment extends BaseFragment {
....
//Session Callback ์ญ์
....
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
....
setSessionLogin();
....
}
....
private void setSessionLogin() {
....
//์ธ์
์ฝ๋ฐฑ ๊ด๋ จ ์ฝ๋ ์ญ์
....
String loginType = Preference.INSTANCE.getAccountType();
if(AccountType.KAKAO.name().equalsIgnoreCase(loginType)) {
//ํ ํฐ ์กด์ฌ ์ฌ๋ถ ํ์ธ
if(AuthApiClient.getInstance().hasToken()) {
UserApiClient.getInstance().accessTokenInfo((token, error) -> {
if(error == null) {
//ํ ํฐ ์ ํจ์ฑ ์ฒดํฌ ์ฑ๊ณต
// ํ์์ ํ ํฐ ๊ฐฑ์ ๋จ
// ๋ก๋ฉ๋ฐ ๋
ธ์ถ ์ฝ๋
....
OAuthToken token = TokenManager.getInstance().getToken();
if(token != null) {
requestMe(token.getAccessToken());
}
}
return null;
});
}
} else if(...) {
....
}
....
}
....
//์ธ์
์ฝ๋ฐฑ ํด๋์ค ์ญ์
....
private void requestMe(String accessToken) {
//UserManagement ๊ด๋ จ ์ฝ๋ ์ญ์
UserApiClient.getInstance().me((Function2<User, Throwable, Unit>) (user, error) -> {
if (error != null) {
//์ฌ์ฉ์ ์ ๋ณด ์์ฒญ ์คํจ
//๋ก๋ฉ๋ฐ ์ญ์
//์ฌ์ฉ์ ์๋ฆผ ํ ์คํธ ๋
ธ์ถ
....
} else if (user != null) {
//์ฌ์ฉ์ ์ ๋ณด ์์ฒญ ์ฑ๊ณต
//ํ์ํ ์ฌ์ฉ์ ์ ๋ณด ๋ฐ์์ค๊ธฐ
accountId = String.valueOf(user.getId());
com.kakao.sdk.user.model.Account account = user.getKakaoAccount();
if (account != null) {
com.kakao.sdk.user.model.Profile profile = account.getProfile();
if (profile != null) {
profileURL = profile.getProfileImageUrl();
...
}
...
}
//์๋ฒ๋ก sns ๋ก๊ทธ์ธ ์์ฒญ
signInBySNS(....);
}
return null;
});
}
}
๋ก๊ทธ์์ ์ฝ๋ ์์
๊ธฐ์กด ๋ ๊ฑฐ์ ์ฝ๋
์ ์ ๊ฐ๋ฐ์๋ ์ธ์ ์ close ํด์ ๋ก๊ทธ์์์ ์์ผฐ๋ค.
publid void logout() {
if (Session.getCurrentSession() != null) {
Session.getCurrentSession().close()
}
}
์์ ์ฝ๋
์ธ์ ์ ํ์ธํ ์ ์ ๊ฐ๋ฐ์์ ์ฝ๋์ ์๋๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค. (์ด์งํ์ ๋ถ์ด๋ผ ๊ทธ ์๋๋ฅผ ๋ฌผ์ด๋ณผ ์๋ ์๊ณ , ์๋์ ๋น์ทํ๊ฒ ๊ตฌํํ๋ ์ชฝ์ด ์ด๋ค ๊ฒ์ผ๊น ๊ณ ๋ฏผํ๋ค๊ฐ) ํ์ฌ ํ ํฐ์ด ์ ํจํ์ง ์ฒดํฌ ํ ๋ก๊ทธ์์์ ์งํํ๋๋ก ์ฝ๋๋ฅผ ์ฝ์ ํ๋ค. ํ ์คํธํ๋ ์ ๋์๊ฐ๋ค.
publid void logout() {
if (AuthApiClient.getInstance().hasToken()) {
UserApiClient.getInstance().logout(throwable -> null);
}
}
์๋ฃ!!