2.22
ํด๊ฒฐํ๊ณ ๋ณด๋ ์ ๋ง ๊ฐ๋ฒผ์ด ์๋ฌ์์ง๋ง .. ์ฐพ๋๋ผ ๋๋ฌด ์ค๋๊ฑธ๋ ธ๋ค .. ใ ใ
๋ฆฌ๋์ค ํดํท, axios - json-server api , thunk ํจ์ ๊น์ง ๊ฐ์ด ์ฐ๋ ค๋ค๋ณด๋
์ ํํ ์ ๋ชจ๋ฅด๋ ๋๋ ..
๋ค๋ฅธ ๋ฐ์์ ์๋ฌ๊ฐ ๋ ์ค ์๊ณ ํ์ฐธ์ ํค๋งธ๋ค ๐ญ
์ฝ์๋ก ์ผ์ผํ ํ๋ํ๋ ์ฐ์ด๊ฐ๋ฉฐ ๋ค์ ์๋ฌ๋ฅผ ํ์ ..
ํ์ง๋ง ์ด ์ฐธ์ useSelector ๋ก state ๋ถ๋ฌ์ฌ ๋๋ผ๋ ๊ฐ ์ ํํ ์๊ฒ ๋๋ค !!
// CommentList.jsx
const commentList = useSelector((state) => state.comments.commentsData);
..
useEffect(() => {
dispatch(__getComments());
}, [dispatch]);
๐ฅProblem
๋ฆฌ๋์คํดํท์ผ๋ก commentListSlice.js ๋ชจ๋์ ๋ง๋ค๊ณ ,
commentList ๋ฅผ ๋ฉ์ธํ์ด์ง์ ๋ถ๋ฌ์์ ๋จ๊ฒ ํ๊ณ ์ถ์๋๋ฐ, (json-server์ db.json์์)
useSelector ๋ฅผ ์จ์ ๊ฐ์ ธ์ค๋ ค๊ณ ํ๋... commentList ๋ชฉ๋ก์ด ๋จ์ง์๋ ๋ฌธ์ ๊ฐ ์์๋ค.
useEffect - ์์์ dispatch์ ๋ฌธ์ ์ธ๊ฐ ์ถ์์ง๋ง, ์ผ๋จ commentList ๊ฐ ๋ค์ด์ค์ง ์๋ ๊ฒ.
console.log(commentList) ๋ก ํ์ธํด๋ณด๋ ๋น ๋ฐฐ์ด๋ก [ ] ๋จ๊ฑฐ๋, ์์ ์ด์ํ๊ฒ ๋จ๊ฑฐ๋ ..(์ฌ htmlํ์ผ๊ฐ์) ๋ฑ๋ฑ ๋ฌธ์ ๊ฐ ์ฒจ์ ์์๋ค.
๐ช Solving โจ
1) vite ํ๊ฒฝ๋ณ์ ๋ฌธ์
์ฒจ์ ์์ ์ด์ํ๊ฒ ๋ด๋ ๊ฒ์, .env ํ์ผ์ json-server url ๋ณ์๋ฅผ ์ค์ ํด api์์ ์ผ๋๋ฐ..,
๊ทธ๊ฒ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๊ฑฐ์๋ค. ...
.env ํ๊ฒฝ๋ณ์๋ (CRA ํ๋ก์ ํธ์์) process.env.๋ณ์๋ช ๋ฐฉ์์ผ๋ก ๊ฐ์ ธ์์ ์จ์ผ ํ๋ค๊ณ ํ์ง๋ง,
์์ ์ผ๋ฏ์ด vite ์ฌ์ฉ ์๋ผ๋ฉด ์๊ธฐ๊ฐ ๋ค๋ฅด๋ค
๊ทธ๋์ import.meta.env.๋ณ์๋ช ์ด๋ ๊ฒ ์จ์คฌ๋ ๊ฒ์ธ๋ฐ ..(๊ทธ๋ฆฌ๊ณ ๋น์ ํ๋ฉด์ด ์ ๋ด๋ ๊ฑธ๋ก ๊ธฐ์ต. ๊ทธ๋์ ํด๊ฒฐ๋๋ค๊ณ ์๊ฐํ๋ค..) ใ ใ ์ด๊ฒ ์๋๋ค ..
ํํผ ์ ๋ ๊ฒ ๋ณ์๊ฐ์ ธ์์ commentList ์ฝ์๋ก ์ฐ์ผ๋ฉด
์ด๋ฐ ์์ผ๋ก html๋ฌธ์๊ฐ ๋ฌ๋ค ...
why...???
=> ๊ทผ๋ฐ.. ์ ๋ฒ ๊ฒ์๊ธ์์๋ ๋ด๊ฐ ๋นผ๋จน์ ๊ฒ ์์๋ค. ..
Vite ํ์ ํ๊ฒฝ๋ณ์ ์ค์ ์, ๋ฐ๋์ ๋ณ์๋ช ์ VITE_๋ก ์์ํด์ผํ๋ค !!! ๋ ์ ..
๊ทผ๋ฐ ๋๋ REACT_.. ๋ก ์จ์ค ใ ใ
์ด๊ฑด ์๋ ๊ฒ์๊ธ์ ๋ด์ฉ ์ถ๊ฐํ๊ธฐ๋ก!
2) ๋ฆฌ๋์ค ๋ชจ๋์์ state ๋ก ๊ฐ์ ธ์ค๋ ๊ฐ ์๋ชป ์ด ๋ฌธ์
ํ์ง๋ง ๊ทธ๋ผ์๋ ํ๋ฆฌ์ง ์๋ ๋ฌธ์ . .. commentList ๋ ์ด์ ์์ ์ฒ๋ผ htmlํ์ผ๋ก ๋จ๋ ์ผ์ ์์์ง๋ง, ๋น ๋ฐฐ์ด๋ก ๋ด๋ค.
์ฒ์์ commentList ๊ฐ ๊ฐ์ ธ์์ง์ง ๋ชปํ๋ ๊ฑด useSelector์์์ ๋ฌธ์ ์ผ ์ ์์๋ค.
ํ์ง๋ง ํ์ธํด๋ดค์ง๋ง ๋ง์์.
useSelector((state) => state.comments.commentsData) ์์ ์คํ๋ ์์๊ณ ,
์ฌ๊ธฐ์ comments ๋
// configStore.js
const store = configureStore({
reducer: {
comments,
member,
auth,
},
});
์ด๋ ๊ฒ configStore.js ์์ ์จ์ค store ๋ณ์์ ๋ค์ด๊ฐ ์๋ comments ๋ฅผ ์จ์ค ๊ฒ
์๋ ์ฝ๋๋ ๋ฆฌ๋์ค ๋ชจ๋ commentListSlice.js
๊ทธ๋ฆฌ๊ณ ๊ทธ comments ์ initialState ๊ฐ์ฒด์์ commentsData ํค์ ๋ํ ๋ฐธ๋ฅ๊ฐ [] ๋ฐฐ์ด์ ๊ฐ์ ธ์ค๋ ๊ฒ ๋ง์๊ธฐ ๋๋ฌธ์
// commentListSlice.js
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
import {
createComment,
getCommentsFromDB,
updateComment,
} from "../../api/comment-api";
// thunk ๋ฅผ ํตํด, comment-api (json-server DB ํ์ฉ)์ ์ฐ๊ฒฐ์ํค๊ธฐ?
export const __getComments = createAsyncThunk(
"comment/getComments",
async (payload, thunkAPI) => {
try {
// try-catch๋ฌธ๋ ํฌํจ์ํด
const comments = await getCommentsFromDB(); // comments๋ ๋ฐฐ์ด
return comments; // ๋ฆฌ๋์๋ก ๋๊ฒจ์ฃผ๊ธฐ
} catch (err) {
return thunkAPI.rejectWithValue(err); // ์ด๋ ๊ฒ ์จ์ฃผ๋ฉด(๋ฌธ๋ฒ), err์๋ฌ๊ฐ์ฒด๊ฐ extraReducers๋ก ์๋์ผ๋ก ๋์ด๊ฐ (๊ฑฐ๊ธฐ์์ฐ๋ state.erorr๋ก)
}
}
);
....์๋ต
const commentListSlice = createSlice({
name: "comment",
initialState: {
commentsData: [], // ์ด ๋ถ๋ถ !!!!
isLoading: true, // json-server api ์์ฒญ (thunk๋ก?) ํ ๋ฐ์ ์๋ต๊ฐ์ ๋ฐ๋ผ ๋ฐ๋๋ค
isError: false,
error: null,
},
reducers: {
},
extraReducers: (builder) => {
builder
.addCase(__getComments.fulfilled, (state, action) => {
// comments(๋ฐฐ์ด)๋ฅผ action.payload๋ก ๋๊ฒจ๋ฐ์
state.commentsData = action.payload; // ์ฌ๊ธฐ์ state.comments.commentsData ์จ์ ๋ฌธ์ ๋ฐ์
})
...
},
});
export default commentListSlice.reducer;
์ฌ๊ธฐ ์ฝ๋์๋ ๋ง๊ฒ ์์ ๋์ด์๋๋ฐ.. extraReducers ์์ - __getComments thunk case ์จ์ค ๋,
state.comments.commentsData ๋ผ๊ณ ์จ์ ์ ๋ฌ ๊ฑฐ์๋ค.
=>
๋ฆฌ์คํธ.jsx์์, useSelector ํด์ค ๋๋ ์์ฒ๋ผ ์ฐ๋๊ฒ ๋ง๊ฒ ๋ถ๋ฌ์ค๋ ๊ฒ์ด์ง๋ง, (๋ฆฌ๋์ค store ํตํด comments-> ...)
์์ ๋ชจ๋ Slice ์์์๋ state.commentsData ๋ก ๋ฐ๋ก ์ ๊ทผํด์ฃผ๋ ๊ฒ ๋ง๋ค
์ด์จ๋ ์ด๊ฑฐ ์ฐพ๋๋ผ๊ณ axios api ๋ถํฐ ๋ค ์ฝ์ ์ฐ๊ณ ํ์ธํด๋ดค์๋ค .. ใ ใ
๊ทธ๋๋ ์ฝ์์ ํตํด ์๋ฌ๋ฅผ ์ ์ฐพ์ ๋คํ !