🎯 문제 상황: 캐릭터 선택 및 렌더링 이슈
📌 문제 요약
- 로그인 후 캐릭터 선택 과정에서 지속적인 렌더링 및 라우팅 문제 발생
- Zustand와 localStorage의 데이터 불일치
- 무한 루프와 예상치 못한 페이지 이동 문제
🕵️ 근본 원인 분석
- Zustand 스토어의 과거 데이터 문제
- 이전에 선택된 캐릭터 ID (836)가 더 이상 유효하지 않음
- 로그아웃 후 새 아이디로 접속 시 localStorage와 Zustand 값 불일치
- 유효성 검사 로직의 취약점
useEffectiveId 훅의 잘못된 유효성 검사 로직
- 서버 데이터와 로컬 데이터 간 동기화 문제
🛠 해결 방법
1. Zustand 초기화
// 개발자 콘솔에서 실행
useMyCharStore.persist.clearStorage()
localStorage.clear()
2. 유효성 검사 로직 개선
const useEffectiveId = (characterId: number) => {
const { data } = useCharList();
const [hasValidSelection, setHasValidSelection] = useState(false);
const [effectiveId, setEffectiveId] = useState<number | null>(null);
useEffect(() => {
if (characterId && data) {
// 실제 존재 여부 확인
const result = data.characters.find(
(item) => item.userCharacterId === characterId
);
// 개선된 유효성 검사
const valid = Boolean(characterId && result);
setHasValidSelection(valid);
if (valid) {
setEffectiveId(characterId);
} else {
setEffectiveId(null);
}
}
}, [characterId, data]);
return { hasValidSelection, effectiveId };
};
3. 지연 로직 추가
useEffect(() => {
if (characterId && characterId > 0) {
// 약간의 지연을 주어 상태 업데이트 시간 확보
const timer = setTimeout(() => {
nav('/');
}, 300);
return () => clearTimeout(timer);
}
}, [characterId, nav]);
🌟 핵심 개선 포인트
- Zustand 스토어의 데이터 일관성 유지
- 더 robust한 유효성 검사 로직
- 상태 업데이트를 위한 최소한의 지연 시간 추가
- 사용자 경험을 고려한 에러 핸들링