๐ŸŽ‰ ์•„๋ฌด๋„ ์•ˆ ์•Œ๋ ค์ค€ useEffect ๋‘ ๋ฒˆ ํ˜ธ์ถœ์˜ ๋น„๋ฐ€ ๐Ÿš€๐Ÿ˜Ž

๊น€๋™ํ˜ยท2025๋…„ 5์›” 15์ผ
11

๋ฆฌ์—‘ํŠธ ๋ฌธ๋ฒ•

๋ชฉ๋ก ๋ณด๊ธฐ
10/10
post-thumbnail

"์ €์žฅ ๋ฒ„ํŠผ ๋ˆŒ๋ €๋Š”๋ฐ ์™œ Toast ์•Œ๋ฆผ์ด ๋‘ ๋ฒˆ ๋œจ์ง€? ๐Ÿ˜ฑ ๋‚ด ์ฝ”๋“œ๊ฐ€ ์ด์ƒํ•œ๊ฐ€?"

๋ฆฌ์•กํŠธ ํ•˜๋ฉด์„œ ํ•œ ๋ฒˆ์ฏค์€ ๊ฒช์–ด๋ดค์„ ๊ฑฐ์•ผ.
๊ทผ๋ฐ ์‚ฌ์‹ค ์ด๊ฑด ๋„ค ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒŒ ์•„๋‹ˆ์•ผ! โœ‹โœจ


๐Ÿง ๋ฌด์Šจ ์ผ์ด ์ƒ๊ธด ๊ฑธ๊นŒ? (์ƒํ™ฉ ์žฌํ˜„)

useEffect(() => {
  console.log("๐Ÿ”ฅ useEffect ์‹คํ–‰๋จ!");
}, []);
  • ๊ธฐ๋Œ€ ๐Ÿ‘‰ "ํ•œ ๋ฒˆ๋งŒ ์ฐํžˆ๊ฒ ์ง€?"
  • ํ˜„์‹ค(๊ฐœ๋ฐœ๋ชจ๋“œ) ๐Ÿ‘‰ ๋‘ ๋ฒˆ ์ถœ๋ ฅ ๐Ÿ˜ต
๐Ÿ”ฅ useEffect ์‹คํ–‰๋จ!
๐Ÿ”ฅ useEffect ์‹คํ–‰๋จ!

๐Ÿค” "ํ˜น์‹œ ๋‚ด๊ฐ€ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์ž˜๋ชป ์ดํ•ดํ–ˆ๋‚˜...?"


๐ŸŽฏ ์ง„์งœ ๋ฒ”์ธ์€? ๋ฐ”๋กœ React.StrictMode ๐ŸŽญโœจ

๋ฆฌ์•กํŠธ์˜ StrictMode๋Š” ๋„ˆ์˜ ์ฝ”๋“œ๋ฅผ ๋‘ ๋ฒˆ ๋Œ๋ฆฌ๋ฉด์„œ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์ฐฉํ•œ ์นœ๊ตฌ์•ผ!

StrictMode๊ฐ€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์™œ ๋‘ ๋ฒˆ์”ฉ์ด๋‚˜? ๐Ÿค”
โœ… ์ž ์žฌ์ ์ธ ๋ถ€์ž‘์šฉ(Side Effect)ํ•œ ๋ฒˆ ๋Œ๋ฆฌ๊ณ  ์–ธ๋งˆ์šดํŠธ โ†’ ๋‹ค์‹œ ๋งˆ์šดํŠธ ํ•ด์„œ ๋ฌธ์ œ ์ฐพ๊ธฐ
โœ… ์˜ค๋ž˜๋œ(๋ ˆ๊ฑฐ์‹œ) API ์‚ฌ์šฉ ๊ฒฝ๊ณ ์ฝ”๋“œ ์•ˆ์ „์„ฑ ๋ณด์žฅ

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ๋ฆฌ์•กํŠธ๊ฐ€ ๋„ˆ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‘ ๋ฒˆ์˜ ๋ฆฌํ—ˆ์„ค ๊ณต์—ฐ์œผ๋กœ ์•ˆ์ „์„ฑ์„ ์ฒดํฌํ•˜๋Š” ๊ฑฐ์•ผ!


๐Ÿงช ํ”ํ•œ ์˜ˆ์ œ (Toast ์•Œ๋ฆผ ๋‘ ๋ฒˆ ๋œจ๋Š” ๋ฌธ์ œ)

function SaveButton() {
  const [saved, setSaved] = useState(false);

  useEffect(() => {
    if (saved) {
      toast("โœ… ์ €์žฅ ์™„๋ฃŒ!");
    }
  }, [saved]);

  const handleSave = () => setSaved(true);

  return <button onClick={handleSave}>์ €์žฅํ•˜๊ธฐ</button>;
}

๐Ÿ‘‰ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„  Toast ์•Œ๋ฆผ์ด ๋‘ ๋ฒˆ ๋œจ๋Š” ํ˜„์ƒ์ด ์ƒ๊น€! ๐Ÿ˜ฑ

๐Ÿ‘‰ ํ•˜์ง€๋งŒ ์‹ค์ œ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„  ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ๋œจ๋‹ˆ ์•ˆ์‹ฌํ•ด๋„ ๋ผ!


๐ŸŒ StrictMode๋ฅผ ์จ์•ผ ํ•˜๋Š” ์ด์œ  (์ด๊ฑด ๋ชฐ๋ž์ง€?)

๐Ÿ˜ฑ StrictMode ์—†์œผ๋ฉด ์ƒ๊ธฐ๋Š” ์ผ:

  • ์˜ˆ์ƒ ๋ชปํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ๋ฌดํ•œ API ํ˜ธ์ถœ ๋ฃจํ”„ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ์„œ๋น„์Šค ๋Ÿฐ์นญ ํ›„ ๊ฐ‘์ž๊ธฐ ํ„ฐ์ง€๋Š” ๋ฒ„๊ทธ ๐Ÿ”ฅ

๐Ÿ˜ StrictMode ์“ฐ๋ฉด ์ข‹์€ ์ :

  • ๋ฐฐํฌ ์ „ ์ž ์žฌ ๋ฒ„๊ทธ ๋ฏธ๋ฆฌ ์ฐจ๋‹จ!
  • ์ฝ”๋“œ์˜ ํ’ˆ์งˆ๊ณผ ์•ˆ์ •์„ฑ UP!
  • ํŒ€์› ๊ฐ„ ์ฝ”๋“œ ์‹ ๋ขฐ๋„ ๋†’์•„์ง ๐Ÿ’ช

"StrictMode๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์•ˆ์ „๋ฒจํŠธ์•ผ!" ๐ŸŽ–๏ธโœจ


๐Ÿ’ก ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜์ง€? (ํ•„์ˆ˜ ๊ฟ€ํŒ โœจ)

ํ•ด๊ฒฐ๋ฒ•์„ค๋ช…์ถ”์ฒœ๋„
๐Ÿ˜Œ ๊ทธ๋ƒฅ ์ดํ•ดํ•˜๊ธฐ๋ฐฐํฌ์—์„  ์ •์ƒ ์ž‘๋™ํ•˜๋‹ˆ ๊ดœ์ฐฎ์•„!โญโญโญโญโญ
๐Ÿ™…โ€โ™‚๏ธ StrictMode ๋„๊ธฐ๋ฐ”๋กœ ๋ฌธ์ œ๋Š” ์‚ฌ๋ผ์ง. ํ•˜์ง€๋งŒ ์œ„ํ—˜โ†‘โญโญ
โœ… useEffect ์ •๋ฆฌํ•˜๊ธฐcleanup ํ•จ์ˆ˜์™€ useRef๋กœ ๋ช…ํ™•ํ•œ ์ƒํƒœ ๊ด€๋ฆฌโญโญโญโญ

๐Ÿ”ฅ ๊ฐ€์žฅ ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•: ๊ทธ๋ƒฅ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ๋ผ!

*โš ๏ธ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ”„๋กฌํ”„ํŠธ:*
Developer confidently smiling and giving thumbs-up in front of React logo, digital cartoon style


๐Ÿ™‹โ€โ™€๏ธ ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ Q\&A

Q1: ๊ฐœ๋ฐœ๋ชจ๋“œ ์„ฑ๋Šฅ์—” ์˜ํ–ฅ ์—†์–ด?

๐Ÿ‘‰ A: ์—†์–ด! StrictMode๋Š” ๋ฐฐํฌ ์‹œ ์ž๋™ ์ œ๊ฑฐ๋ผ.

Q2: API ํ˜ธ์ถœ๋„ ๋‘ ๋ฒˆ ๋˜๋‚˜์š”?

๐Ÿ‘‰ A: API๋„ ๋‘ ๋ฒˆ ๋œ๋‹ค๋ฉด ๋„ค ์ฝ”๋“œ์˜ ๋ฌธ์ œ์•ผ. useEffect์— cleanup ํ•จ์ˆ˜๋‚˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ž˜ ๊ด€๋ฆฌํ•ด์ค˜์•ผ ๋ผ!


โšก๏ธ ์‹ค์ „! useEffect ์ œ๋Œ€๋กœ ์“ฐ๋Š” ๋ฒ• (์ด๊ฑด ๊ผญ ์•Œ์•„๋‘์ž! ๐Ÿšจ)

๐Ÿ™…โ€โ™‚๏ธ ๋ฌดํ•œ๋ฃจํ”„ ๋‚˜์˜ค๋Š” ์ž˜๋ชป๋œ ์˜ˆ์‹œ:

useEffect(() => {
  fetchData();
}); // ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์—†์–ด ๋ฌดํ•œ๋ฃจํ”„ ๋ฐœ์ƒ!

โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ:

useEffect(() => {
  fetchData();
}, []); // ์ตœ์ดˆ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋จ

๐ŸŒŸ ๋”์šฑ ์™„๋ฒฝํ•œ ์˜ˆ์‹œ:

useEffect(() => {
  fetchData(userId);
}, [userId]); // userId ๋ฐ”๋€” ๋•Œ๋งŒ ์‹คํ–‰!

๐Ÿš€ Next.js์—์„œ StrictMode ์„ค์ •๋ฒ• (ํ•„๋…!)

// next.config.js
module.exports = {
  reactStrictMode: true, // ๊ฐœ๋ฐœํ•  ๋• ํ™œ์„ฑํ™”!
};
  • ๊ฐœ๋ฐœํ™˜๊ฒฝ ๐Ÿ‘: ํ™œ์„ฑํ™” ์ ๊ทน ์ถ”์ฒœ
  • ๋ฐฐํฌํ™˜๊ฒฝ ๐Ÿš€: ์ž๋™์œผ๋กœ ๋น„ํ™œ์„ฑํ™” (์„ฑ๋Šฅ ์™„๋ฒฝโœจ)

๐ŸŽ–๏ธ ์˜ค๋Š˜์˜ ์š”์•ฝ (์ฐ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์ž๋กœ ํ•œ๊ฑธ์Œ! ๐Ÿšถโ€โ™‚๏ธ๐Ÿ”ฅ)

  • useEffect ๋‘ ๋ฒˆ ํ˜ธ์ถœ์€ ๋ฆฌ์•กํŠธ์˜ ์•ˆ์ „์„ฑ ํ…Œ์ŠคํŠธ
  • ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋Š” ์ •์ƒ ์ž‘๋™ํ•˜๋‹ˆ๊นŒ ์•ˆ์‹ฌํ•˜์ž!
  • StrictMode๋ฅผ ํ†ตํ•ด ๋” ์•ˆ์ •์ ์ธ ์ฝ”๋“œ๋ฅผ ์“ฐ์ž!

โœจ ์•ž์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

โœ… ์ฝ˜์†” ๋‘ ๋ฒˆ ์ฐํ˜€๋„ ์ด์ œ ๋‹นํ™ฉ NO!
โœ… ์ฝ”๋“œ์˜ ๋ถ€์ž‘์šฉ์„ ๊ด€๋ฆฌํ•˜๋ฉฐ ์•ˆ์ •์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ!
โœ… Toast ๋‘ ๋ฒˆ ๋– ๋„ "๋ฆฌ์•กํŠธ๊ฐ€ ํ…Œ์ŠคํŠธ ์ค‘์ด๊ตฌ๋‚˜~๐Ÿ˜" ํ•˜๊ณ  ์ฟจํ•˜๊ฒŒ ๋„˜๊ธฐ๊ธฐ!


๐Ÿ’ฌ ๋„์›€์ด ๋๋‹ค๋ฉด?

  • ๐Ÿงก ์ข‹์•„์š” + ๋Œ“๊ธ€๋กœ ๊ฐœ๋ฐœ์ž ๋™๋ฃŒ์—๊ฒŒ ๊ณต์œ ํ•ด์ค˜!
  • ๐Ÿ“Œ ๋ฒจ๋กœ๊ทธ์— ์ €์žฅํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋ณด๊ธฐ!

"๋‘ ๋ฒˆ ํ˜ธ์ถœ? ๋ฆฌ์•กํŠธ๊ฐ€ ๋‚˜๋ฅผ ๋„์™€์ฃผ๋Š”๊ตฌ๋‚˜!"
์ด์ œ ๋„ˆ๋„ ๋ฆฌ์•กํŠธ ์ž์‹ ๊ฐ ๋ฟœ๋ฟœ! ๐Ÿ˜Ž๐Ÿ”ฅ

profile
๐Ÿฑ ๋„์ฟ„์—์„œ ํ™œ๋™ ์ค‘์ธ ์›น ๊ฐœ๋ฐœ์ž ๐Ÿ‡ฏ๐Ÿ‡ต๐Ÿ’ป ๐Ÿง‘โ€๐Ÿ’ป ์ตœ๊ทผ์—๋Š” ์š”์ฆ˜IT์—์„œ ์ž‘๊ฐ€๋กœ๋„ ํ™œ๋™ ์ค‘์ž…๋‹ˆ๋‹ค! ๐Ÿ“ ์š”์ฆ˜IT ๊ธ€ ๋ชจ์Œ: https://yozm.wishket.com/magazine/@donghyuk65/

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

comment-user-thumbnail
2025๋…„ 8์›” 31์ผ

์–ด? ์™œ ๋‘๋ฒˆ์‹คํ–‰๋˜์ง€? ์ผ๋‹จ ํ”Œ๋ž˜๊ทธ ๋„ฃ์–ด์„œ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ฒŒ ํ•˜์ž! ๋ผ๋Š” ๋ถˆ์ƒ์‚ฌ๋ฅผ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ• ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธ€์ด๊ตฐ์š”.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ