본문 바로가기

공부/트러블 슈팅

[트러블 슈팅] issue daily - 로그인 상태 새로고침 시 유지하기

반응형

 

로그인 상태 새로고침 시 유지하기를 `Supabase Auth`와 `Zustand`로 해결한 트러블 슈팅에 대해서 정리해 봤습니다.

발생한 오류 🔥

사용자가 로그인 후 마이페이지와 로그아웃 버튼이 정상적으로 보이지만, 페이지를 새로고침 하면 다시 로그인 버튼이 나타나는 문제가 있었습니다.

 

즉, 사용자의 로그인 상태가 새로고침 후에도 유지되지 않는 문제가 생겼습니다.

 

해결 과정 🔎

문제 분석

 

새로고침 시 클라이언트 측에서 전역 상태가 초기화 돼 상태가 유지되지 않는 것을 발견했습니다.

 

Supabase의 `auth.getUser()`를 사용해 서버 측에서 유저 정보를 가져올 수 있다는 점을 고려해 이 정보를 전역 상태로 관리해 새로고침 후에도 상태가 유지되도록 해야 했습니다.

 

Supabase와 Zustand 연동

 

Supabase와 `auth.getUser()`메서드를 이용해 Layout 파일에서 사용자 로그인 여부를 판별 후 `UserStoreProvider`로 전달해 로그인 상태를 전역적으로 관리되도록 설정했습니다

 

해결 방법 ✨

Supabase에서 유저 정보 받아오기

 

Layout.tsx에서 `auth.getUser()`를 호출해 유저 정보를 받아와 `UserStoreProvider`에 `isUser`속성으로 값을 넘겨줍니다.

export default async function RootLayout({
  children
}: Readonly<{
  children: React.ReactNode;
}>) {
  const {
    data: { user }
  } = await createClient().auth.getUser();
  return (
    <html lang="en">
      <body className={`${pretendard.variable} antialiased`}>
        <UserStoreProvider isUser={!!user}>
          <Header />
          <Providers>
            <div className="min-h-screen pt-[50px]">{children}</div>
          </Providers>
          <Footer />
        </UserStoreProvider>
      </body>
    </html>
  );
}

 

 

Zustand로 상태 관리

 

`UserStoreProvider`는 `isUser` 값을 Zustand 스토어로 전달해 상태를 초기화합니다.

export const UserStoreProvider = ({ children, isUser }: UserStoreProviderProps) => {
  const storeRef = useRef<UserStoreApi>();
  if (!storeRef.current) {
    storeRef.current = createUserStore({ isUser: isUser });
  }
  return <UserStoreContext.Provider value={storeRef.current}>{children}</UserStoreContext.Provider>;
};

 

 

Zustand에서 전역 상태 관리

 

`createUserStore`에서 초기값을 받아 상태를 유지하도록 설정했습니다.

export const initUserState: UserState = {
  isUser: false
};
export const createUserStore = (initState: UserState = initUserState) => {
  return createStore<UserStore>()((set) => ({
    ...initState,
    userLogin: () => set(() => ({ isUser: true })),
    userLogout: () => set(() => ({ isUser: false }))
  }));
};

 

 

느낀 점 ❕

새로고침 시 로그인 상태를 유지하지 못하는 부분에서 불편함을 느꼈는데 Supabase와 Zustand를 사용해 문제를 해결하면서 서버 측 유저 정보 활용의 중요성을 느끼게 되었습니다.

 

 

반응형