๐Ÿ“… Weekly Paper - (React 2)

๊น€ํ˜„์šฐยท2024๋…„ 7์›” 25์ผ
0

Codeit

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

๐Ÿ“… ์ฃผ๊ฐ„ ํ˜„ํ™ฉ ๋ณด๊ณ 

1-0. ์ž‘์„ฑ ๋ชฉ์  ๋ฐ ๋ชฉ์ฐจ

์ด๋ฒˆ 5์ฃผ์ฐจ Weekly Paper ์—์„œ๋Š”

  1. ์ด๋ฒˆ์ฃผ ๊ฐ•์˜ ํ›„๊ธฐ ๋ฐ ์Šค์Šค๋กœ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ
  2. useMemo, useCallback ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ , ์–ด๋–ค ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€, ๋‚จ์šฉํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ .
  3. ๋ฆฌ์•กํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ(life cycle)
  4. React์—์„œ ๋ฐฐ์—ด์„ ๋ Œ๋”๋งํ•  ๋•Œ key๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์™€ key ์„ค์ • ์‹œ ์ฃผ์˜ํ•  ์ 

์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค


1-1. ๊ฐ•์˜ ํ›„

์ด๋ฒˆ์ฃผ๋Š” ๋“œ๋””์–ด React๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค!

ํ˜„์žฌ๊นŒ์ง€ useState, useEffect ํ›…, ๋น„๋™๊ธฐ์ ์ธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋ฉ”์ปค๋‹ˆ์ฆ˜, ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ,
์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ ์š”์†Œ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋‹, ์„œ๋ฒ„์š”์ฒญํ›„ ๋ฐ›์€์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ์จ์•ผํ•˜๋‚˜.. ๋“ฑ๋“ฑ๋“ฑ.. ์ด๋ž˜์ €๋ž˜ ๋ฐฐ์› ๊ณ 

์ž˜ ๋ชจ๋ฅด์ง€๋งŒ
๋ฆฌ์•กํŠธ๊ฐ€ ์ง„์งœ ํŽธํ•˜๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›๊ธดํ–ˆ๋‹ค..

๊ทผ๋ฐ CSS๋Š”? ์ด๊ฑฐ ๋ง์ด์•ˆ๋œ๋‹ค..
๊ทธ๋ƒฅ ์˜ˆ์ƒ์ด์•ˆ๋จ..

์•”ํŠผ ์•ž์œผ๋กœ๋„ ๋” ๋งŽ์ด ๋ฐฐ์šฐ๊ณ ์‹ถ๋‹ค! ์žฌ๋ฐŒ๊ธฐ๋„ํ•˜๊ณ 


1-2. ์ฃผ๊ฐ„ ์‹ค์Šต

Folders

๋ญ”๊ฐ€ ํด๋”๊ตฌ์กฐ๊ฐ™์€๊ฑฐ ์งœ๋Š”๊ฒŒ ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜๋‹ค,
์ง๊ด€์ ์ธ ์ด๋ฆ„์ง“๋Š”๊ฒƒ๋„ ์–ด๋ ต๋‹ค;;
๋ญ๊ฐ€ ๋ณ„๋กœ ์—†์–ด์„œ ๊ทธ๋Ÿฐ๊ฐ€?

๋ Œ๋”๋ง ๊ณผ์ •์ค‘ UI๋ฐฑ์—”๋“œ๊ฐ€ ๋‹ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์— ๋ญ”๊ฐ€๋ฅผ ๋””์ž์ธ ํ• ์ˆ˜๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„
Optionํƒœ๊ทธ์— CSS๋จน์ธ๋‹ค๊ณ  ํ—›์ง“๊ฑฐ๋ฆฌํ•˜๋ฉด์„œ ์ง์ ‘์ ์œผ๋กœ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋ญ์•ผ? ๋ญ์•ผ? ํ•˜๋‹ค๊ฐ€ ๊ทธ๋ƒฅ ๋”ฐ๋กœ ๋“œ๋กญ๋‹ค์šด๋ฉ”๋‰ด ๊ตฌํ˜„ํ–ˆ๋‹ค..

(์ „์— ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ • ๊ณต๋ถ€ํ• ๋•Œ ๋ถ„๋ช… ๋ฐฐ์› ๋Š”๋ฐ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•จ;;)

๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ์•ˆ์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ๊ณ  ๊ทธ์•ˆ์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ์œผ๋ฉด prop์ „๋‹ฌํ•˜๊ธฐ๊ฐ€
๋งค์šฐ ๊ท€์ฐฎ๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•˜๋‹ค
(๋‚˜์ค‘์— ์ƒํƒœ๊ด€๋ฆฌ์ž ๋ฐฐ์šฐ๋ฉด ํŽธํ•ด์ง„๋‹ค๊ณ ๋Š” ํ•œ๋‹ค)


2. useMemo์™€ useCallback

2-1 useMemo

useMemo๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’์„ ๋ฐ˜ํ•˜๋Š” ํ›…์ด๋‹ค.

์ด ํ›…์€ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ›๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฐ›๋Š”๋‹ค.

const memoizedValue = useMemo(() => {
  // ์œผ์—„~์ฒญ ๋ณต์žกํ•œ ๊ณ„์‚ฐ (์ฝ”์ŠคํŠธ๊ฐ€ ๋†’์€ ํ•จ์ˆ˜)
  return computeExpensiveValue(a, b);
}, [a, b]);

์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’์ด ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜๋Š”๋ฐ.

๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.


2-2 useCallback

useCallback์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด ํ›…์€ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ›๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฐ›๋Š”๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•จ!

import React, { useCallback } from 'react';

const MyComponent = ({ a, b }) => {
  const handleClick = useCallback(() => {
    console.log(a, b);
  }, [a, b]);

  return <button onClick={handleClick}>Click me</button>;
};

handleClick ํ•จ์ˆ˜๋ฅผ onClick ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ
a์™€ b๋ฅผ ์˜์กด์„ฑ๋ฐฐ์—ด๋กœ ๋’€๊ธฐ๋•Œ๋ฌธ์—,
ํ•ด๋‹น ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”์ด์ƒ์€ ๊ณ„์†ํ•ด์„œ ๊ฐ™์€ ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ถœ๋ ฅํ•˜๋Š”๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋ผ๋ฉด ๊ณ„์† ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด๋‚ด์ง€๋งŒ, ์บ์‹ฑํ•ด๋‘” ๋™์ผ ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์ถœ๋ ฅํ•˜๋Š”ํ˜•ํƒœ๋กœ

๋ณด๋‹ค ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋„์›€์„ ์ค€๋‹ค!


2-3 ๋‚จ์šฉ ์‹œ ๋ฌธ์ œ์ 

useMemo์™€ useCallback์„ ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ž์ฒด๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ํ•จ์ˆ˜๋‚˜ ๊ฐ’์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•  ํ•„์š”๋Š” ์—†๋Š”๊ฒƒ.

์†์ต์„ ์ž˜ ๋น„๊ตํ•ด์„œ ์–ด๋Š์ชฝ์ด ๋‚ซ๊ฒ ๋‹ค~ ์‹ถ๊ณ ,
"์ด๊ฑด ์ข€ ํ•„์š”ํ•˜๊ฒ ๋Š”๋ฐ" ์‹ถ์€ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


3. ๋ฆฌ์•กํŠธ ์ƒ๋ช…์ฃผ๊ธฐ(Life Cycle)

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ํฌ๊ฒŒ ์„ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰œ๋‹ค

๋งˆ์šดํŒ…(Mounting)
์—…๋ฐ์ดํŠธ(Updating)
์–ธ๋งˆ์šดํŒ…(Unmounting)

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ
"์–ด๋–ค๋‹จ๊ณ„์—์„œ๋Š” ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค" ๋ผ๋Š”๊ฒŒ ์กด์žฌํ•˜์ง€๋งŒ.

์—…๋ฐ์ดํŠธ๋œ ํ›…๋“ค๋กœ ์ธํ•ด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋”์šฑ ๊ฐ•๋ ฅํ•ด์ง€๊ณ , ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง€๋ฉด์„œ ์š”์ฆ˜์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›… ๊ธฐ๋ฐ˜ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ๋“ค์ด ์ง„ํ–‰๋˜๋Š” ๋Š๋‚Œ์ด๋‹ค.


3-1 ๋งˆ์šดํŒ…(Mounting)

๋งˆ์šดํŠธ(mount)๋Š” React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ DOM์— ์‚ฝ์ž…๋˜์–ด ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ดˆ๊ธฐ ๋ Œ๋”๋ง์„ ํ†ตํ•ด ์‹ค์ œ DOM์— ๋ฐ˜์˜๋˜๋Š” ์‹œ์ 

์–ด๋–ค๊ฒฝ์šฐ๊ฐ€ ์žˆ์„๊นŒ?

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘

React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ฒ˜์Œ ์‹œ์ž‘๋  ๋•Œ, ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ(๋ณดํ†ต App ์ปดํฌ๋„ŒํŠธ)๊ฐ€ ๋งˆ์šดํŠธ๋œ๋‹ค

๋ผ์šฐํŒ… ๋ณ€๊ฒฝ

์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๋ผ์šฐํ„ฐ์˜ ๊ฒฝ๋กœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด
์ƒˆ๋กœ์šด ํŽ˜์ด์ง€์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋œ๋‹ค

์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์กฐ๊ฑด๋ถ€๋กœ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒฝ์šฐ
์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์–ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๋งˆ์šดํŠธ๋œ๋‹ค!
(์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜์—ฌ ๋งˆ์ดํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋“ฑ..)

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒฝ์šฐ
์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋งˆ์šดํŠธ๋œ๋‹ค

๋ช…์‹œ์ ์ธ ์ถ”๊ฐ€

๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ
(์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋‹ฌ ์ฐฝ์ด๋‚˜ ํˆดํŒ๊ณผ ๊ฐ™์€ ์ผ์‹œ์ ์ธ UI ์š”์†Œ๋ฅผ ์—ฌ๋Š” ๊ฒฝ์šฐ)

๋งˆ์šดํŠธ ์‹œ์—๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ดˆ๊ธฐ ์„ค์ •์ด๋‚˜ ๋ฐ์ดํ„ฐ ํŽ˜์นญ๊ณผ ๊ฐ™์€
์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด useEffect ํ›…์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ..

Copy code
import React, { useEffect } from 'react';

const MyComponent = () => {
  useEffect(() => {
    console.log('Component mounted');
    //์ดˆ๊ธฐํ™”๋ฉด๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค๊ฑฐ๋‚˜..
  }, []);

  return <div>My Component</div>;
};

์ด ์ฝ”๋“œ์—์„œ useEffect ํ›…์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค.

๋นˆ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋งˆ์šดํŠธ๋  ๋•Œ๋งŒ ํšจ๊ณผ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•œ๋‹ค! (๊ทธ๋ƒฅ ๋น„์–ด์žˆ๋Š” ๋ฐฐ์—ด์„ ์˜์กด์„ฑ์œผ๋กœ ๋‘๋ฉด ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋‚˜ prop๋ณ€๊ฒฝ์— ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋Š”๋‹ค, ์ฒ˜์Œ ๋ Œ๋”๋ง๋•Œ๋งŒ ๋”ฑ ์‹คํ–‰๋˜๋Š”๊ฒƒ)


3-2 ์—…๋ฐ์ดํŠธ(Updating)

์—…๋ฐ์ดํŠธ(update)๋Š” React ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋‚˜ ์†์„ฑ(props)์ด ๋ณ€๊ฒฝ๋˜์–ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋Š” ์ƒํ™ฉ์ด๋‹ค.
์ด๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋งˆ์šดํŠธ๋œ ํ›„์— ๋ฐœ์ƒํ•œ๋‹ค!

์–ด๋–ค๊ฒฝ์šฐ๊ฐ€ ์žˆ์„๊นŒ?

๊ทธ๋ƒฅ ์„ค๋ช…ํ–ˆ๋˜ ๋Œ€๋กœ๋‹ค!

์ƒํƒœ ๋ณ€๊ฒฝ

useState ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

์†์„ฑ(props) ๋ณ€๊ฒฝ

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์†์„ฑ(props)์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ๋‹ค.

์ปจํ…์ŠคํŠธ(context) ๋ณ€๊ฒฝ

useContext ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋… ์ค‘์ธ ์ปจํ…์ŠคํŠธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ๋‹ค.

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋„ ๋ฆฌ๋ Œ๋”๋ง๋  ์ˆ˜ ์žˆ๋‹ค!
์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋‚˜ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.


3-3 ์–ธ๋งˆ์šดํŒ…(Unmounting)

์–ธ๋งˆ์šดํŠธ(unmount)๋Š” React ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์ œ๊ฑฐ๋˜๋Š”๊ฒƒ์ด๋‹ค.
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋” ์ด์ƒ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์ง€ ์•Š๊ณ , ๊ด€๋ จ๋œ ๋ชจ๋“  ์ƒํƒœ์™€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ •๋ฆฌ๋˜๋Š” ์‹œ์ 

์–ด๋–ค๊ฒฝ์šฐ๊ฐ€ ์žˆ์„๊นŒ?

๋งˆ์šดํŠธ์˜ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„์ˆ˜ ์žˆ๊ฒ ๋‹ค.

์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š๊ฒŒ๋˜์—ˆ๋‹ค๋˜๊ฐ€
๋ผ์šฐํ„ฐ๊ฒฝ๋กœ ๋ณ€๊ฒฝ์œผ๋กœ ์›๋ž˜์žˆ๋˜ ํŽ˜์ด์ง€๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜์—ˆ๋‹ค๋˜๊ฐ€.. ํ•˜๋Š”๊ฒฝ์šฐ ?

๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ ๋งˆ์šดํŠธ์™€ ๋™์ผํ•œ
๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ฒ ๋Š”๋ฐ.
์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋‹ฌ ์ฐฝ์ด๋‚˜ ํˆดํŒ๊ณผ ๊ฐ™์€ ์ผ์‹œ์ ์ธ UI ์š”์†Œ๋ฅผ ๋‹ซ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ฒ ๋Š”๋ฐ,

์–ธ๋งˆ์šดํŠธ ์‹œ์—๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด useEffect ํ›…์˜ ๋ฐ˜ํ™˜ ํ•จ์ˆ˜(cleanup ํ•จ์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

javascript
Copy code
import React, { useEffect } from 'react';

const MyComponent = () => {
  useEffect(() => {
    console.log('Component mounted');

    return () => {
      console.log('Component unmounted');
      // ๋ฆฌ์†Œ์Šค์ •๋ฆฌํ•˜๊ธฐ
    };
  }, []);

  return <div>My Component</div>;
};

useEffect ํ›…์˜ ๋ฐ˜ํ™˜ ํ•จ์ˆ˜๋Š”
์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜์–ด ํ•„์š”ํ•œ ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค!
๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ cleanup ํ•จ์ˆ˜ ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค!
(ํŽ˜์นญ์„ ์ทจ์†Œํ•œ๋‹ค๋˜๊ฐ€, ์™ธ๋ถ€ API์˜ ๊ตฌ๋…์„ ํ•ด์ œํ•œ๋‹ค๋˜๊ฐ€ ๋“ฑ..)


3-4 useEffect ํ›…

useEffect ํ›…์€ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ์™€
์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ›๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฐ›๋Š”๋‹ค!

์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ side effect๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

๋งˆ์šดํŒ…, ์—…๋ฐ์ดํŠธ, ์–ธ๋งˆ์šดํŒ… ๋ชจ๋“  ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!


4. React์—์„œ ๋ฐฐ์—ด ๋ Œ๋”๋ง๊ณผ key ์„ค์ •

์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์˜ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด์„œ
๊ผญ ํ•„์š”ํ•œ key!

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ฐฐ์—ด์„ ๋ Œ๋”๋งํ• ๋•Œ๋Š” mapํ•จ์ˆ˜๋ฅผ ์“ฐ์ง€์•Š๋Š”๊ฐ€?

์ด๋•Œ ๊ฐ ์š”์†Œ์— ๋ฐฐ์—ด๋‚ด์˜ ๊ณ ์œ ํ•œ ์š”์†Œ๋ฅผ key์†์„ฑ์œผ๋กœ ๋ถ€์—ฌํ•œ๋‹ค!

key ์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์œผ๋กœ๋Š”

  • ๋ฌธ์ž์—ด
  • ์ˆซ์ž
  • ๊ฐ์ฒด
  • ๋ฐฐ์—ด

๊ฐ€ ์žˆ๋‹ค!

4-1 key์˜ ํ•„์š”์„ฑ

React๋Š” key๋ผ๋Š” ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ํ†ตํ•ด ์–ด๋–ค ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝ, ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œํ• ์ง€์— ์žˆ์–ด์„œ ๋„์›€์„ ๋ฐ›๋Š”๋‹ค.
key๊ฐ€ ์—†์œผ๋ฉด React๋Š” ๋ฐฐ์—ด์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ํ•ญ๋ชฉ์„ ์‹๋ณ„ํ•˜๋ฏ€๋กœ,
๋ฐฐ์—ด์˜ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

4-2 key ์„ค์ • ์‹œ ์ฃผ์˜์ 

key๋Š” ๊ณ ์œ ํ•ด์•ผ ํ•˜๋ฉฐ,
๋ฐฐ์—ด ๋‚ด์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

๊ฐ€๋Šฅํ•˜๋ฉด ์ธ๋ฑ์Šค ๋Œ€์‹  ๋ฐ์ดํ„ฐ์˜ ID๋ฅผ key๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ธ๋ฑ์Šค๋ฅผ key๋กœ ์‚ฌ์šฉํ•˜๋ฉด
๋ฐฐ์—ด์˜ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ
(๋ฐ€๋ ค๋ฒ„๋ฆฐ ์ˆœ์„œ๋•Œ๋ฌธ์— ์ด์ƒํ•œ ์š”์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค๋˜๊ฐ€)


A. ์ฐธ๊ณ 

๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด๋ž€?

์ปดํ“จํ„ฐํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ผํ•œ๊ณ„์‚ฐ์„ ๋น„ํšจ์œจ์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋Š”๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ
์ด์ „์— ๊ณ„์‚ฐ๋˜์—ˆ๋˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ!

ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ž…๋ ฅ๊ฐ’๊ณผ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ 
๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ํ˜ธ์ถœ๋˜๋ฉด, ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘” ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ
๊ตณ์ด ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š”๊ฒƒ์ด๋‹ค!

๊ตณ์ด ๋™์ผํ•œ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์œผ๋‹ˆ ์‹œ๊ฐ„์ ˆ์•ฝ์˜ ์žฅ์ ๊ณผ
์žฌ๊ท€ํ•จ์ˆ˜๋‚˜
๋™์ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด๊ฐ™์€ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ์ž‘์€๋ฌธ์ œ๋กœ ์ชผ๊ฐœ๋‘”ํ˜•ํƒœ)์˜ ๊ฒฝ์šฐ
ํšจ์œจ์ด ์ข‹๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค!


ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๋ž€?

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ, ์ƒ์„ฑํ•˜์—ฌ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค!

์ด๊ฒŒ ๋ญ”์†Œ๋ฆฐ๊ฐ€.. ์‹ถ์„์ˆ˜๋„ ์žˆ๋Š”๋ฐ
"ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค"๋ผ๋Š” ํ‘œํ˜„์€ ๋‹จ์ง€ ๊ฐœ๋ณ„ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ง€์นญํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์ด๋‹ค.

ํ•จ์ˆ˜ ๊ทธ ์ž์ฒด๋Š” ์ฝ”๋“œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” "์„ค๊ณ„๋„" ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ํŽธํ•˜๊ณ (๋ญ˜ ํ• ์ง€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก)
ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๋Š” "์‹ค์ œ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜๊ณ , ์‹คํ–‰๋˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”, ํ˜ธ์ถœ์‹œ ๋™์ž‘ํ•˜๋Š” ๊ฐ์ฒด" ๋ผ๊ณ  ๋ณผ์ˆ˜์žˆ๋Š”๋ฐ

ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ• ๋•Œ, ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ• ๋•Œ, ํ™”์‚ดํ‘œํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ํ• ๋•Œ ์ƒ์„ฑ๋œ๋‹ค!

์ค‘์š”ํ•œ ์ ์€

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ด ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜์˜ ์ฝ”๋“œ, ์Šค์ฝ”ํ”„, ๊ทธ๋ฆฌ๊ณ  ๊ธฐํƒ€ ํ”„๋กœํผํ‹ฐ๋“ค์„ ํฌํ•จํ•˜๋Š”๊ฒƒ์ด๊ณ .

React ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ด ๊ฐœ๋…์ด ํŠนํžˆ ์ค‘์š”ํ•œ ์ด์œ ๋Š”

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ •์˜๋œ ํ•จ์ˆ˜๋“ค์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ!

์ด๋Š” ๋•Œ๋•Œ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด๋‚˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์–ด์„œ

useCallback๊ณผ ๊ฐ™์€ ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด,
ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๋Š” ๊ณ ์œ ํ•œ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ ,
๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค

๊ฐ๊ฐ์˜ ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค.!! ๊ทธ๋ฆฌ๊ณ  react๋Š” ๋ฆฌ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ , ์ด๋Š” ์ตœ์ ํ™”๋ฅผ ํ•„์š”๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.


#์ฝ”๋“œ์ž‡์Šคํ”„๋ฆฐํŠธ #์Šคํ”„๋ฆฐํŠธํ’€์Šคํƒ1๊ธฐ #์ทจ์—…๊นŒ์ง€๋‹ฌ๋ฆฐ๋‹ค

profile
Codeit ์Šคํ”„๋ฆฐํŠธ / ํ’€์Šคํƒ 1๊ธฐ ์ˆ˜๊ฐ•์ค‘์ธ ๊น€ํ˜„์šฐ์ž…๋‹ˆ๋‹ค!

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