[TIL] Android 앱 개발 최종 : 포트폴리오 프로젝트 7

지혜·2024년 3월 5일

Android_TIL

목록 보기
61/70

✏240305 화요일 TIL(Today I learned)

📖데이터베이스에 회원 등록

  • [트러블슈팅] 회원 등록에 앞서서,, 파이어스토어 데이터베이스에 유저정보를 저장하기 위해서 로그인 할 수 있도록 카카오 간편로그인 API를 통해 로그인을 진행하는데, 동의서에 체크를 하고 계속하기를 누르면 '로그인 성공'이 아닌 '기타 에러'가 등장하는 문제가 있었다.
    => 처음에는 로그캣을 확인해서 직접적인 원인을 조회하여 고쳐야한다고 하는 글을 보았다. 로그캣을 확인해 보았더니 java.io.IOException: Failed to load asset path오류가 나와서 이것 때문인 줄 알고 열심히 구글링을 했는데, 도저히 해결되는 현상이 없어서 다른 팀원 분들께도 로그인 절차 진행을 부탁드려보니 로그인을 직접 연결 구현하신 팀원분을 제외하고 모두가 기타에러 오류가 생성되는 것을 확인했다.
    => 카카오 API 간편 로그인 기타에러에 대해 좀 더 구글링을 해보니 키해시 문제가 가장 많이 등장하고 있었다. 이때, 나는 키해시 등록 절차를 해본적이 없기 때문에 로그인 연결하신 팀원분께 물어보니 키해시 등록절차를 알려주셨다.

    //메인액티비티
    import com.kakao.sdk.common.util.Utility
    
    override fun onCreate(savedInstanceState: Bundle?) {
    	val keyHash = Utility.getKeyHash(this) 
       Log.d("Hash", keyHash)
    }
    • 카카오 Utility를 임포트해서 로그를찍어서 얻은 keyHash값을 전달해드렸더니 키해시 등록을 해주셨고, 그 이후로는 정상적으로 로그인이 된다!

      +키해시의 경우는 앱이 악용이 되는 것을 방지하기 위해 정상적인 절차를 걸쳐서 진행된 어플인지 확인용이기 때문에, 개발자들은 디버그용 키해시를 일일이 등록해야하지만, 릴리즈키해시의 경우는 앱을 등록하는 스토어의 인증서 키해시를 등록하면 되므로 일반사용자들의 키해시 등록 문제에 대해서 걱정할 필요는 없다!

  • 카카오 로그인 callback 절차 속에서 로그인이 성공했을 때, 즉 token이 존재했을 때 UserApiClient.instance.me { user, error -> }를 활용하여 userId를 문서의키값으로 등록하고, 기본적인 이름, 프로필이미지, 유저이메일을 hashMap으로 담아서 파이어스토어에 등록했다.

    UserApiClient.instance.me { user, _ ->
          val userModel = hashMapOf(
             "nickName" to "${user?.kakaoAccount?.profile?.nickname}",
             "profileImage" to "${user?.kakaoAccount?.profile?.profileImageUrl}",
             "userEmail" to "${user?.kakaoAccount?.email}",
             "bookmarked" to "null",
             "writing" to null
          )
          Firebase.firestore.collection("users").document("Kakao${user?.id}").set(userModel)

    => 여기서 UUID로 사용하는 "Kakao${user?.id}"는 ID 정보는 이메일 정보와 다르게 변경이 어렵고 또, 예민한 개인정보가 아니기 때문에 카카오 측에서도 키값으로 ID사용을 권장하고 있다. 거기에 카카오로그인, 구글로그인, 네이버로그인 등 다양한 소셜로그인을 사용하고있다면, 그 타입과+(social)ID를 활용하면 중복될 일 없는 고유한 식별키로 활용이 가능하다고 한다. 그래서 로그인타입+제공되는socialID를 활용하여 만들었다.


📖로그인 세선 유지를 통한 로그인정보 조회

  • 프로필 화면에서는 비로그인/로그인 화면의 차이가 존재하므로, 그 차이를 구분하는데에 자동로그인으로 유지되는 토큰을 활용하기로 했다. 마찬가지로 카카오에서 제공하는 UserApiClient를 사용하고, 거기서 userID가 존재하면 로그인 화면, 존재하지 않으면 로그아웃 화면이 나오도록 했다.

    fun checkLogin() {
           UserApiClient.instance.me { user, error ->
               if (user?.id != null) {
                   initLogin()
               } else initLogout()
           }
       }
    • [트러블슈팅] 로그인 체크는 비로그인/로그인을 판별하기 위한 중요한 부분이고, 로그인을 할 수 있는 곳은 꼭 프로필 페이지에만 존재하는 것이 아니기 때문에 화면이 onStart()될 때마다 새로 판별하도록 만들어두었다.

      <=처음에는 프로그램 전체적으로 로그인 중인지 아닌지 조회할 수 있게 메인 액티비티에 따로 코드를 만들자는 의견이 있었지만, 그렇게 하지 않은 이유는 어짜피 UserApiClient 자체로 판별하는 방법이 그 역할을 한다고 생각했기 때문이다. 그래서 실제로 위의 코드 처럼 구현하고, onCreateView()에 코드를 걸어놨는데! 처음에 들어갔을 때에만 화면이 반응을 하고, 다른 화면을 돌아 다니다가 프로필화면으로 들어가면, 처음의 화면이 고정된 상태로 로그인/비로그인에 대한 새로운 상태를 인식하지 않았다. 하지만 직전의 프로젝트 때에도 같은 문제를 경험한 기억이 떠올라서 금방 화면이 갱신될 때마다 코드를 불러오는 onStart()에 코드를 걸었는데, onStart가. 화면의 생명주기가 전혀 먹히질 않았다.

      =>원인은 뷰페이저에 있었다. 커스텀된 바텀네비게이션라이브러리를 쓰면서, 화면 애니메이션이 부드러울 수 있도록 뷰페이저의 offscreenPageLimit을 팀장님이 4로 걸어놓으셨는데, 이 offscreenPageLimit이란게 기준 화면을 중심으로 좌우 페이지들을 설정한 개수만큼 함께 로드하는 함수로, 페이지가 캐싱되는 문제가 발생하여 페이지 갱신이 되지 않았던 것이다.

      => 근데 사실 이걸 주석 처리하니까 다시 원래대로 페이지 갱신이 시작되긴 했는데, 어쨌든 공용으로 사용하는 코드이기도 하고 팀장님이 라이브러리 사용에 필요한 요소라서 제거하게되면 커스텀바텀네비게이션을 쓰는 이유가 사라질 것 같다는 의견을 주셨다. 그래서 다른 프래그먼트에서는 onResume onPause등이 되는 것을 바탕으로 다시 조사를 해보니, 안드로이드스튜디오에서 사용하던 버츄얼 에뮬레이터가 복잡해진 코드와 메모리를 감당하지 못하고 정상 작동하지 못하고 있다는 사실을 알게 되었다. 바로 에뮬레이터를 실기기로 옮기고 onStart에 함수롤 거니까 잘 작동하는 것을 확인했다.

  • [트러블슈팅] 이외에도, 유저 정보를 가져올 때 유저데이터에 자꾸 null 값이 돌아와서 왜 그런지 찾아보니까 Kakao로 써놓고 조회를 kakao로 하는 휴먼에러가 있었다. 상수값을 설정해서 사용해야하는데, 일단 공동으로 관리하는 상수클래스가 없어서 깡으로 써놨더니 이꼴이 났다. 상수 페이지 생성에 대해 제안해 봐야겠다.

  • [트러블슈팅] 데이터베이스에 값이 없는데, 카카오토큰이 유지될 때를 고의적으로 만들어봤는데, 이미지를 불러올 때 Uri.parse(it.getString("profileImage"))에 대해서 nullPointException 오류로 강제종료 당했다. 데이터베이스 값을 인위적으로 삭제하지 않으면 발생하지 않을 일이긴 하지만, 강제종료는 안되니까 오류코드부터 확인해보았다.
    =>결론은 uriString이 null인 상태에서 Uri.parse()를 호출하려고 한게 문제였다고 해서 if(it.getString("profileImage") != null)으로 잘 바꿔주었다.

profile
파이팅!

0개의 댓글