React Task App ํ๋ก์ ํธ ์ค์ต์ ๋ค์ด์๋ค. ํ๋ก ํธ์๋ ํํธ์ ์ง์ ํ์๋ง์ C ์ธ์ด๋ฅผ ๋จผ์ ๋ค๋ฃจ๊ณ , Typescirpt์ React ๊ฐ๋ ๋ง ๊ฐ๋จํ ์ง์ ํ ๊ณง๋ฐ๋ก ์ค์ต์ด ์งํ๋์ด ๋ค์ ๋นํฉ์ค๋ฝ๊ธฐ๋ ํ๋ค...์ด๋ก ์ ์ถฉ๋ถํ ๋ค์ง ์๊ฐ์ด ์์ ์ค ์์๋๋ฐ, ์๊ฐ๋ณด๋ค ๋น ๋ฅด๊ฒ ์ค์ ์์ฃผ๋ก ๋ค์ด๊ฐ๋ ๊ตฌ์ฑ์ด๋ผ ๊ธด์ฅ๊ฐ์ด ๋์น๋ ๋ฏ.
ํนํ Redux๊น์ง ๋ค๋ฃจ๋๊ฑด ๋๋ผ์์ ์ฐ์์ด๋ค. Redux๋ฅผ ์ค์ต๊น์ง ์ ์ฉํด ๋ณธ ๊ฒฝํ์ ์์ด Redux์ ์ํ ๊ด๋ฆฌ ํ๋ฆ์ด ์์ง ์์ ํ ์ ๋ฟ์ง๋ ์์ง๋ง, ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋๋ฐ ์ง์คํ๋ฉด์ ํ๋์ฉ ๋ฐ๋ผ๊ฐ๋ ์ค์ด๋ค. ์ค์ต์ ํตํด ์ ์ด๋ฐ ๋๊ตฌ๋ค์ด ํ์ํ์ง, React ์ปดํฌ๋ํธ ๊ตฌ์กฐ์ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง๋ฅผ ๋ชธ์ผ๋ก ์ตํ๋ ๋จ๊ณ๋ผ๊ณ ์๊ฐํ๊ณ ์ด์ฌํ ํด๋ณด๊ธฐ
๊ฐ๋ฐ์์ ์์ฃผ ์ฌ์ฉํ๋ ๋๋ ํ ๋ฆฌ ๋ฐ ํ์ผ ์ญํ ๋ค์ ์ ๋ฆฌํด๋ณด์๋ค.
๐๏ธcomponents/
- UI๋ฅผ ๊ตฌ์ฑํ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋จ์
- ์ฃผ๋ก Presentational / Dumb Component๋ก ๋ก์ง๋ณด๋ค UI ์ค์ฌ
๐๏ธ hooks/
- React์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ง ๋จ์(useToggle, useFetch, useAuth ๋ฑ)
- ์ํ ๊ด๋ฆฌ, side effect ์ฒ๋ฆฌ ๋ฑ์ ์บก์ํ
๐๏ธ store/
- ์ ์ญ ์ํ ๊ด๋ฆฌ
- ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๊ณต์ ํ๋ ๋ฐ์ดํฐ ์ ์ฅ์
๐๏ธ types/
- typescript ํ์ ์ ์ ๋ชจ์
- ํ๋ก์ ํธ ์ ๋ฐ์์ ์ผ๊ด๋ ํ์ ์ฌ์ฉ ๊ฐ๋ฅ
๐๏ธ lib/, libs/
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์ ๋๋ ๋ํผ ํจ์
- Axios ์ธ์คํด์ค, firebase ์ค์ , ๋ ์ง ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ํผ ๋ฑ ์ธ๋ถ ๋๊ตฌ์์ ์ฐ๊ฒฐ ์ง์
๐๏ธ utils/
- ์์ ํจ์ ๊ธฐ๋ฐ ์ ํธ๋ฆฌํฐ ๋ชจ์
- ๋ ์ง ํฌ๋งทํฐ, ๋ฌธ์์ด ํ์, ๊ณ์ฐ๊ธฐ ๋ฑ ์ํ๋ UI์ ์์กดํ์ง ์๊ณ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ํจ์

๐งฉ์ฌ์ฉํ ์ปดํฌ๋ํธ
src
โโโ App.css
โโโ App.tsx
โโโ assets
โ โโโ react.svg
โโโ components
โ โโโ ActionButton
โ โ โโโ DropDownForm
โ โ โ โโโ index.css.ts
โ โ โ โโโ index.tsx
โ โ โโโ index.css.ts
โ โ โโโ index.tsx
โ โโโ BoardList
โ โ โโโ SideForm
โ โ โ โโโ index.css.ts
โ โ โ โโโ index.tsx
โ โ โโโ index.css.ts
โ โ โโโ index.tsx
โ โโโ EditModal
โ โ โโโ index.css.ts
โ โ โโโ index.tsx
โ โโโ List
โ โ โโโ index.css.ts
โ โ โโโ index.tsx
โ โโโ ListContainer
โ โ โโโ index.css.ts
โ โ โโโ index.tsx
โ โโโ LoggerModal
โ โ โโโ LogItem
โ โ โ โโโ index.css.ts
โ โ โ โโโ index.tsx
โ โ โโโ index.css.ts
โ โ โโโ index.tsx
โ โโโ Task
โ โโโ index.css.ts
โ โโโ index.tsx
โโโ hooks
โ โโโ redux.ts
โโโ index.css
โโโ main.tsx
โโโ store
โ โโโ index.ts
โ โโโ reducer
โ โ โโโ reducer.ts
โ โโโ slices
โ โโโ boardSlice.ts
โ โโโ loggerSlice.ts
โ โโโ modalSlice.ts
โโโ types
โโโ index.ts
18 directories, 32 files
๊ฐ์ฌ๋๊ป์๋ ํด๋ ํ์ ํ์ผ๋ ํด๋๋ช ๊ณผ ํต์ผํ์ฌ ์์ฑํ์ จ๋ค(ex: List/List.tsx, List.css.ts).
๋ค๋ง ๋๋ ์ปดํฌ๋ํธ๋ฅผ ํด๋ ๋จ์๋ก ๋ถ๋ฆฌํ ์์ ์์, ํด๋น ํด๋ ์์ฒด๊ฐ ์ด๋ฏธ ํ๋์ ์ปดํฌ๋ํธ๋ฅผ ๋ํํ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค๊ณ ๋ณด์๋ค. ์ด๋ฐ ๊ด์ ์์, ํ์ผ๋ช ์ ๋ค์ ํด๋๋ช ์ ๋ฐ๋ณตํ๋ ๊ฒ์ด ๋ค์ ์ค๋ณต๋ ํํ์ฒ๋ผ ๋๊ปด์ก๋ค.
๊ทธ๋์ List/List.tsx ๋์ List/index.tsx ๊ตฌ์กฐ๋ฅผ ์ ํํ๋ค. ์ด ๋ฐฉ์์ import ๊ฒฝ๋ก๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์๊ณ , ์ปดํฌ๋ํธ์ ์ง์ ์ ์ ๋ช ํํ ๋๋ฌ๋ธ๋ค๋ ์ฅ์ ์ด ์๋ค. ๋ํ ์ด์ ํ๋ก์ ํธ์์๋ ๋์ผํ ํด๋๋ช /index.tsx ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํด ์๊ธฐ ๋๋ฌธ์, ๊ฐ์ธ์ ์ผ๋ก๋ ๊ฐ์ฅ ์ต์ํ๊ณ ์ ์ง๋ณด์๊ฐ ์์ํ ๋ฐฉ์์ด์๋ค.
์ด๋ฐ ์ด์ ๋ก ์ด๋ฒ ํ๋ก์ ํธ์์๋ ๊ตฌ์ฑ์ ํด๋ ๊ธฐ์ค์ผ๋ก ํ๊ณ , ๋ด๋ถ ์ง์ ํ์ผ์ index.tsx๋ก ํต์ผํ์ฌ ๊ด๋ฆฌํ์๋ค.
โฌ๏ธํจํค์ง ์ค์น
- @reduxjs/toolkit: Redux ๊ณต์ ํดํท
- redux: ์ํ๊ด๋ฆฌ๋ฅผ ์ํ ๊ธฐ๋ณธ Redux ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- clsx: ์กฐ๊ฑด๋ถ className์ ๊น๋ํ๊ฒ ์กฐํฉํด์ฃผ๋ ์ ํธ
- @vanilla-extract/css: css-in-typescript ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- @vanilla-extract/css-utils: splinkles๊ฐ์ ์ ํธ๋ฆฌํฐ ์คํ์ผ ์์คํ ์ ๊ตฌ์ฑํ ๋ ์ฌ์ฉํ๋ ๋ณด์กฐ ๋ชจ๋
- @vanilla-extract/vite-plugin: vite์์ vanilla-extract๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๋น๋ ํ๋ฌ๊ทธ์ธ
- react-icons: ์์ด์ฝ
- uuid: ๊ณ ์ ์๋ณ์(UUID) ์์ฑ ์ ํธ
- react-beautiful-dnd: ๋๋๊ทธ ์ค ๋๋กญ ์ธํฐ๋์ ๊ตฌํ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โ@vanilla-extract/vite-plugin ์์กด์ฑ ์ถฉ๋ ๋ฌธ์
vite๋ฅผ @latest๋ก ์ค์นํ๋๋ฐ, @vanilla-extract/vite-plugin์ vite@^5.0.0 || ^6.0.0 ๊น์ง๋ง ์ง์ํด์ ๋ฐ์ํ๋ ๋ฌธ์ ์๋ค.

โ ํด๊ฒฐ๋ฐฉ๋ฒ:
vite ๋ฒ์ ์ ํธํ ๋ฒ์ ์ผ๋ก ๋ฎ์ท๋ค.
npm install vite@^6
โreact-beautiful-dnd ์์กด์ฑ ์ถฉ๋ ๋ฌธ์
๋ ๋ฒ์งธ ์ถฉ๋์ react-beautiful-dnd๊ฐ react 19๋ฅผ ์ง์ํ์ง ์์์ ์๊ธด ์ถฉ๋์ด๋ค(deprecated ๋จ).

โ ํด๊ฒฐ๋ฐฉ๋ฒ:
๋์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, React ๋ฒ์ ์ ๋ฎ์ถ์ด ํด๊ฒฐํ ์ ์๋ค. ์ฐ์ ๊ฐ์์ ์ค์ต ํ๊ฒฝ์ ๋ง์ถ๊ธฐ ์ํด react-beautiful-dnd๋ฅผ ์ฌ์ฉํด์ผ ํ๊ธฐ์ react๋ฅผ 18๋ก ๋ฎ์ถ์ด ํด๊ฒฐํ๋ค.
npm install react@18 react-dom@18

โ๏ธRedux ๊ธฐ๋ณธ ์ค์
redux๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. React์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก props, state๋ฅผ ํตํด ์ปดํฌ๋ํธ ๊ฐ ์ํ๋ฅผ ์ ๋ฌํ๊ณ ๊ณต์ ํ ์ ์์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ํ๊ฐ ์ฌ๋ฌ ์ปดํฌ๋ํธ์ ๋ถ์ฐ๋๊ณ ์์กด ๊ด๊ณ๊ฐ ๋ณต์กํด์ง๋ฉด์ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Redux์ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
Redux ํ๋ฆ
Redux์ ํต์ฌ ํน์ง์ ์ํ ๋ณ๊ฒฝ ํ๋ฆ์ด ํ ๋ฐฉํฅ์ผ๋ก๋ง ์ด๋ฃจ์ด์ง๋ค๋ ์ ์ด๋ค.
์ปดํฌ๋ํธ์์ ํน์ ๋์์ด ๋ฐ์ํ๋ฉด, action์ด๋ผ๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ , ์ด action์ dispatch์ ํจ์๋ฅผ ํตํด reducer๋ก ์ ๋ฌ๋๋ค. reducer๋ ์ ๋ฌ๋ฐ์ action์ type์ ๊ธฐ์ค์ผ๋ก ๊ธฐ์กด ์ํ๋ฅผ ๋ฐํ์ผ๋ก ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๊ณ , ์ด ๊ฒฐ๊ณผ๊ฐ redux store์ ์ ์ฅ๋๋ค.
์ด์ฒ๋ผ ์ํ๊ฐ ์์ธก ๊ฐ๋ฅํ ๋จ์ผ ํ๋ฆ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์, store์ ๊ฐ์ด ์ ๋ฐ์ดํธ๋๋ฉด ํด๋น ์ํ๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ ์ปดํฌ๋ํธ๋ค์ ์๋์ผ๋ก ๋ฆฌ๋ ๋๋ง๋๋ค. ์ด๋ ์ํ ๋ณํ์ ์์ธ์ ์ถ์ ํ๊ธฐ ์ฝ๊ณ , ๋๋ฒ๊น ์ ์ ๋ฆฌํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ ๋ค.
Slice
Redux Toolkit์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, reducer๋ฅผ ์ง์ ์์ฑํ๊ธฐ๋ณด๋ค๋ slice๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด ์ผ๋ฐ์ ์ด๋ค.
CreateSlice๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๊ธฐ ์ํ, reducer ๋ก์ง, ๊ทธ๋ฆฌ๊ณ action ์์ฑ๊น์ง ํ ๋ฒ์ ์ ์ํ ์ ์์ด Redux๋ฅผ ๋ณด๋ค ๊ฐ๊ฒฐํ๊ณ ์ค์ฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
import { createSlice } from "@reduxjs/toolkit";
import type { ITask } from "../../types";
type TModalState = {
boardId : string;
listId: string;
task: ITask;
}
const initialState:TModalState = {
boardId: "board-0",
listId: "list-0",
task:{
taskId: "task-0",
taskName: "task 0",
taskDescription: "task description",
taskOwner: "John"
}
}
const modalSlice = createSlice({
name: 'modal',
initialState,
reducers:{
}
})
export const modalReducer = modalSlice.reducer;
๋จผ์ createSlice๋ฅผ Redux Toolkit์์ importํ๊ณ , ๋ชจ๋ฌ์์ ๋ค๋ฅธ task์ ์ ๋ณด ํ์ ์ Itask ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ์ฌ ๋ถ๋ฌ์๋ค. ์ํ์ ๊ตฌ์กฐ๋ฅผ ํ์ ์ผ๋ก ๋ช ํํ ์ ์ํ์ฌ, ์ํ ๋ณ๊ฒฝ ์ ํ์ ์ ์์ ์ฑ์ ํ๋ณดํจ.
initialState๋ Redux Store์ ์ ์ฅ๋ ์ด๊ธฐ ์ํ๊ฐ์ด๋ค. ๋ชจ๋ฌ์ ํน์ task๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฆฌ๊ธฐ ๋๋ฌธ์, boardId, listId, task ์ ๋ณด๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํฌํจํ๊ณ ์๋ค. ์ค์ ํ๋ก์ ํธ์์๋ ๋ชจ๋ฌ์ด ์ด๋ฆด ๋ action์ ํตํด ์ด ๊ฐ๋ค์ด ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ค.
createSlice๋ slice์ ์ด๋ฆ, ์ด๊ธฐ ์ํ, ๊ทธ๋ฆฌ๊ณ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ reducer ํจ์๋ค์ ํ๋์ ๊ฐ์ฒด๋ก ๋ฌถ์ด ์ ์ํ๋ค. ํ์ฌ๋ reducer๊ฐ ๋น์ด ์์ง๋ง, ์ถํ ๋ชจ๋ฌ์ ์ด๊ฑฐ๋ ๋ซ๋ ๋์ ๋ฑ์ reducer์ ์ฌ๊ธฐ์ ์ถ๊ฐํ๋ค.
๋ง์ง๋ง์ผ๋ก slice์์ ์์ฑ๋ reducer์ exportํ์ฌ, redux store์ ๋ฑ๋กํ ์ ์๊ฒ ํ๋ค. Redux Toolkit์ ์ฌ์ฉํ๋ฉด reducer์ action์ ๊ฐ๋ณ์ ์ผ๋ก ๊ด๋ฆฌํ ํ์ ์์ด, slice ๋จ์๋ก ์ํ ๋ก์ง์ ๊ตฌ์ฑํ ์ ์๋ค๋ ์ ์ด ํฐ ์ฅ์ ์ด๋ค.
Redux Store ๊ตฌ์ฑ
//redux store์ฉ ํ์ผ
import { configureStore } from "@reduxjs/toolkit";
import reducer from "./reducer/reducer";
const store = configureStore({
reducer
})
export default store
redux toolkit์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ํ๋์ store์ ์์ฑํ๊ณ , ์ฌ๋ฌ slice์์ ์ ์ํ reducer๋ค์ ์ด store์ ๋ฑ๋กํ๋ค.
configureStore๋ redux toolkit์์ ์ ๊ณตํ๋ store ์์ฑ ํจ์๋ก, ๊ธฐ์กด redux์ createStore ๋ณด๋ค ์ค์ ์ด ๊ฐ๊ฒฐํ๊ณ ๊ธฐ๋ณธ์ ์ธ ๋ฏธ๋ค์จ์ด์ ๊ฐ๋ฐ์ ๋๊ตฌ ์ค์ ์ด ์๋์ผ๋ก ํฌํจ๋๋ค.
์ด ํ์ผ์์๋ store ์์ฑ ์ญํ ๋ง ๋ด๋นํ๋๋ก ๊ตฌ์ฑํ๊ณ , ์ค์ reducer ์กฐํฉ ๋ก์ง์ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด store์ ์ค์ ๊ณผ ์ํ ๊ตฌ์กฐ ์ ์๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ก์ ๋ ๊ด๋ฆฌํ๊ธฐ ์์ํ๋ค.
Root Reducer ๊ตฌ์ฑ
import { boards } from "../slices/boardSlice";
import { loggerReducer } from "../slices/loggerSlice";
import { modalReducer } from "../slices/modalSlice";
const reducer = {
logger: loggerReducer,
boards: boards,
modal: modalReducer
}
export default reducer;
์ ์ฝ๋๋ ์ฌ๋ฌ slice์์ ์ ์ํ reducer๋ค์ ํ๋์ ๊ฐ์ฒด๋ก ๋ฌถ๋ root reducer ์ญํ ์ ํ๋ค. ๊ฐ์ฒด์ ๊ฐ key๋ redux store์ ์ ์ฅ๋ ์ํ์ ์ด๋ฆ์ด ๋๋ฉฐ, value๋ ํด๋น ์ํ๋ฅผ ๊ด๋ฆฌํ๋ reducer ํจ์์ด๋ค.
์ ๋ฆฌ
์ ๋ฆฌํ๋ฉด, ์ต์ข ์ํ๋ ๋ค์๊ณผ ๊ฐ์ ํํ๊ฐ ๋๋ค.
state = {
logger: ...,
boards: ...,
modal: ...
}
- slice ๋จ์๋ก ์ํ ๋ก์ง์ ๋ถ๋ฆฌ-> ์ฑ ์์ด ๋ช ํ
- reducer๋ฅผ ๋ณ๋์ ํ์ผ๋ก ๊ด๋ฆฌ->store ์ค์ ์ฝ๋๊ฐ ๋จ์ํด์ง
- ์ํ ๊ตฌ์กฐ๊ฐ ์ฝ๋๋ก ๋ฐ๋ก ๋๋ฌ๋, useSelector ์ฌ์ฉ ์ ์์ธก ๊ฐ๋ฅ
์์ ๊ฐ์ ์ค๊ณ์ ์ฅ์ ์ด ์๋ ๊ตฌ์กฐ์ด๊ณ , ์ถํ slice๊ฐ ์ถ๊ฐ ๋๋๋ผ๋ reducer ๊ฐ์ฒด์ ํญ๋ชฉ๋ง ์ถ๊ฐํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ํ์ฅ์ฑ ์ธก๋ฉด์์ ์ ๋ฆฌํ๋ค.
โ๏ธRedux Hooks
// redux store์ฉ ํ์ผ
import { configureStore } from "@reduxjs/toolkit";
import reducer from "./reducer/reducer";
const store = configureStore({
reducer
})
configureStore์ ํตํด redux store์ ์์ฑํ๋ค. ์ด ๋ ์ ๋ฌํ reducer ๊ฐ์ฒด์ ๊ตฌ์กฐ๊ฐ ์ ์ญ ์ํ ํธ๋ฆฌ์ ํํ๊ฐ ๋๋ค.
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
- RootState: store.getState์ ๋ฐํ ํ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ญ ์ํ์ ํ์ ์ ์๋์ผ๋ก ์ถ๋ก ํ๋ค. reducer ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ํ์ ์ ์ง์ ์์ ํ ํ์๊ฐ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
- AppDispatch: store์์ ์ฌ์ฉํ๋ dispatch ํจ์์ ํ์ ์ ๊ทธ๋๋ก ๊ฐ์ ธ์ ์ ์ํ๋ค. ์ดํ thunk๋ async action์ด ์ถ๊ฐ๋๋๋ผ๋ ์ฌ๋ฐ๋ฅธ ํ์ ์ถ๋ก ์ ์ ์งํ ์ ์๋ค.
import { useDispatch, useSelector, type TypedUseSelectorHook } from "react-redux";
import type { AppDispatch, RootState } from "../store";
๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ useSelector, useDispatch๋ ํ์ ์ ๋ณด๊ฐ ์ถฉ๋ถํ์ง ์๊ธฐ ๋๋ฌธ์, ์ด๋ฒ ํ๋ก์ ํธ์์๋ ์ ์ญ ํ์ ์ ์ ์ฉํ ์ปค์คํ ํ ์ ๋ง๋ค์ด ์ฌ์ฉํ์๋ค.
export const useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;
TypedUseSelectorHook<RootState>๋ฅผ ์ฌ์ฉํด useSelector๊ฐ ๋ฐํํ๋ state์ ํ์ ์ RootState๋ก ๊ณ ์ ํ๋ค. ์ด๋ก ์ธํด ์ปดํฌ๋ํธ์์ state๋ฅผ ์กฐํํ ๋ ์๋ ์์ฑ๊ณผ ํ์ ์ฒดํฌ๊ฐ ์ ํํ๊ฒ ๋์ํ๋ค.
export const useTypedDispatch = () => useDispatch<AppDispatch>();
useDispatch ์ญ์ AppDispatch ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ฉํ๋ค. ์ด๋ฅผ ํตํด dispatch ์ ์๋ชป๋ action์ด๋ payload๋ฅผ ์ ๋ฌํ๋ ์ค์๋ฅผ ์ปดํ์ผ ๋จ๊ณ์์ ๋ฐฉ์งํ ์ ์๋ค.
ํ๋ก์ ํธ ์ธํ ๋จ๊ณ๋ผ ๋ฐฉ์ฌํ๋๋ฐ ํ๋ฐ์ผ๋ก ๊ฐ์๋ก ํ์ ๊ด๋ จ ๋ด์ฉ๋ค์ด ํ๊บผ๋ฒ์ ๋ฑ์ฅํ๋ฉด์ ์ฒด๊ฐ ๋์ด๋๊ฐ ํ ์ฌ๋ผ๊ฐ๋ฏ...redux์ typescript๋ฅผ ํจ๊ป ์ ์ฉํด, ๋จ์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ ์ด์์ผ๋ก ํ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๋ฐ ๋ ๋ง์ ์๋์ง๊ฐ ํ์ํ๋ค๊ณ ๋๊ปด์ง๋ค..
ํ์ ๋๋ฌธ์ ํผ๋์ค๋ฌ์ด ์๊ฐ๋ ์์์ง๋ง, Redux์ ์ ์ฒด์ ์ธ ํ๋ฆ๊ณผ Rootstate, Dispatch ํ์ ์ ํตํด ์ํ ๋ณ๊ฒฝ์ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ฐฐ์ธ ์ ์์๋ค.
'๐๏ธํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ธ์ฝ์ค > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [๋ฐ๋ธ์ฝ์ค] book store 2 (0) | 2025.06.23 |
|---|---|
| [๋ฐ๋ธ์ฝ์ค] React-Task-App: configureStore ์ฌ์ธต ๋ถ์ ๋ฐ ์ปดํฌ๋ํธ ๊ตฌํ ๊ณผ์ ์์์ ํ์ ํ์ฉ ์ ๋ฆฌ (0) | 2025.06.21 |
| [๋ฐ๋ธ์ฝ์ค] Redux (2) | 2025.06.16 |
| [๋ฐ๋ธ์ฝ์ค] React ๊ธฐ์ด ํต์ฌ ์ ๋ฆฌ(state, ๊ตฌ์กฐ ๋ถํด ํ ๋น, ์ปดํฌ๋ํธ ๋ฐ๋ณต) (2) | 2025.06.15 |
| [๋ฐ๋ธ์ฝ์ค] React์ JSX, UI ํจ๋ฌ๋ค์์ ์ ํ (1) | 2025.06.14 |