๐Ÿชด React

[React] ๊ฐœ์ธํ”„์  ์—๋Ÿฌ : VITE ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ์ฃผ์˜ & ๋ฆฌ๋•์Šค ๋ชจ๋“ˆ์—์„œ state๋กœ ์œ„์น˜ ์ž˜ ์“ฐ๊ธฐ

๋ จ๋”” 2024. 2. 22. 23:03
SMALL

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.๋ณ€์ˆ˜๋ช…  ๋ฐฉ์‹์œผ๋กœ ๊ฐ€์ ธ์™€์„œ ์จ์•ผ ํ•œ๋‹ค๊ณ  ํ•˜์ง€๋งŒ,

์ €๋ฒˆ ๊ธ€ ([React/Vite] ์—๋Ÿฌํ•ด๊ฒฐ: Vite ํ”„๋กœ์ ํŠธ .env ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” process.env => import.meta.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 ๋ถ€ํ„ฐ ๋‹ค ์ฝ˜์†” ์ฐ๊ณ  ํ™•์ธํ•ด๋ดค์—ˆ๋‹ค .. ใ… ใ… 

 

๊ทธ๋ž˜๋„ ์ฝ˜์†”์„ ํ†ตํ•ด ์—๋Ÿฌ๋ฅผ ์ž˜ ์ฐพ์•„ ๋‹คํ–‰ !

SMALL