๐Ÿ” ๋ผ์ดํ”„์‚ฌ์ดํด

๊น€์ˆ˜์ง„ยท2025๋…„ 7์›” 8์ผ

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

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

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์ด๋ž€?
Mount -> Update -> UnMount
๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

Mount

์ปดํฌ๋„ŒํŠธ๊ฐ€ ํƒ„์ƒํ•˜๋Š” ์ˆœ๊ฐ„
ํ™”๋ฉด์— ์ฒ˜์Œ ๋ Œ๋”๋ง ๋˜๋Š” ์ˆœ๊ฐ„

Undate

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜๋Š” ์ˆœ๊ฐ„
๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋ฅผ ์˜๋ฏธ

UnMount

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

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

์ปดํฌ๋„ŒํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ

Mount

์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž‘์—…

Undate

์–ด๋–ค ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์ฝ˜์†”์— ์ถœ๋ ฅ

UnMount

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ

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

useEffect๋ž€? ๋ฆฌ์•กํŠธ์ปดํฌ๋„ŒํŠธ์˜ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ(ํŒŒ์ƒ๋˜๋Š” ํšจ๊ณผ)๋ฅผ ์ œ์–ดํ•˜๋Š” ์ƒˆ๋กœ์šด React Hook์ด๋‹ค.

import "./App.css";
import Viewer from "./components/Viewer";
import Controller from "./components/Controller";
import { useState, useEffect } from "react";

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

  useEffect(() => {
    //count์Šคํ…Œ์ดํŠธ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜์ธ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‹คํ–‰
    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;

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

1. mount

  //1. ๋งˆ์šดํŠธ :  ํƒ„์ƒ
  useEffect(() => {
    console.log("mount");
  }, []);

2. update

import "./App.css";
import Viewer from "./components/Viewer";
import Controller from "./components/Controller";
import { useState, useEffect, useRef } from "react";

function App() {
  const [count, setCount] = useState(0);
  const isMount = useRef(false);

  //1. ๋งˆ์šดํŠธ :  ํƒ„์ƒ
  useEffect(() => {
    console.log("mount");
  }, []);

  //2. ์—…๋ฐ์ดํŠธ : ๋ณ€ํ™”, ๋ฆฌ๋ Œ๋”๋ง
  useEffect(() => {
    if (!isMount.current) {
      isMount.current = true;
      return;
    }
    console.log("update");
  });
  //3. ์–ธ๋งˆ์šด : ์ฃฝ์Œ
  useEffect(() => {
    console.log("update");
  });
  const onClickButton = (value) => {
    setCount(count + value); //Controller์˜ ๋ช…๋ น์„ ๋ฐ›์•„์™€ ํ˜„์žฌ ๊ฐ’๊ณผ ์„ ํƒ๋œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ!
  };

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

export default App;

  

์ง„์งœ ์ปดํฌ๋„ŒํŠธ์˜ ์—…๋ฐ์ดํŠธ ๋‹จ๊ณ„์—์„œ๋งŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด, useRef๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

3. unmount

Even.jsx

import { useEffect } from "react";

const Even = () => {
  useEffect(() => {
    //ํด๋ฆฐ์—…, ์ •๋ฆฌํ•จ์ˆ˜
    return () => {
      console.log("unmount");
    };
  }, []);
  return <div>์ง์ˆ˜</div>;
};

export default Even;

App.jsx

import "./App.css";
import Viewer from "./components/Viewer";
import Controller from "./components/Controller";
import Even from "./components/Even";
import { useState, useEffect, useRef } from "react";

function App() {
  const [count, setCount] = useState(0);
  const isMount = useRef(false);

  //1. ๋งˆ์šดํŠธ :  ํƒ„์ƒ
  useEffect(() => {
    console.log("mount");
  }, []);

  //2. ์—…๋ฐ์ดํŠธ : ๋ณ€ํ™”, ๋ฆฌ๋ Œ๋”๋ง
  useEffect(() => {
    if (!isMount.current) {
      isMount.current = true;
      return;
    }
    console.log("update");
  });

  //3. ์–ธ๋งˆ์šด : ์ฃฝ์Œ

  useEffect(() => {
    console.log("update");
  });
  const onClickButton = (value) => {
    setCount(count + value); //Controller์˜ ๋ช…๋ น์„ ๋ฐ›์•„์™€ ํ˜„์žฌ ๊ฐ’๊ณผ ์„ ํƒ๋œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ!
  };

  return (
    <div className="App">
      <h1>Simple Counter</h1>
      <section>
        <Viewer count={count} />
        {count % 2 == 0 ? <Even /> : null}
      </section>
      <section>
        <Controller onClickButton={onClickButton} />
      </section>
    </div>
  );
}

export default App;

React ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์‚ฌ์šฉํ•˜๊ธฐ

https://chromewebstore.google.com/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ko&pli=1
์„ค์น˜ ํ›„,

ํ™•์žฅํ”„๋กœ๊ทธ๋žจ ๊ด€๋ฆฌ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.


์„ธ๋ถ€์ •๋ณด๋กœ ๋“ค์–ด๊ฐ€์„œ ๋ชจ๋“  ์‚ฌ์ดํŠธ์—์„œ ๋กœ ์„ค์ •ํ•ด์ค€ ํ›„, ํŒŒ์ผ URL์— ๋Œ€ํ•œ ์—‘์„ธ์Šค ํ—ˆ์šฉ์„ ์ผœ์ค€๋‹ค.


๊ณ ์ •๊นŒ์ง€ ํ•ด์ฃผ๋ฉด ์™„์„ฑ!


๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๋€ react tool์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์—ด์–ด์„œ components์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ •๋ ฌํ•œ components๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ›๋Š” props์™€ hooks๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋ฅผ ํด๋ฆญํ•˜์—ฌ Highlight updates when components render๋ฅผ ์ฒดํฌํ•ด์ฃผ๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์˜€์„ ๋•Œ, ํ•˜์ด๋ผ์ดํŠธ๋กœ ์•Œ๋ ค์ค€๋‹ค.

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