로그인 후 새로고침시 유저정보 없음 오류/ zustand persist

Ji Won·2024년 1월 28일
0

TODAY I LEARNED

목록 보기
17/20
post-thumbnail

프로젝트에서 로그인/회원가입을 구현하고 있는 중에 마이페이지에서 새로고침하면 날라가는 오류가 발생함.

기존에는 onAuthStateChange를 Header에 넣어놓고 랜더링이 될 때마다 zustand에 넣어주는 식으로 로직을 구성했었다.
그래서 크게 문제가 없을거라고 안일하게 생각했었다ㅠ

// Header.tsx

const setUser = useAuth((state) => state.setUser);

  useEffect(() => {
    supabase.auth.onAuthStateChange((event, session) => {
      if (session) {
        setUser(session.user);
      } else {
        setUser(null);
      }

    });
  }, []);

//zustand

export type AuthStore = {
  user: User | null;
  setUser: (user: User | null) => void;
};

const useAuth = create<AuthStore>(
    (set) => ({
      isAuthInitialized: false,
      user: null,
      setUser: (user) => set(() => ({ user })),
      setIsAuthInitialized: (isAuthInitialized) => set(() => ({ isAuthInitialized }))
    }),

);

이렇게 작성할 경우 매번 랜더링이 될 때마다 유저정보가 들어가지만 새로고침시 유저정보가 날라가고 다시 들어오는 그 사이의 텀이 생기기 때문에 유저정보가 없을시에는 접근이 불가능하게 해놓은 마이페이지에서는 튕기는 것이었다.

어떻게 할지 고민하다가 zustand의 persist를 사용하기로 했다.
persist를 사용시 로컬스토리지에 정보를 저장할 수 있으며 저장된 정보를 기본값으로 가지고 있는다고 한다.

import { User } from '@supabase/supabase-js';
import { create } from 'zustand';
import { createJSONStorage, persist } from 'zustand/middleware';

export type AuthStore = { 
  user: User | null;
  setUser: (user: User | null) => void;
};

const useAuth = create<AuthStore>()(
  persist(
    (set) => ({
      user: null,
      setUser: (user) => set(() => ({ user })),
    }),
    {
      name: 'user-store',
      storage: createJSONStorage(() => localStorage)
    }
  )
);

위와 같이 원래의 로직을 persist로 감싸고 createJSONtorage를 사용해서 로컬스토리지에 'user-store'이라는 이름으로 유저정보를 저장했다.

profile
1인분 하고 싶은 코린이

0개의 댓글