Redux Thunk를 사용한 사용자 인증 토큰 관리 예제
Redux는 React 애플리케이션에서 상태 관리를 위한 효과적인 도구입니다. Redux Thunk는 Redux의 미들웨어로, 비동기 작업을 처리하고 액션을 디스패치할 수 있도록 도와줍니다. 이번 예제에서는 Redux Thunk를 사용하여 사용자 인증 토큰을 관리하는 방법을 알아보겠습니다.
1. 설치 및 구성
먼저, 프로젝트에 Redux 및 Redux Thunk를 설치해야 합니다. 다음 명령어를 사용하여 설치할 수 있습니다.
npm install redux redux-thunk
Redux를 구성하기 위해 store
폴더를 생성하고, store.js
파일을 다음과 같이 작성합니다.
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';
const store = createStore(rootReducer, applyMiddleware(thunk));
export default store;
2. 액션 생성자
사용자 인증과 관련된 액션 및 액션 생성자를 작성합니다. 이 예제에서는 로그인과 로그아웃 액션에 대해서만 설명하도록 하겠습니다.
// actionTypes.js
export const LOGIN = 'LOGIN';
export const LOGOUT = 'LOGOUT';
// actions.js
export const login = (token) => ({
type: LOGIN,
payload: token
});
export const logout = () => ({
type: LOGOUT
});
3. 리듀서
기존의 Redux 리듀서를 수정하여 사용자 인증 상태를 관리하도록 합니다.
import { LOGIN, LOGOUT } from '../actionTypes';
const initialState = {
token: null,
isAuthenticated: false
};
const authReducer = (state = initialState, action) => {
switch (action.type) {
case LOGIN:
return {
...state,
token: action.payload,
isAuthenticated: true
};
case LOGOUT:
return {
...state,
token: null,
isAuthenticated: false
};
default:
return state;
}
};
export default authReducer;
4. Thunk 액션 생성자
Thunk 액션 생성자를 작성하여 비동기 작업을 처리할 수 있도록 합니다. 이 예제에서는 로그인 API를 호출하여 토큰을 받아오는 작업을 수행하도록 하겠습니다.
import { login } from './actions';
export const loginUser = (username, password) => {
return (dispatch) => {
// API 호출 등의 비동기 작업 수행
fetch('https://example.com/login', {
method: 'POST',
body: JSON.stringify({ username, password })
})
.then(response => response.json())
.then(data => {
// 로그인 성공 시 토큰을 저장하고 인증 상태를 업데이트
dispatch(login(data.token));
})
.catch(error => {
// 에러 처리 로직
console.error('Error:', error);
});
};
};
5. 컴포넌트에서 사용
Redux와 연동된 컴포넌트에서 useDispatch
훅을 사용하여 Thunk 액션 생성자를 디스패치할 수 있습니다.
import React, { useState } from 'react';
import { useDispatch } from 'react-redux';
import { loginUser } from './thunks';
const LoginForm = () => {
const dispatch = useDispatch();
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const handleSubmit = (e) => {
e.preventDefault();
// 로그인 액션 디스패치
dispatch(loginUser(username, password));
// 입력 필드 초기화
setUsername('');
setPassword('');
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={username}
onChange={(e) => setUsername(e.target.value)}
placeholder="Username"
/>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="Password"
/>
<button type="submit">Login</button>
</form>
);
};
export default LoginForm;
이제 Redux Thunk를 사용하여 사용자 인증 토큰을 관리하는 예제를 마쳤습니다. Redux Thunk를 사용하면 비동기 작업을 더욱 효과적으로 처리할 수 있고, 액션 생성자에서 API 호출 및 기타 비동기 작업을 처리할 수 있습니다.
참고자료: