프로필 수정 기능 및 로그인 관련 이슈

김동연·2025년 6월 4일

개발기록일지(Flutter)

목록 보기
16/32

이번 Flutter Firebase 구글, 카카오 로그인 시스템 개선 과정에서 발생했던 핵심 문제들, 그에 대한 구체적인 원인과 해결, 그리고 최종 구조의 장점까지 포괄적으로 정리한 트러블슈팅 리포트입니다. 각 이슈는 서로 얽혀 있었기 때문에 문제 흐름 중심으로 서술합니다.


1. 문제: 계정 전환 후에도 이전 계정 정보가 유지됨 (심각한 정보 덮어쓰기 오류)

원인

  • 최초 구조에서는 LoginPage → MainPage(user) → SettingsPage(user) 식으로 UserModel을 전체 페이지에 직접 전달
  • 이 구조에서는 앱 시작 시 최초 로그인된 사용자 정보가 모든 페이지에 캐시된 채 유지
  • 사용자가 Google → Kakao 또는 그 반대로 계정 전환 시, 이전 계정의 UserModel이 여전히 남아 있어 프로필 수정 시 다른 계정 정보로 덮어씌워지는 심각한 문제 발생

해결

  • 전체 사용자 흐름을 UserModel 전달 방식 → userIdProvider 중심 참조 방식으로 전환
  • 로그인 성공 시점에서 userIdProvider의 상태를 갱신 (ref.read(userIdProvider.notifier).state = userId)
  • 각 페이지에서는 ref.watch(userIdProvider)를 통해 항상 현재 로그인된 계정 ID만 참조
  • UserModelFirestore의 해당 userId 문서를 StreamProvider로 구독하여 실시간으로 사용

2. 문제: 사용자 정보가 실시간 반영되지 않음 (수정 후 반영 안 됨)

원인

  • userProfileProvider가 이전에는 AsyncNotifierProviderFamily 기반이어서, 한 번 불러오면 갱신되지 않음
  • 수정 후 refresh()를 명시적으로 호출하지 않는 한, 프로필 페이지에 이전 상태 그대로 유지

해결

  • userProfileProviderStreamProvider.family<UserModel?, String> 구조로 완전히 재작성
  • Firestore의 .doc(userId).snapshots()를 통해 해당 문서의 실시간 변화를 감지하여 반영
  • UserProfilePage, SettingsPage 등은 ref.watch(userProfileProvider(userId))를 사용

결과

  • 사용자 정보 수정 시 2~3초 내에 자동으로 UI 반영
  • 수동 리프레시나 페이지 재진입 없이도 실시간 UI 동기화 가능

3. 문제: 페이지 간 user 전달 구조가 복잡하고 오류 유발

원인

  • 초기에는 UserModel user를 로그인 후부터 모든 페이지에 명시적으로 전달
  • 계정 전환 시 user 객체가 최신 상태로 갱신되지 않아서 정보 불일치 발생
  • 페이지 수가 늘어날수록 전달 구조 유지가 불가능해지고, 유지보수도 어려워짐

해결

  • UserModel 전달을 완전히 제거
  • 앱 어디서든 ref.watch(userIdProvider)userProfileProvider(userId)를 통해 동적 접근
  • MainPage, SettingsPage, UserProfilePage 모두 전달인자 없이 구성됨

장점

  • 계정 전환, 사용자 정보 갱신, 로그아웃 등 상태 변경에 유연하게 대응 가능
  • 구조가 단순해지고, 기능 단위 테스트나 재사용성이 크게 향상됨

4. 문제: 로그아웃 후에도 자동 로그인 알림창이 계속 뜸

원인

  • 카카오 SDK의 자동 로그인 알림은 loginWithKakaoAccount() 또는 loginWithKakaoTalk() 호출 시 항상 발생
  • 로그아웃 이후에도 SDK 내부에 세션이 남아있어서 앱 실행 시 자동 로그인 흐름이 반복됨
  • 이는 Flutter 앱 입장에서 제어 불가능한 SDK의 내부 동작이었음

해결

  • 자동 로그인 흐름을 전면 제거
  • 앱 시작 시 getCurrentUserId() 값을 체크하여, 없으면 무조건 로그인 페이지로 이동
  • SharedPreferences에 저장된 로그인 정보도 로그아웃 시 clearLoginInfo()로 완전 삭제

결과

  • 로그아웃 후 자동 로그인 알림이 더 이상 표시되지 않음
  • 사용자가 원하는 시점에만 명시적으로 로그인하게 유도 가능

5. 문제: 로그인 시 항상 새 계정으로 Firestore 덮어쓰기

원인

  • 로그인 시마다 Firestore에 set(newUser.toJson(), merge: true)로 저장
  • 계정 전환 후 수정 시, 이전 계정의 정보가 새 계정 문서를 덮어쓰는 문제 발생
  • 실질적으로는 로그인된 계정과 Firestore 내 사용자 정보가 일치하지 않음

해결

  • 로그인 성공 시점에서 userIdProvider 상태를 설정하고, 그 ID에 해당하는 문서만 생성 또는 불러오기
  • if (!userDoc.exists) 조건 하에서만 새 문서를 생성
  • 이후에는 수정이나 덮어쓰기 없이 읽기 전용으로 유지

구조 변화의 총 정리

항목이전 방식개선된 방식
사용자 정보 전달UserModel user를 매 페이지에 전달전역 userIdProvider, userProfileProvider로 전환
프로필 동기화AsyncProvider + 수동 refresh 필요StreamProvider 기반 실시간 반영
계정 전환이전 정보가 남아 정보 덮어쓰기 발생userIdProvider 상태로 강제 동기화
로그아웃 후 자동 로그인알림창 계속 뜸자동 로그인 제거 + SharedPrefs 정리
설정 페이지 구조user 전달 필요userIdProvider 참조로 통일

최종 결과

  • 계정 전환 시 완전한 사용자 정보 초기화 및 동기화 성공
  • 프로필 정보 실시간 반영
  • 로그아웃 시 자동 로그인 알림 제거
  • 전역적으로 일관된 구조로 사용자 상태 추적 가능
  • 코드 구조가 깔끔하고 기능 확장, 유지보수에 최적화된 상태로 리팩토링 완료

0개의 댓글