이번 프로젝트에서는 전역 상태 관리 라이브러리로 Zustand
를 사용했다.
이런 저런 이유가 있지만 사용하기로 한 이유는
Redux에 비해 가볍고, 불필요한 코드가 적고, 직관적이다! 그리고 프로젝트의 규모도 큰 편이 아니기에 굳이 Redux를 쓸 필요는 없다고 생각했다. 새로운 걸 사용해보고 싶기도 했다!
npm i zustand
type AuthStore = {
isLoggedIn: boolean;
login: () => void;
logout: () => void;
userId: string | null;
setUserId: (userId: string) => void;
userName: string | null;
setUserName: (userName: string) => void;
userNickname: string | null;
setUserNickname: (userNickname: string) => void;
userNumber: number | null;
setUserNumber: (userNumber: number) => void;
};
import { createStore } from "zustand";
const useAuthStore = createStore(
persist<AuthStore>(
(set) => ({
isLoggedIn: false,
login: () => set({ isLoggedIn: true }),
logout: () =>
set({
isLoggedIn: false,
userId: null,
userNickname: null,
userNumber: null,
userName: null,
}),
userId: null,
setUserId: (userId: string) => set({ userId: userId }),
userName: null,
setUserName: (userName: string) => set({ userName: userName }),
userNickname: null,
setUserNickname: (userNickname: string) =>
set({ userNickname: userNickname }),
userNumber: null,
setUserNumber: (userNumber: number) => set({ userNumber: userNumber }),
}),
{
name: "userInfoStorage", //Storage 이름 지정 (default: localStorage)
}
)
//)
);
createStore
를 불러온다. import { createStore } from "zustand";
isLoggedIn: boolean
을 만들어주었다.AuthStore type
을 사용해서 어떻게 상태를 관리할 건지 작성해주면 된다.persist
미들웨어를 적용해주었다. zustand
에서 제공해준다!persist
로 감싸주기만 하면 된다!name: "userInfoStorage",
이런식으로 Storage 이름을 지정할 수 있다.localStorage
이고,storage: createJSONStorage(() => sessionStorage
해주면 세션스토리지로 관리 할 수 있다.//상단에서 사용 할 store를 import 해온다.
import useAuthStore from "../../../stores/useAuthStore";
const onSubmit: SubmitHandler<LoginFormInputs> = async (data) => {
try {
const res = await axios.post("/api/login", data, {
headers: {
"Content-Type": "application/json",
},
});
if (res.status == 200) { //로그인이 성공하면 useAuthStore에 필요한 내용을 세팅!
useAuthStore.setState({
isLoggedIn: true,
userId: res.data.userId,
userName: res.data.userName,
userNumber: res.data.userNumber,
userNickname: res.data.userNickname,
});
navigate("/");
}
} catch (error) {
console.log("로그인 err", error);
}
};
//로그아웃 요청 성공 시
const logout = useAuthStore.getState().logout;
logout();
//useAuthStore 에서 로그아웃 시 저장된 정보들을 null값으로 초기화시키도록 했기 때문에
//logout상태를 그대로 사용해주기만 하면 된다!
logout: () =>
set({
isLoggedIn: false,
userId: null,
userNickname: null,
userNumber: null,
userName: null,
}),
혹시 여쭤볼게 있는데 개인적으로 연락할 수 있는 연락처를 주실 수 있나요?