๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/React

[ํ•œ์ž… ํฌ๊ธฐ๋กœ ์ž˜๋ผ ๋จน๋Š” ๋ฆฌ์•กํŠธ] - ๋ผ์ดํ”„์‚ฌ์ดํด

by YeonBu 2024. 11. 28.
728x90

 


๊ฐ•์˜ - Section 7 : ๋ผ์ดํ”„์‚ฌ์ดํด

์œ ๋ฐ๋ฏธ : https://www.udemy.com/course/winterlood-react-basic/

์ธํ”„๋Ÿฐ : 

 

[2024] ํ•œ์ž… ํฌ๊ธฐ๋กœ ์ž˜๋ผ ๋จน๋Š” ๋ฆฌ์•กํŠธ(React.js) : ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค์ „๊นŒ์ง€ ๊ฐ•์˜ | ์ด์ •ํ™˜ Winterlood - ์ธํ”„๋Ÿฐ

์ด์ •ํ™˜ Winterlood | ๊ฐœ๋…๋ถ€ํ„ฐ ๋…ํŠนํ•œ ํ”„๋กœ์ ํŠธ๊นŒ์ง€ ํ•จ๊ป˜ ๋‹ค๋ค„๋ณด๋ฉฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ์ด ๊ฐ•์˜๋กœ ํ•œ ๋ฒˆ์— ๋๋‚ด์š”. ํ•™์Šต์€ ์งง๊ฒŒ, ์‘์šฉ์€ ๊ธธ๊ฒŒ 17์‹œ๊ฐ„ ๋ถ„๋Ÿ‰์˜ All-in-one ๊ฐ•์˜!, ๋ฆฌ์•กํŠธ, ํ•œ ๊ฐ•์˜๋กœ

www.inflearn.com


 

 

 

๋ผ์ดํ”„์‚ฌ์ดํด

๋ผ์ดํ”„์‚ฌ์ดํด์ด๋ž€?

 

* ๋ผ์ดํ”„์‚ฌ์ดํด ์ด๋ž€? ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ, ์ œ๊ฑฐ ๊ณผ์ •์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์ƒ์• ์ฃผ๊ธฐ๋ฅผ ๋œปํ•˜๋Š” ๋‹จ์–ด์ด๋ฉฐ ์ด ๊ณผ์ •์€ ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

 

1. Mount(ํƒ„์ƒ)

 - ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํƒ„์ƒํ•˜๋Š” ์ˆœ๊ฐ„

 - ํ™”๋ฉด์— ์ฒ˜์Œ ๋ Œ๋”๋ง ๋˜๋Š” ์ˆœ๊ฐ„

 => A ์ปดํฌ๋„ŒํŠธ๊ฐ€ Mount ๋˜์—ˆ๋‹ค! ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ A ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ์ฒ˜์Œ์œผ๋กœ ๋ Œ๋”๋ง ๋˜์—ˆ๋‹ค ๋ผ๋Š” ๋œป

 

2. Update(๋ณ€ํ™”)

 - ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜๋Š” ์ˆœ๊ฐ„

 - ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋ฅผ ์˜๋ฏธ

 => A ์ปดํฌ๋„ŒํŠธ๊ฐ€ Update ๋˜์—ˆ๋‹ค! ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ A ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜์—ˆ๋‹ค ๋ผ๋Š” ๋œป

 

3. UnMount(์ฃฝ์Œ)

 - ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๋Š” ์ˆœ๊ฐ„

 - ๋ Œ๋”๋ง์—์„œ ์ œ์™ธ๋˜๋Š” ์ˆœ๊ฐ„์„ ์˜๋ฏธ;

 => A ์ปดํฌ๋„ŒํŠธ๊ฐ€ UnMount ๋˜์—ˆ๋‹ค! ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ A ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์กŒ๋‹ค ๋ผ๋Š” ๋œป

 

 

* ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ์˜ˆ์‹œ

Mount(์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž‘์—…) → Update(์–ด๋–ค ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์ฝ˜์†”์— ์ถœ๋ ฅ) → UnMount(์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ)

 

 

๋ผ์ดํ”„์‚ฌ์ดํด

useEffect ์‚ฌ์šฉํ•˜๊ธฐ

 

 

* useEffect๋ž€? ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์ดํŠธ ์ดํŽ™ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ›…(Hook)์ด๋‹ค.

(์—ฌ๊ธฐ์„œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ž€, ์ปดํฌ๋„ŒํŠธ์˜ ์ฃผ์š” ๋ชฉ์ (๋ Œ๋”๋ง UI)์™ธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ถ€์ˆ˜์ ์ธ ์ž‘์—…์„ ๋งํ•œ๋‹ค. ๋ฆฌ์•กํŠธ์˜ ์ฃผ์š” ๋ชฉ์ ์€ UI๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ, ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ(API ํ˜ธ์ถœ), DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜๊ธฐ, ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ, WebSoKet ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋“ฑ ์™ธ๋ถ€์—์„œ ์ž‘์—…์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ๋ชจ๋‘ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ผ ํ•œ๋‹ค)

 

 

* useEffect ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

useEffect(effectFunction, dependencyArray);

 

 - effectFunction : ์‹คํ–‰ํ•  ๋™์ž‘์„ ์ •์˜ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜. ์ด ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋œ ์ดํ›„์— ์‹คํ–‰๋œ๋‹ค.

 - dependencyArray : ์˜์กด์„ฑ ๋ฐฐ์—ด๋กœ, ์ด ๋ฐฐ์—ด์— ํฌํ•จ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ effectFunction์ด ์‹คํ–‰๋œ๋‹ค(deps๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ)

  · ๋นˆ ๋ฐฐ์—ด [ ] : ๋งˆ์šดํŠธ ์‹œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰

  · ๊ฐ’์ด ์žˆ๋Š” ๋ฐฐ์—ด [state, props] : ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์‹คํ–‰

  · ์ƒ๋žต : ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰

 

 

* useEffect ์˜ˆ์‹œ

function App() {

  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log(`count : ${count}`)
  }, [count]);

  const onClickButton = (value) => {
    setCount(count + value);
  }

  return (
    <div className="App">
      <h1>Simple Counter</h1>
      <section>
        <Viewer count = {count}/>
      </section>
      <section>
        <Controller onClickButton = {onClickButton}/>
      </section>
    </div>
  )
}

export default App

 

 - ์œ„์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด count๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ ๋งˆ๋‹ค console์ฐฝ์— count ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

 

* ๊ทธ๋ ‡๋‹ค๋ฉด, ํด๋ฆญ ์ด๋ฒคํŠธ ์•ˆ์— ๋„ฃ๋Š”๋‹ค๋ฉด?

const onClickButton = (value) => {
    setCount(count + value);
    console.log(`count : ${count}`);
}

 

 - useEffect๊ฐ€ ๊ผญ ํ•„์š”ํ• ๊นŒ? onClickButton ์ด๋ฒคํŠธ ์•ˆ์— setCount๋กœ ๊ฐ’์„ ๋ฐ”๊พผ ํ›„ ๊ทธ ๊ฐ’์„ console์— ์ถœ๋ ฅํ•œ๋‹ค๋ฉด?

  : ๊ฒฐ๋ก ์€ ์•ˆ๋จ! ์ด์œ ๋Š” setState๋Š” ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ. ์ฆ‰, ์ƒํƒœ๊ฐ€ ์ฆ‰์‹œ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ Œ๋”๋ง ์ž‘์—…์ด ๋๋‚œ ํ›„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋œ๋‹ค.

 

 - ๋ฆฌ์•กํŠธ๋Š” ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ƒํƒœ ๋ณ€๊ฒฝ ์š”์ฒญ(setState)์„ ๋ชจ์•„ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์žฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

 

 - ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰ ํ๋ฆ„์„ ์ ์–ด๋ณด์ž๋ฉด, 

   โ‘  onClickButton( value ) ์‹คํ–‰

   โ‘ก setCount( count + value ) ํ˜ธ์ถœํ•˜์—ฌ ์ƒํƒœ ๋ณ€๊ฒฝ ์š”์ฒญ(์•„์ง ์š”์ฒญ๋งŒ!!)

   โ‘ข console.log(`count : ${count}`) ์‹คํ–‰. ์•„์ง ์ƒํƒœ๊ฐ’(count)๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ณ€๊ฒฝ ์ด์ „์˜ ๊ฐ’ ์ถœ๋ ฅ // 0

   โ‘ฃ ๋ฆฌ์•กํŠธ ์ƒํƒœ ๋ณ€๊ฒฝ ์ž‘์—…(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ)

   โ‘ค ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ’์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง

   โ‘ฅ count๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— useEffect ์‹คํ–‰ // 1

 

 

 

๋ผ์ดํ”„์‚ฌ์ดํด

useEffect๋กœ ๋ผ์ดํ”„์‚ฌ์ดํด ์ œ์–ดํ•˜๊ธฐ

 

 

* Mount

useEffect(() => {
   console.log("mount!");
}, []);

 

 - useEffect์˜ deps๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋งˆ์šดํŠธ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค. ์ด ํŒจํ„ด์€ ์ดˆ๊ธฐํ™” ์ž‘์—…์— ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค(๋ฐ์ดํ„ฐ ๋กœ๋“œ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก ๋“ฑ์— ์‚ฌ์šฉ)

 

 

* Update

useEffect(() => {
   console.log("update!");
});

 

- useEffect์— deps๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฆฌ๋ Œ๋”๋ง ์‹œ ์‹คํ–‰๋œ๋‹ค(์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ๊ทธ ์ถœ๋ ฅ, DOM ์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ์ง€ ๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค)

 

 

* UnMount

useEffect(() => {
    // ํด๋ฆฐ์—…, ์ •๋ฆฌํ•จ์ˆ˜
    return () => {
        console.log("unmout");
    }
}, []);

 

 - useEffect์•ˆ์—์„œ return์œผ๋กœ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋Š” ์ •๋ฆฌ(clean-up)ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ •๋ฆฌํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ, ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋˜์–ด useEffect๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๊ธฐ ์ง์ „์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

 

 

 

 

๋ฐ˜์‘ํ˜•