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

2024. 2. 22. 23:03ยท๐Ÿชด React
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

'๐Ÿชด React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] React-Query(aka. Tanstack-Query)  (0) 2024.02.23
[React] json-server์˜ ์ƒˆ๋กญ๊ฒŒ ๋ฐ”๋€ sort-order ๋ฐฉ์‹ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์š”์ฒญ ( - ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ)  (0) 2024.02.23
[React/Vite] ์—๋Ÿฌํ•ด๊ฒฐ: Vite ํ”„๋กœ์ ํŠธ .env ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” process.env => import.meta.env๋กœ ์จ์ฃผ๊ธฐ  (0) 2024.02.21
[React] ๋น„๋™๊ธฐ ํ†ต์‹  - axios  (0) 2024.02.20
[React] ๋น„๋™๊ธฐ ํ†ต์‹  - fetch (+ axios์— ๋น„ํ•ด ๋ถˆํŽธํ•œ ์ )  (0) 2024.02.19
'๐Ÿชด React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [React] React-Query(aka. Tanstack-Query)
  • [React] json-server์˜ ์ƒˆ๋กญ๊ฒŒ ๋ฐ”๋€ sort-order ๋ฐฉ์‹ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์š”์ฒญ ( - ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ)
  • [React/Vite] ์—๋Ÿฌํ•ด๊ฒฐ: Vite ํ”„๋กœ์ ํŠธ .env ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” process.env => import.meta.env๋กœ ์จ์ฃผ๊ธฐ
  • [React] ๋น„๋™๊ธฐ ํ†ต์‹  - axios
๋ จ๋””
๋ จ๋””
FE - ๊ฐœ๋ฐœ ๊ณต๋ถ€์˜ ๊ธฐ๋ก
  • ๋ จ๋””
    Ryeon's Devstory
    ๋ จ๋””
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (69)
      • ๐Ÿชด JavaScript & TypeScript (11)
        • ๐Ÿงฉ Algorithm (6)
      • ๐Ÿชด React (12)
      • ๐Ÿชด Next.js (8)
      • ๐Ÿชด HTML & CSS (2)
      • ๐Ÿชด DB & BaaS (5)
      • ๐Ÿชด Git &Github (0)
      • โœ๏ธ ํ”„๋กœ์ ํŠธ ๊ณผ์ • & ํšŒ๊ณ  (18)
      • โœ๏ธ Today what I Learned _T.. (11)
      • ๐Ÿ•Š๏ธ IT ์•„ํ‹ฐํด (0)
      • etc. (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • My Github ๐Ÿ˜บ
    • ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ ๐ŸŽต๐ŸŽง (์ผ์ƒ,์Œ์•… ๋“ฑ)
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    fetch
    json-server
    Array.filter
    State
    BAAS
    ๋ฆฌ์•กํŠธ์ฟผ๋ฆฌ
    ์˜์กด์„ฑ๋ฐฐ์—ด
    ๋ Œ๋”๋งํŒจํ„ด
    props
    ์˜ค๋ธ”์™„
    useEffect
    ๋น„๋™๊ธฐํ†ต์‹ 
    react
    route handler
    ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
    Next.js
    NVM
    ์—๋Ÿฌ
    axios
    Vite
    ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ
    tailwind
    useMutation
    ์›น๊ฐœ๋ฐœ ๊ธฐ์ดˆ
    ์ปดํฌ๋„ŒํŠธ๋ถ„๋ฆฌ
    reacthook
    reactquery
    Supabase
    ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
    ํ‹ฐ์Šคํ† ๋ฆฌ๋ธ”๋กœ๊ทธ์Šคํ‚จ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
๋ จ๋””
[React] ๊ฐœ์ธํ”„์  ์—๋Ÿฌ : VITE ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ์ฃผ์˜ & ๋ฆฌ๋•์Šค ๋ชจ๋“ˆ์—์„œ state๋กœ ์œ„์น˜ ์ž˜ ์“ฐ๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”