๐Ÿš€ React & Redux์—์„œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ดํ•ดํ•˜๊ธฐ

๋‘๋ถ€๋งยท2025๋…„ 3์›” 16์ผ

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
19/24

๐Ÿ‘‰ Redux์—์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ, ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ด์ „ ๊ฐ’์ด ๋ณด์ด๋Š” ์ด์œ ๋ฅผ ์ •๋ฆฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

๐ŸŽฏ 1. useEffect๋Š” ์–ธ์ œ ์‹คํ–‰๋ ๊นŒ?

  • useEffect๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ ์‹คํ–‰๋ผ์š”.
    ๊ทธ๋ฆฌ๊ณ  ์˜์กด์„ฑ ๋ฐฐ์—ด(์˜ˆ: [userInfo])์— ์žˆ๋Š” ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋ผ์š”.
    ๋งŒ์•ฝ ์ž˜๋ชป๋œ ์˜์กด์„ฑ์„ ๋„ฃ์œผ๋ฉด, ๋ถˆํ•„์š”ํ•œ ์‹คํ–‰์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์–ด์š”!
useEffect(() => {
    console.log("์ด ์ฝ”๋“œ๋Š” ์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋จ!");
}, []);  // โœ… ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋นˆ ๋ฐฐ์—ด([])๋กœ ์„ค์ •ํ•˜๋ฉด ์ตœ์ดˆ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋จ!

๋ Œ๋Ÿฌ๋”ฉ?

  • ๋ Œ๋”๋ง์ด๋ž€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML ํŒŒ์ผ์„ ๋ฐ›์•„ ๋ธŒ๋ผ์šฐ์ €์— ๋ฟŒ๋ ค์ฃผ๋Š” ๊ณผ์ •

๐ŸŽฏ 2. Redux ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋Š” ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค!

  • dispatch({ type: "USER_INFO", payload: null })์„ ์‹คํ–‰ํ•ด๋„,
    console.log(userInfo);๋ฅผ ๋ฐ”๋กœ ์ฐ์œผ๋ฉด ์ด์ „ ๊ฐ’์ด ๋ณด์ผ ์ˆ˜๋„ ์žˆ์–ด์š”! ๐Ÿ˜ตโ€๐Ÿ’ซ

๐Ÿ’ก ์™œ?

Redux์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์€ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ , ๋‹ค์Œ ๋ Œ๋”๋ง ๋•Œ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์—์š”!
React๋Š” ๋ Œ๋”๋ง์ด ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„์š”!

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

useEffect(() => {
    console.log("userInfo ๋ณ€๊ฒฝ๋จ:", userInfo);
}, [userInfo]);  // โœ… ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ ํ›„ ์‹คํ–‰๋˜๋„๋ก ํ•จ!

setTimout

  • ๋กœ๊ทธ์ธ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ํ›„์— ์‹คํ–‰ํ•  ํ•จ์ˆ˜ ๋“ฑ๋ก
dispatch({ type: "USER_INFO", payload: null });

setTimeout(() => {
    console.log(userInfo);  // โœ… ์ด์ œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ์ถœ๋ ฅ๋จ, ์ฆ‰์‹œ ํ˜ธ์ถœ
}, 0);

๐ŸŽฏ 3. localStorage, Redux, useEffect์˜ ๊ด€๊ณ„ ์ดํ•ดํ•˜๊ธฐ

  • localStorage๋Š” ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ
    Redux๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ €์žฅ์†Œ
    useEffect๋Š” localStorage์—์„œ ํ† ํฐ์„ ๊ฐ€์ ธ์™€์„œ Redux์— userInfo๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์—ญํ• 

๐Ÿ‘‰ ์ด ์„ธ ๊ฐœ๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ถˆํ•„์š”ํ•œ ์‹คํ–‰์„ ๋ง‰๋Š” ๊ฒƒ์ด ์ค‘์š”!

์—ฌ๊ธฐ์„œ ๋ฐ‘์— userInfo ๋ฅผ ๋ฐฐ์—ด ์•ˆ์— ์ž‘์„ฑํ•˜๋ฉด userInfo ๊ฐ€ 2๋ฒˆ ์‹คํ–‰์ˆ˜์ •๋˜๋ฉด์„œ 2๋ฒˆ ๋กœ๊ทธ์•„์›ƒ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

useEffect(() => {
    const token = localStorage.getItem("token");
    if (token) {
        axios.get("/ping", { headers: { Authorization: token } })
            .then(res => {
                dispatch({
                    type: "USER_INFO",
                    payload: { userName: "์‚ฌ์šฉ์ž", role: "admin" }
                });
            })
            .catch(err => {
                localStorage.removeItem("token");
                dispatch({ type: "USER_INFO", payload: null });
            });
    }
}, []);  // โœ… ๋ถˆํ•„์š”ํ•œ ์‹คํ–‰์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋นˆ ๋ฐฐ์—ด([]) ์‚ฌ์šฉ

๐ŸŽฏ ๊ฒฐ๋ก : Redux ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋‹ค๋ฃฐ ๋•Œ ๊ธฐ์–ตํ•ด์•ผ ํ•  3๊ฐ€์ง€!

1๏ธโƒฃ useEffect๋Š” ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋ฏ€๋กœ, ๋ถˆํ•„์š”ํ•œ ์‹คํ–‰์„ ๋ง‰์•„์•ผ ํ•œ๋‹ค!
2๏ธโƒฃ Redux ์ƒํƒœ ๋ณ€๊ฒฝ์€ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, useEffect๋‚˜ setTimeout์„ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค!
3๏ธโƒฃ localStorage, Redux, useEffect๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ๋ฏ€๋กœ, ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค!

์ด ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด React ์ƒํƒœ ๊ด€๋ฆฌ์™€ Redux ํ๋ฆ„์„ ๋” ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿš€๐Ÿ”ฅ

profile
ํ•˜์ดํ•˜์ž‰

0๊ฐœ์˜ ๋Œ“๊ธ€