컴포넌트 → dispatch(action) → Reducer → Store → 컴포넌트
// store.js
import { configureStore } from '@reduxjs/toolkit';
import authSlice from './authSlice';
const store = configureStore({
reducer: {
auth: authSlice, // auth 상태 저장
},
});
export default store;
// authSlice.js
import { createSlice } from '@reduxjs/toolkit';
const initialState = {
isAuthenticated: false, // 로그인 여부
};
const authSlice = createSlice({
name: 'auth',
initialState,
reducers: {
login(state) {
state.isAuthenticated = true; // 로그인 성공
},
logout(state) {
state.isAuthenticated = false; // 로그아웃
},
},
});
// 액션과 리듀서 export
export const { login, logout } = authSlice.actions;
export default authSlice.reducer;
// main.jsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import store from './store';
import App from './App';
ReactDOM.createRoot(document.getElementById('root')).render(
<Provider store={store}>
<App />
</Provider>
);
// LoginComponent.jsx
import React from 'react';
import { useDispatch } from 'react-redux';
import { login, logout } from './authSlice';
export default function LoginComponent() {
const dispatch = useDispatch();
return (
<div>
<button onClick={() => dispatch(login())}>로그인</button>
<button onClick={() => dispatch(logout())}>로그아웃</button>
</div>
);
}
// StatusComponent.jsx
import React from 'react';
import { useSelector } from 'react-redux';
export default function StatusComponent() {
const isAuthenticated = useSelector((state) => state.auth.isAuthenticated);
return (
<h3>
현재 상태 : {isAuthenticated ? "로그인됨 ✅" : "로그아웃됨 ❌"}
</h3>
);
}
LoginComponent에서 로그인 버튼 클릭
→ dispatch(login()) 실행
authSlice의 login Reducer 실행 → isAuthenticated = true 업데이트
store의 상태 변경
StatusComponent가 store 상태를 감지하고 UI 업데이트