해결된 질문
작성
·
558
0
go_router 7.0.1 버전을 사용하여 강의를 진행 중에 있습니다.
RefreshToken과 AccessToken은 Storage에서 지워진 상태입니다.
해당 상태에서 두개의 토큰이 null로 확인되면 dio.dart에서 dioError를 호출하고 reject하는 부분까지는 확인을 했습니다.
그런데 여기서 SplashScreen으로 이동을 하지 않고 Home화면에서 데이터를 가져오지못했다는 메시지만 띄웁니다.
로그 화면에도 보면 프로그램 실행 시 /restaurant을 호출하게 되는데 제가 코드에서 처리를 잘 못한건지 잘 모르겠습니다.
제가 생각하기에는 /restaurant가 호출되기 전에 /user/me가 먼저 호출 되어, 토큰 값을 체크하고 그 다음에 토큰 값의 유무에 따라 화면이 전환이 되어야 된다고 생각이 드는데 제가 잘못 이해하고 있는가요?
코드는 git에 올려두었습니다.
https://github.com/bluelf1004/study.git
답변 1
1
안녕하세요!
코드 확인 해봤습니다.
현재 강의를 멈춘 위치에서 다양한 문제가 있을 수 있지만
가장 크게는 refreshListenable을 아직 등록하지 않은 시점이라는 것입니다.
refreshListenable의 경우 특정 상태값이 변경될때 redirect를 재실행 하도록 할 수 있습니다.
refreshListenable을 등록하는 시점까지 오시면 에러 발생시 userProvider의 logOut() 함수를 실행하고 authProvider에서 이 부분을 listen 하고 notifyListeners()를 실행하고 있기 때문에 redirect를 재실행 하게됩니다. 그럼 자동으로 로그아웃 후 다시 로그인 스크린으로 이동됩니다.
말씀하신 사용자 정보를 먼저 체크하는것도 결과만 봤을땐 가능한 방법입니다. 하지만 모든 API 요청에 사용자 정보 확인이라는 디펜던시가 포함되며 이는 불필요한 네트워크 요청을 매번 추가로 보내게 되기 때문에 상당한 낭비라고 말씀 드릴 수 있습니다.
가장 좋은 방법은 필요한 요청만 보내고 해당 요청에서 에러가 날 경우 토큰을 폐기하고 로그인으로 이동시키는겁니다. 여기서 조금 더 상세하게 간다면 401에러에만 로그아웃을 진행 할 수도 있습니다.
설명이 부족한 부분이 있다면 댓글 부탁드립니다.
감사합니다!
해당 부분 수정으로 인하여 해결 되었습니다.
그리고 추가적으로 말씀해주신 내용도 이해가 잘 되게 설명해주셔서 감사합니다.