6.8 zustand 세션 질문입니다.
66
1 asked
session.ts
import type { Session } from "@supabase/supabase-js";
import { create } from "zustand";
import { combine, devtools } from "zustand/middleware";
type State = {
isLoaded: boolean;
session: Session | null;
};
const initialState = {
isLoaded: false,
session: null,
} as State;
const useSessionStore = create(
devtools(
combine(initialState, (set) => ({
actions: {
setSession: (session: Session | null) => {
set({ session, isLoaded: true });
},
},
})),
{
name: "sessionStore",
},
),
);
export const useSession = () => {
const session = useSessionStore((store) => store.session);
return session;
};
export const useIsSessionLoaded = () => {
const isSessionLoaded = useSessionStore((store) => store.isLoaded);
return isSessionLoaded;
};
export const useSetSession = () => {
const setSession = useSessionStore((store) => store.actions.setSession);
return setSession;
};
App.tsx
import { Button } from "@/components/ui/button";
import RootRoute from "./root-route";
import supabase from "@/lib/supabase";
import { useEffect } from "react";
import { useSetSession } from "@/store/session";
export default function App() {
const setSession = useSetSession();
useEffect(() => {
//console.log("111");
supabase.auth.onAuthStateChange((event, session) => {
setSession(session);
});
}, []);
return <RootRoute />;
}
코드는 강의와 동일하게 잘따라간 것 같은데
개발자 도구 에서 session이랑 isLoaded가 안보입니다.

새로고침을 해도, 탭을 껏다 켜도, 리액트를 껏다 켜도,
제미나이한테 물어봐도 이게 해결이 안됩니다.....
+추가
App.tsx
import { Button } from "@/components/ui/button";
import RootRoute from "./root-route";
import supabase from "@/lib/supabase";
import { useEffect } from "react";
import { useIsSessionLoaded, useSession, useSetSession } from "@/store/session";
export default function App() {
const setSession = useSetSession();
const session = useSession();
const isLoaded = useIsSessionLoaded();
useEffect(() => {
//console.log("111");
supabase.auth.onAuthStateChange((event, session) => {
setSession(session);
});
}, []);
useEffect(() => {
console.log("현재 세션 상태:", { session, isLoaded });
}, [session, isLoaded]); // 값이 바뀔 때마다 실행됨
return <RootRoute />;
}
이렇게 하고 새로고침하면 콘솔에는 찍히긴 합니다

단순한 리덕스 툴킷 버그인지
콘솔에 찍히니까 넘어가도 상관없는지 모르겠습니다.
Answer 2
1
안녕하세요 kin412님 이정환입니다.
강의 소스코드로 확인해본 결과 다음과 같이 setSession 이후의 변경된 State가 잘 출력되어야 하는데, Redux Devtools의 버그로 보입니다 ... 🥲
버그의 원인과 해결책을 정확히 알기 어렵기에 이처럼 확인이 잘 안되시는 경우 console.log를 이용하시는 편이 좋을 것 같습니다.
(토큰 노출의 위험이 있어 누추하게 가린 점 죄송합니다)
0
안녕하세요, 인프런 AI 인턴입니다. kin412님.
zustand와 Redux DevTools를 연동할 때 발생할 수 있는 문제를 겪으셨군요. 문제를 해결하기 위해 몇 가지 점을 확인해 보겠습니다.
문제 발생 원인 및 해결 방법
- 개발자 도구에서 상태 미표시 문제:
상태가 표시되지 않는 문제는 주로 Redux DevTools가 zustand 미들웨어를 올바르게 인식하지 못해서 발생할 수 있습니다. 코드에서는 이미 devtools 미들웨어를 사용하고 있지만, 상태가 보이지 않는다면 다음 사항들을 점검해보세요.
DevTools가 실제로 zustand 스토어를 인식하고 있는지 확인하세요. 특정 브라우저에서는 DevTools 확장 프로그램이 정상적으로 상태 업데이트를 감지하지 못할 수 있습니다.
코드를 실행하는 브라우저 환경에서 Redux DevTools 확장 프로그램이 제대로 설치되어 있는지 확인하세요. 특정한 상황에서는 확장 프로그램이 제대로 작동하지 않을 수 있습니다.
- 무명 액션 표시 문제:
zustand에서 액션 명이 ‘anonymous’로 표시되는 경우에는 액션 명을 직접 설정해 주어야 합니다. set 메서드의 세 번째 인자인 액션 이름을 추가해주시면 됩니다. 이 부분은 잘 구현하신 것 같습니다.
set({ session, isLoaded: true }, undefined, 'actions.setSession');
- Redux DevTools 설정 문제:
zustand의 devtools 사용 시, 추가로 세부 설정이 필요할 수 있습니다. 예를 들어, 아래와 같이 devtools 미들웨어에 옵션을 제공하여 구체적인 설정을 할 수 있습니다.
const useSessionStore = create(
devtools(
combine(initialState, (set) => ({
actions: {
setSession: (session: Session | null) => {
set({ session, isLoaded: true }, undefined, 'actions.setSession');
},
},
})),
{
name: "sessionStore",
trace: true,
traceLimit: 25,
},
),
);
추가 점검 사항
의존성 배열:
useEffect에 비어 있는 의존성 배열을 사용하는 것은 한 번만 실행되도록 하는 의도입니다. 필요한지 여부를 점검해보세요.라이브러리 버전: 사용 중인 zustand 및 Redux DevTools의 버전을 확인하고 최신 버전으로 업데이트되어 있는지 확인하십시오.
관련 토픽의 유사 질문은 아래 링크를 참고해주세요:
- Zustand 상태관리와 Redux DevTools 통합
구체적인 디버깅이 필요하시다면, 현재 환경의 문제를 확인하기 위해 다양한 시도를 해보실 수 있습니다. 추가적인 궁금증이 있으시면 주저하지 말고 이어서 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
useMutation 적용 후 새로운 글 등록시 content가 안보여요
0
20
2
next.js 강의에서도 리액트 라이브러리들을 다뤄주시나요?
0
56
2
shadcn에서 radix ui와 base ui 차이는 뭔가요?
0
198
2
updateTodo 함수 생성시 화살표 함수 사용 안하는 이유
0
61
2
4.11 바로 투두 삭제가 안됨 질문
0
73
3
매개변수 updatedTodo 관련 질문
0
55
3
인증 정보가 만료되었을 때 라우트 가드 처리가 궁금합니다!
0
69
2
supabase를 사용하지 않을 경우 세션 데이터의 변경을 감지하고 스토어에 보관하는 방법이 궁금합니다!
0
58
2
4.6 id를 string으로 변경시 오류
0
53
2
리액트 타입스크립트 관련 질문있습니다.
0
52
1
소셜 로그인 구현하기 관련하여 질문이 있습니다!
0
86
2
ui 파일 질문드립니다.
0
62
1
tanstack query devtools에서 질문있습니다!
0
56
2
댓글 삭제 시 isPending 질문
0
54
2
두번째 예외상황에 대해 질문있습니다!
0
53
1
리액트 쿼리 질문입니다
0
56
2
개발자도구에서 components 가 안보입니다.
0
75
3
state 관리에 대한 정리
0
68
3
[(2.4) Shadcn/ui를 소개합니다] 강의 Shadcn 세팅 관련 질문 있습니다.
0
146
3
like 테이블에서 왜 create_at이 필요한지 궁금합니다.
0
66
1
삭제가 바로 안되네요ㅠ
0
54
2
access 토큰은 꼭 소셜서버로부터 받아서 사용해야만하나요?!
0
71
2
전역 모달이 여러 개일 경우 모달 프로바이더는 몇 개가 필요한가요?
0
52
1
프로필 수정 후 post item 의 글들에서 수정된 프로필 업데이트 반영
0
69
2

