개발을 하다보니 자동로그인 기능을 구현해보고 싶었다.
이전에 카카오 로그인을 했던 상태이고, 로그인을 하면서 받았던 토큰이 아직까지 유효한 상태라면 다시 앱을 켰을 때 로그인 페이지가 아닌 바로 메인 페이지에 넘어가게끔 하고 싶었다.
일단 자동로그인을 구현하기 위해서 내가 구성한 로직은 다음과 같다.
로그인 할 때 refreshToken받아오고, 그 토큰을 로컬 저장소에 저장하는 sharedPreference구현.....(1)
Splash액티비티에서 refreshToken을 요청하고 새 refreshToken과 accessToken을 응답으로 받아오는 코드 구현 -> 여기서 요청하는데 사용한 refreshToken이 유효하지 않은 값(유효기간 지났거나, 아예 틀린 토큰이거나)이라고 응답이 오면 카카오 로그인 화면으로 / 유효한 값이어서 새 refreshToken과 accessToken이 응답으로 오면 sharedPreference를 이용해 로컬 저장소에 저장하고 메인 화면으로 이동.....(2)
accessToken과 refreshToken저장하는 코드(LoginActivity.kt)
SharedPreference부분(save...부분은 저장하는 코드 get...부분은 가져오는 코드)
(2)번 로직 부분(SplashActivity.kt)
처음에는 iswork변수를 전역변수(default값은 false)로 선언한뒤에 renewalAccessToken메소드안에 응답이 성공적이면 iswork변수를 true로, 응답에 실패하면 iswork변수를 false로 두어서 renewalAccessToken을 실행시킨 뒤에 iswork변수가 true이면 메인화면으로 false이면 로그인화면으로 넘어가게 하였다.
그런데 이전에 로그인을 시도를 했음에도 불구하고 계속해서 로그인화면으로 넘어가는 것이었다.
혹시 몰라서 로그를 찍어보니 renewalAccessToken에서 서버로부터 응답을 받아오기도전에 iswork변수가 true인지 false인지 판별하는 로직으로 바로 넘어가서 이전에 로그인을 했든 안했든 로그인페이지로 넘어가는 현상이 발생한 것이었다.
아마 서버로부터 응답을 받아오는 로직이 비동기방식이어서 그런 것 같았다.
그래서 위와 같이 iswork변수를 빼고 바로 renewalAccessToken에서 응답이 성공적이면 메인화면으로 실패하면 로그인화면으로 넘어가게 구현했더니 정상적으로 구현이 됨을 확인할 수 있었다.
비동기 방식인게 은근 어려운 것 같다 이전에 배운 코딩은 순차적으로 실행되어서 실행결과가 어떻게 될지 예상이 갔었는데 비동기 방식은 그렇지가 않아서 내가 원하는 순서대로 구현하기가 까다롭다.