# 임시 저장

 

let transition = CATransition()
transition.duration = 0.25
transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
transition.type = CATransitionType.push
transition.subtype = CATransitionSubtype.fromRight
self.view.window!.layer.add(transition, forKey: nil)
self.dismiss(animated: false, completion: nil)

2020 Summer 네이버 핵데이에 지원하였다. 대학 단톡방에서 소식을 듣고 지원 사이트를 들어가보니, 제출 가능 시간이 몇시간 안남아서 뭐라썼는지 기억도 안난다...

연합 동아리에서 진행한 프로젝트(이 프로젝트에서 다행히 안드로이드 새로운 스택들을 사용해서 다행인....)를 적고

교내에서 산학프로젝트로 진행한 프로젝트 2가지를 글자수에 맞춰 작성했다.

기억으로는 4문항? 3문항이 있었는데... 1개 문항에는 '위 a번 문항과 같습니다' 라고 적었다. (거짓말 1도 안치고 저렇게 적었다...)

 

후의 대망의 온라인 코딩테스트 날에 너무 긴장되어 머리가 안 돌아갔다.. 3문제에 2시간, 1,2번 문항은 합쳐서 20분만에 풀 정도로 쉬웠다. 백준 사이트의 브5~실4 정도? 마지막 3번 문제를 푸는데, 1시간이 넘게 어떤 알고리즘을 써야할지 생각이 나지 않았다... 작성하다가 시간초과가 날 것 같아 지우고, 작성하다가 아닌 것 같아 지우고...

그렇게 남은 시간이 18분 남았을 때, 생각해보니 'N의 크기가 작으니 3차원 배열로 dfs를 돌리면 되지 않을까?' 생각이 들어, '어차피 시간도 없으니 틀려도 풀자'하고 타자를 쳤다.. (한창 군대에서 한컴타자연습으로 '동백꽃 필 무렵' 칠 때보다 타속이 빨랐을 거다... 시간이 얼마 안남았으니... )

그렇게 맞았는지 틀렸는지 확인도 못하고 주어진 TC만 확인된 것을 확인하고 제출했다.

 

쨔쟌... 왜 됐는지는 모르겠지만... 돼서 좋다(아마 자소서보다는 급하게 제출한 3번 문제가 맞았던 것 같다...)

 

며칠 후 깃헙 레포 초대 메일이 도착했고, 간단한 온라인 소개 후 팀을 구성해 진행중이다...

 

아직 개발은 시작하지도 않았지만... 아직 많이 부족하다는 것을 느낀다... 특히 아키텍처와 라이브러리, 스택들에 대한 지식이...

 

(또한... 얼마 전 SW마에스트로 최종 면접을 굉장하디 굉장하게 망치고와서 신경쓰여서 다른일이 잡히지 않아 포스팅한다... 합격소식이 들렸으면 좋겠다~)

 

 

'네이버 핵데이' 카테고리의 다른 글

핵데이 1년이 지나서야 후기...  (0) 2021.05.25

이전에는 서버를 사용하여 KakaoLogin을 사용했는데, 고학년이 되고 Kakao Developer를 다시 찾아보니 Client만을 사용해서도 사용하는 방법이 있었습니다. 오늘은 그것의 사용법에 대해 정리해보겠습니다.

 

자세한 내용은 https://developers.kakao.com/ 이곳을 찾아보시면 알 수 있을 것입니다.

 


Project단위 Gradle에 다음과 같이 삽입합니다.

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }
        
    }
}

 

그리고나서, App단위 Gradle의 Dependency에 다음을 삽입해줍니다.

// 카카오 로그인
    implementation group: 'com.kakao.sdk', name: 'usermgmt', version: '1.27.0'

 

마지막으로, Manifest에 삽입해줍니다.

<application>

    ...

    <meta-data
        android:name="com.kakao.sdk.AppKey"
        android:value="{NATIVE_APP_KEY}" /> //네이티브 앱 키 설정
</application>

 

여기서의 NATIVE_APP_KEY는 https://developers.kakao.com/ 이곳에서 내 애플리케이션을 생성해야 받을 수 있습니다.

 

이제 KakaoLoginSDK를 사용하기 위한 Class를 만들어보겠습니다.

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
        }
    }
}

이 Adapter를 객체로 생성하여 init을 해주어야합니다.

 KakaoSDK.init(KakaoSDKAdapter())

 

 

로그인 세션(Session)을 생성할 때 필요한 옵션을 얻는 추상 클래스(abstract class)인 ISessionConfig를 구현합니다. 카카오 로그인 설정을 담은 ISessionConfigKakaoAdapter에 기본 설정되어 있으며, 설정 변경이 필요할 때 상속해서 사용합니다.(출처 : https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android-v1#import)

 

이처럼 로그인 세션을 생성할 때 필요한 ISessionConfig를 상속받는 Class를 만들어봅시다.

onSuccess 메소드를 통해 로그인한 유저의 Kakao 정보를 받아 사용하실 수 있습니다.

package com.example.mnt_android.service.repository

import android.app.Application
import android.util.Log
import com.example.mnt_android.service.model.KakaoUser
import com.example.mnt_android.view.ui.LoginActivity
import com.kakao.auth.ApiResponseCallback
import com.kakao.auth.AuthService
import com.kakao.auth.ISessionCallback
import com.kakao.auth.Session
import com.kakao.auth.network.response.AccessTokenInfoResponse
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

class SessionCallback(application : Application) : ISessionCallback {

    val TAG = "SessionCallback"



    override fun onSessionOpenFailed(exception: KakaoException?) {

    }

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


            override fun onFailure(errorResult: ErrorResult?) {
                Log.e(TAG,"Fail")
            }

            override fun onSessionClosed(errorResult: ErrorResult?) {
                Log.d(TAG,"closed")
            }

            override fun onSuccess(result: MeV2Response?) {

				Log.d(TAG,"Success")

            }

        })


    }




}

 

 

가장 중요한 단계입니다. 이렇게 준비해놓고 로그인 버튼을 눌렀는데 로그인이 안된다구요?

 

카카오 디벨로퍼 사이트 내의 '플랫폼' 메뉴가 있습니다. 클릭하셔서 들어가시면 Android/iOS/Web 으로 나뉩니다.

저희는 Android 개발자이므로 Android 항목을 봅시다.

패키지명, 마켓URL, 키 해시를 적을 수 있습니다. 

패키지명은 자신의 프로젝트의 패키지명을 적습니다, ex) com.xxx.xxx

키 해시가 중요합니다. 런칭을 하지 않은 App들은 키 해시가 등록되어있어야지만 로그인이 가능합니다.

키 해시 값은 XXXXXXX= 로 되어있으며 도출된 값을 복붙하여 추가해주시면 됩니다.

키 해시값을 얻을 수 있는 Java코드입니다. Kotlin을 사용하시는 개발자 분들은 Kotlin으로 변경하셔서 사용하면 되겠습니다.

 

public static String getKeyHash(final Context context) {
    PackageInfo packageInfo = getPackageInfo(context, PackageManager.GET_SIGNATURES);
    if (packageInfo == null)
        return null;

    for (Signature signature : packageInfo.signatures) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            return Base64.encodeToString(md.digest(), Base64.NO_WRAP);
        } catch (NoSuchAlgorithmException e) {
            Log.w(TAG, "Unable to get MessageDigest. signature=" + signature, e);
        }
    }
    return null;
}

 

 

이렇게 모든 준비가 끝났습니다.

 

- - -

 

SDK가 제공해주는 KakaoLogin 버튼을 사용하면 간단히 로그인 할 수 있습니다.

저는 디자이너 분들과 함께 작업을 했기 때문에 커스텀 버튼을 사용해야했기에... Custom Button에 DataBinding을 통해 onclick 함수를 적어주었습니다.

(Data Binding 에 대해 정리한 내용 : https://wlgusdn700.tistory.com/9)

(Data Binding 을 사용해본 예제 : https://wlgusdn700.tistory.com/13)

android:onClick="@{()->loginActivity.login()}"

 

login() 메소드에서는

ISessionCallback 객체를 생성하고, 그 객체의 파라미터로 application Context를 넘겨줍니다.

그리고 Session을 통해 로그인 방법 등을 설정하실 수 있습니다.

저의 코드는 이렇습니다.

fun login()
    {
        //눌러서 로그인
       val callback = SessionCallback(application)
        Session.getCurrentSession().addCallback(callback)
        Session.getCurrentSession().checkAndImplicitOpen()
        Session.getCurrentSession().open(AuthType.KAKAO_LOGIN_ALL,this@LoginActivity)
        loginViewModel.kuser = callback.user
    }

 

이 단계들을 모두 적용하여 따라하면 KakaoLogin을 이용하실 수 있습니다.

 

Response Body에

...

"data" : [

...

"asd": "asd"

...]

...

 

형식으로 있을 때 Flowable<List<Object>> 형식으로 받아오려했지만 에러가 나서 찾아본 후

Json 반환 명이 다르다는 것을 알았고 해결을 위해

새로운 List<Object>를 담는 class를 하나 더 생성했다.

 

ex)

class CheckRoomList(
    @SerializedName("data")
    val checkRoomList : List<CheckRoom>
)

이렇게 생성한 후 Flowable<CheckRoomList> 로만 선언해주면 에러없이 동작하게 된다.

 

객체를 받아올때 

endDay로 Response가 온다면

내가 생성한 객체의 변수도 endDay여야 한다.

endDate로 했다가 안 들어왔다.

 

 

+ Recent posts