CRA๋ JavaScript๋ก ๊ตฌ์ฑ๋ Webpack(์นํฉ)์ ์ฌ์ฉํ๋๋ฐ ์๋๊ฐ ๋๋ฆฐํธ์ด๋ค. ์ฝ๋์ ์์ด ๋ง์์ง์๋ก ๋๋ฆฐ ์๋๋ฅผ ์ฒด๊ฐํ ์ ์๋ค. ์์ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด Esbuild๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๋น๋ํด์ธ vite๋ฅผ ์ฌ์ฉํ๋ค.
*Esbuild: Go ์ธ์ด๋ก ์์ฑ๋ JavaScript ๋น๋ํด, ์๋๊ฐ ๋น ๋ฆ
๐Webpack๊ณผ Vite์ ์ฐจ์ด์
๊ฐ๋ฐ์๋ฒ
- Webpack: ์์ค ์ฝ๋์ ๋ชจ๋ ์ข ์ ๊ด๊ณ์ ๋ชจ๋ ๋ฒ๋ค๋ง ํ ์๋ฒ๊ฐ ์ค๋น๋๋ค.
- Vite: Esbuild๋ก ๋ฏธ๋ฆฌ ๋ฒ๋ค๋งํ ๋ชจ๋์ ํ์ํ ๋ ๋์ ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ฆ๊ฐ์ ์ผ๋ก ์๋ฒ๊ฐ ๊ตฌ๋๋๋ค.
ํ๋ก๋์ ๋น๋
- Webpack: ๊ฐ ๋ชจ๋์ ๋ฒ์๋ง๋ค ํจ์๋ก ๋งคํํ์ฌ ๊ฒฐํฉํ๋ค.
- Vite: ํ๋์ ํ์ผ์ ๋ชจ๋ ์ข ์ ๋ชจ๋์ ์ ์ญ ๋ฒ์๋ก ์ ์ธํ์ฌ ๊ฒฐํฉํ๋ค. ์ค๋ณต์ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ๋น๋ํ ์ ์๋ค.
npm init vite
⇒ ์ด ๋ช ๋ น์ด๋ฅผ ํตํด์ ํ๋ก์ ํธ ์์ฑํ๊ณ , ์ต์ ํ๋์ฉ ์ ํํ๋ฉด ๋๋๋ฏ?
Redux Toolkit
1. Redux ์คํ ์ด(Store)
Redux ์คํ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ์ํ(state)๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ด๋ค. ์คํ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๋ณด๊ดํ๊ณ , ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ, ์ํ์ ๋ณ๊ฒฝ์ ๊ตฌ๋ ํ ์ ์๋๋ก ํ๋ค.
- ์ํ ์ ์ฅ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํธ๋ฆฌ ์ ์ฒด๋ฅผ ์ ์ฅํ๋ค.
- ์ํ ์ ๊ทผ: getState()๋ฉ์๋๋ฅผ ํตํด ํ์ฌ ์ํ๋ฅผ ์ ๊ทผํ ์ ์๋ค.
- ์ํ ์ ๋ฐ์ดํธ: dispatch(action) ๋ฉ์๋๋ฅผ ํตํด ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ค. action์ ์ํ๋ฅผ ์ด๋ป๊ฒ ๋ณ๊ฒฝํ ์ง ์ค๋ช ํ๋ ๊ฐ์ฒด๋ค.
- ๊ตฌ๋ ๊ด๋ฆฌ: subscribed(listener) ๋ฉ์๋๋ฅผ ํตํด ์ํ ๋ณ๊ฒฝ์ ๊ตฌ๋ ํ ์ ์๋ค. ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฆฌ์ค๋๊ฐ ํธ์ถ๋๋ค.
์คํ ์ด๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ Redux์ ‘createStore’ ํจ์ ๋๋ Redux Toolkit์ ‘configureStore’ ํจ์๋ฅผ ์ฌ์ฉํ๋ค. Redux Toolkit์ ‘configureStore’๋ ์คํ ์ด ์ค์ ์ ๋ ์ฝ๊ฒ ํด์ฃผ๋ ๋๊ตฌ์ด๋ค.
2. ๋ฆฌ๋์(Reducer)
๋ฆฌ๋์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ํจ์์ด๋ค. ๋ฆฌ๋์๋ ํ์ฌ ์ํ์ ์ก์ (action)์ ์ธ์๋ก ๋ฐ์์ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ค. ๋ฆฌ๋์๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ๋๋ค.
- ์์ ํจ์: ์ฃผ์ด์ง ์ธ์ ์ธ์ ๋ค๋ฅธ ๊ฐ์ ์ฐธ์กฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ์ง ์๋ ํจ์, ๋์ผํ ์ธ์๋ก ํธ์ถ๋๋ฉด ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
- ํ์ฌ ์ํ์ ์ก์ : ๋ฆฌ๋์๋ ํ์ฌ ์ํ์ ์ก์ ์ ์ธ์๋ก ๋ฐ๋๋ค.
- ์๋ก์ด ์ํ ๋ฐํ: ๋ฆฌ๋์๋ ์๋ก์ด ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ํ๋ ๋ถ๋ณ์ฑ์ด ์ ์ง๋์ด์ผ ํ๋ฏ๋ก ๊ธฐ์กด ์ํ๋ฅผ ์ง์ ๋ณ๊ฒฝํด์๋ ์๋๋ค. ๋์ ์๋ก์ด ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํ๋ค.
1. Redux ๋ฐ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
npm install @reduxjs/toolkit react-redux
2. Redux ์ค์
2-1. ์คํ ์ด ์์ฑ
‘src’ ๋๋ ํ ๋ฆฌ ์๋์ ‘app’ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ , ‘store.js’ ํ์ผ์ ์์ฑ
// src/app/store.js
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from '../features/counter/counterSlice';
export const store = configureStore({
reducer: {
counter: counterReducer,
},
});
2-2. ์ฌ๋ผ์ด์ค ์์ฑ
‘src/features/counter’ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ , ‘counterSlice.js’ ํ์ผ์ ์์ฑ
// src/features/counter/counterSlice.js
import { createSlice } from '@reduxjs/toolkit';
export const counterSlice = createSlice({
name: 'counter',
initialState: {
value: 0,
},
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -= 1;
},
},
});
export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;
2-3. Redux Provider ์ค์
‘src/main.jsx’ ํ์ผ์ ์์ ํ์ฌ Redux Provider๋ฅผ ์ถ๊ฐ
// src/main.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { store } from './app/store';
import App from './App';
import './index.css';
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>
);
2-4. ์ปดํฌ๋ํธ์์ Redux ์ฌ์ฉ
์์๋ก ‘src/App.jsx’ ํ์ผ์ ์์ ํ์ฌ Redux ์ํ๋ฅผ ์ฌ์ฉ
import { useSelector, useDispatch } from "react-redux";
import { increment, decrement } from "./features/counter/counterSlice";
function App() {
const count = useSelector((state) => state.counter.value);
const dispatch = useDispatch();
return (
<>
<h1>count: {count}</h1>
<button onClick={() => dispatch(increment())}>Increment</button>
<button onClick={() => dispatch(decrement())}>Decrement</button>
</>
)
}
export default App;
์ฐธ๊ณ
[React] vite๋ก react ํ๋ก์ ํธ ์ค์น
๋ชจ๋ ๋ฒ๋ค๋ฌ๋? - Webpack vs Vite ๋ฌด์์ ์จ์ผ ํ ๊น์?
'๐ป์น(Web) > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก ํธ์๋ ์ฝ๋ฉ์ปจ๋ฒค์ (0) | 2024.07.13 |
---|---|
[React]Custom Hook (0) | 2024.06.28 |
[React]์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ฑ/์ผ๊ด์ฑ (0) | 2024.06.25 |
[React]AWS EC2๋ก React ๋ฐฐํฌํ๊ธฐ, ๋๋ฉ์ธ ์ฐ๊ฒฐ (0) | 2023.09.07 |
[React]Firebase๋ก React ๋ฐฐํฌํ๊ธฐ, Mixed-Content ์๋ฌ (1) | 2023.09.03 |