로그인/프로필 관련 트러블 슈팅

김동연·2025년 6월 17일

개발기록일지(Flutter)

목록 보기
20/32

1. 로그인 계정 전환 시 이전 계정 정보가 유지되는 문제

문제 상황

  • 사용자가 Google 계정으로 로그인 후 앱을 사용하다가 로그아웃하고
  • 이어서 Kakao 계정으로 로그인하면
  • UserProfilePage, MainPage 등에서 여전히 이전 Google 계정의 사용자 정보가 보임.

원인 분석

  • userProfileProvider(userId)는 Riverpod의 StreamProvider.family() 기반으로 동작함.
  • userIdProvider의 값이 변경되더라도 StreamProvider는 캐시된 이전 userId에 대한 stream을 유지함.
  • userIdProvider를 갱신해도, 프로필 데이터는 여전히 이전 계정의 userId로 연결된 stream을 구독하고 있었음.

해결 방법

  • 로그인 함수(signInWithGoogle, signInWithKakao) 내부에서 다음 두 가지 수행:
ref.read(userIdProvider.notifier).state = userModel.userId;  // 현재 로그인한 계정의 userId로 갱신
ref.invalidate(userProfileProvider(userModel.userId));       // 이전 계정에 연결된 프로필 stream을 무효화
  • 이렇게 하면 StreamProvider가 새로운 userId에 대해 다시 fetch하도록 강제됨.

2. Kakao/Apple 로그인 시 로그아웃했는데도 자동 로그인 되는 문제

문제 상황

  • Apple 또는 Kakao 계정으로 로그인한 후 로그아웃하면
  • 앱 재시작 시에도 자동으로 로그인 화면을 건너뛰고
  • 이전 계정으로 자동 로그인되어 있음.

원인 분석

  • Kakao SDK와 Apple Sign-In은 기본적으로 내부적으로 세션이나 인증 상태를 기억함.
  • SharedPreferences에는 loginProvider 값이 남아 있어서 SplashPage에서 자동으로 로그인 로직을 타게 됨.

해결 방법

  • 로그아웃 시에 다음을 수행:

    • Kakao: UserApi.instance.logout() 호출
    • Apple: SignInWithApple.getCredentialState()를 이용한 로그인 상태 확인 + 제거
    • SharedPreferences에서 userId, provider 등을 제거
await prefs.remove('userId');
await prefs.remove('provider');
  • SplashPage 시작 시에는 이 값들이 존재하지 않을 때만 로그인 진입 허용.

3. 시뮬레이터 재시작 시 설정 > 프로필 페이지 진입 불가

문제 상황

  • 앱을 완전히 껐다가 다시 실행하면
  • 설정 페이지에서 ‘프로필’로 이동하려고 해도 "사용자 정보 불러오는 중입니다"만 뜨고 진입 불가.

원인 분석

  • SplashPage에서 userIdProvider가 비어 있는 상태에서 SettingsPage로 넘어감.
  • 이 상태에서 UserProfilePage(userId!)를 호출하니, userId 자체가 null이라 StreamProvider가 동작하지 않음.

해결 방법

  • 앱 시작 시 FutureProvider로 currentUserId 초기화하고, userIdProvider를 업데이트:
final currentUserInitProvider = FutureProvider<void>((ref) async {
  final id = await getCurrentUserId();                    // SharedPreferences에서 불러오기
  ref.read(userIdProvider.notifier).state = id;           // null이 아닌 경우만 state 설정
});
  • 이후 SettingsPage에서는 ref.watch(userIdProvider)를 먼저 확인하고 null이 아닐 때만 프로필 진입 가능하도록 설정.

4. 프로필 수정 후 즉시 반영 안되는 문제

문제 상황

  • 사용자 프로필을 수정했을 때
  • 프로필 페이지에는 여전히 이전 정보가 표시되고
  • 앱을 재시작해야 반영됨.

원인 분석

  • 프로필 수정 후 Navigator.pop()만 호출하고 있어서, 이전 userProfileProvider(userId) stream이 그대로 유지되고 있었음.

해결 방법

  • 수정 완료 시 Navigator.pop(context, true)로 수정 여부를 boolean으로 전달하고,
  • UserProfilePage에서는 다음처럼 invalidate 수행:
final changed = await Navigator.push<bool>(
  context,
  MaterialPageRoute(builder: (_) => UserProfileEditPage(user: user)),
);

if (changed == true) {
  ref.invalidate(userProfileProvider(userId));  // StreamProvider 강제 리로딩
}

5. SplashPage 분기 로직 작동 안함 (로그인/홈 이동 실패)

문제 상황

  • 앱 시작 시 자동 로그인 여부에 따라 MainPageLoginPage로 가야 하는데,
  • userIdProvider 상태 초기화가 되지 않아 항상 LoginPage로 감.

원인 분석

  • 앱 시작 시 getCurrentUserId() 호출 타이밍이 늦거나 결과가 반영되지 않음.
  • userIdProvider가 null로 유지되기 때문에 이후 페이지에서 항상 로그인 상태가 아님으로 인식.

해결 방법

  • SplashPage에서 ref.watch(currentUserInitProvider)의 상태를 먼저 확인한 뒤, 완료되었을 때만 다음으로 진입:
final currentUserInit = ref.watch(currentUserInitProvider);
return currentUserInit.when(
  loading: () => SplashWidget(),
  error: (_, __) => ErrorPage(),
  data: (_) {
    final userId = ref.watch(userIdProvider);
    return userId != null ? MainPage() : LoginPage();
  },
);
  • 이렇게 하면 Splash 화면에서 SharedPreferences 기반의 로그인 세션이 반영될 때까지 기다리고, 그에 따라 분기 가능.

0개의 댓글