๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

react

React / ์ƒ๋ช…์ฃผ๊ธฐ

์ƒ๋ช…์ฃผ๊ธฐ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๋ Œ๋”๋ง ๋œ ํ›„ ์†Œ๋ฉธ๋  ๋•Œ๊นŒ์ง€์˜ ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค.

์ƒ๋ช… ์ฃผ๊ธฐ๋Š” Mount(ํ™”๋ฉด์— ๊ทธ๋ ค์ง) - Update(ํ™”๋ฉด ์—…๋ฐ์ดํŠธ) - Unmount(ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง) ์„ธ ๊ฐ€์ง€์˜ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

 

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ

 

 

1. ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐ ๋งˆ์šดํŠธ

์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ DOM์— ์ถ”๊ฐ€๋˜๋Š”๋ฐ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•œ ์„ค์ •์„ ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋“ฑ์˜ ์ดˆ๊ธฐ ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ๋‹ค.

  • constructor() : ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐ state ์ดˆ๊ธฐํ™”
  • render() : JSX ๋ฆฌํ„ด, ํ™”๋ฉด์— ๊ทธ๋ฆด ๋‚ด์šฉ ์ •์˜
  • componentDidMount() : ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์— ์‹ค์ œ๋กœ ๊ทธ๋ ค์ง„ ํ›„ ํ˜ธ์ถœ๋จ, ๋ฐ์ดํ„ฐ ์š”์ฒญ / DOM ๊ด€๋ จ ์ž‘์—… / ํƒ€์ด๋จธ๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก ๋“ฑ์— ์‚ฌ์šฉ

 

2. ์—…๋ฐ์ดํŠธ

state๋‚˜ props ๋“ฑ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์—…๋ฐ์ดํŠธ ๋‹จ๊ณ„๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

  • shouldComponentUpdate() : ๋ฆฌ๋ Œ๋”๋ง ์—ฌ๋ถ€๋ฅผ true, false๋กœ ๊ฒฐ์ •
  • render() : ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•œ UI๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ
  • componentDidUpdate() : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋œ ์งํ›„ ์‹คํ–‰๋จ, API ํ˜ธ์ถœ / DOM ์ž‘์—…์— ์œ ์šฉ

 

3. ์–ธ๋งˆ์šดํŠธ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”์—†์–ด์ง€๋ฉด DOM์—์„œ ์ œ๊ฑฐ๋˜๋Š”๋ฐ, ์ œ๊ฑฐ๋˜๊ธฐ ์ „ ํ•„์š”ํ•œ ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • componentWillUnmount() : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „ ํ˜ธ์ถœ๋จ, ํƒ€์ด๋จธ ์ •๋ฆฌ / ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•ด์ œ ๋“ฑ ๋ชจ๋“  ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค

 

* ์˜ˆ์‹œ

import { Component, useState } from 'react';
import './App.css';

function App() {
  const [showCounter, setShowCounter] = useState(false);
  return (
    <>
      {showCounter && <Counter />}
      <br />
      <button onClick={() => setShowCounter((prev) => !prev)}>show</button>
    </>
  );
}

class Counter extends Component {
  // ์ƒ์„ฑ์ž ์ƒ์„ฑ
  constructor() {
    super(); // ๋น„์–ด์žˆ์–ด๋„ ์จ์ค˜์•ผ๋จ!
    this.state = { counter: 1 };
    console.log('constructor');
  }
  // ๋งˆ์šดํŠธ
  componentDidMount() {
    console.log('DidMount');
  }
  // ์—…๋ฐ์ดํŠธ
  componentDidUpdate() {
    console.log('DidUpdate');
  }
  // ์–ธ๋งˆ์šดํŠธ
  componentWillUnmount() {
    console.log('WillUnmount');
  }
  render() {
    console.log('render');
    return (
      <>
        <div>counter : {this.state.counter}</div>
        <button
          onClick={() =>
            this.setState({
              counter: this.state.counter + 1,
            })
          }>
          +1
        </button>
      </>
    );
  }
}

export default App;

 

 

 

 


 

 

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ

 

 

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋Š” ํด๋ž˜์Šคํ˜•๊ณผ ๋‹ฌ๋ฆฌ ๋ณ„๋„๋กœ state๋ฅผ ์ •์˜ํ•ด์ฃผ๊ฑฐ๋‚˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋งž์ถฐ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋”ฐ๋กœ ์—†๊ธฐ ๋•Œ๋ฌธ์—, Effect Hook์ธ useEffect๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋Šฅ์„ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

 

ํด๋ž˜์Šคํ˜•์—์„œ componentDidMount, componentDidUpdate, componentWillUnmount ์„ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋˜ ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, useEffect ํ•˜๋‚˜๋กœ ๋‹ค ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

 

 


 

useEffect

์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ํ›…์œผ๋กœ, ๋งˆ์šดํŠธ + ์—…๋ฐ์ดํŠธ + ์–ธ๋งˆ์šดํŠธ ๋‹ค ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

๊ธฐ๋ณธ ํ˜•ํƒœ

useEffect(()=>{
  ์ฒซ๋ฒˆ์งธ ์ธ์ž : ํ•จ์ˆ˜ // useEffect๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์‹คํ–‰๋  ์ฝ”๋“œ
},[๋‘๋ฒˆ์งธ ์ธ์ž : ๋ฐฐ์—ด]) // useEffect๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์กฐ๊ฑด์„ ์ •์˜ํ•ด์ฃผ๋Š” ๋ฐฐ์—ด

 

- ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ์ฃผ์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋์„ ๋•Œ, ๋ฆฌ๋ Œ๋”๋ง ๋์„ ๋•Œ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. (๋งˆ์šดํŠธ, ์—…๋ฐ์ดํŠธํ•  ๋•Œ useEffect()์‹คํ–‰)

- ๋นˆ ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ์คฌ์„ ๊ฒฝ์šฐ : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋์„ ๋•Œ๋งŒ ์‹คํ–‰ (๋งˆ์šดํŠธ๋  ๋•Œ useEffect() ์‹คํ–‰)

- ๋ฐฐ์—ด์— ๊ฐ’์„ ๋‹ด์•„ ์ธ์ž๋กœ ์คฌ์„ ๊ฒฝ์šฐ : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง ๋์„ ๋•Œ, ๋ฐฐ์—ด์— ๋‹ด๊ธด ๊ฐ’์ด ๋ณ€๊ฒฝ๋ผ ๋ฆฌ๋ Œ๋”๋ง ๋์„ ๋•Œ ์‹คํ–‰ (๋งˆ์šดํŠธ, ์—…๋ฐ์ดํŠธํ•  ๋•Œ useEffect()์‹คํ–‰)

 

๊ทธ๋Ÿผ ์–ธ๋งˆ์šดํŠธ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋ƒ๋ฉด return()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ฆ‰ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ return๋‚ด์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

useEffect(()=>{
  ์ฒซ๋ฒˆ์งธ ์ธ์ž : ํ•จ์ˆ˜ // useEffect๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์‹คํ–‰๋  ์ฝ”๋“œ
  return()=>{ ๋ฆฌํ„ด๋˜๋Š” ํ•จ์ˆ˜ } // ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ
},[๋‘๋ฒˆ์งธ ์ธ์ž : ๋ฐฐ์—ด]) // useEffect๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์กฐ๊ฑด์„ ์ •์˜ํ•ด์ฃผ๋Š” ๋ฐฐ์—ด

 

 

์˜ˆ์ œ

1) ๋ฐฐ์—ด ์ธ์ž๊ฐ€ ์—†์„ ๊ฒฝ์šฐ

function Counter() {
  const [counter, setCounter] = useState(0);
  // useEffect
  useEffect(() => {
    // ๋ฐฐ์—ด ์ธ์ž๊ฐ€ ์—†์Œ => ๋งˆ์šดํŠธ, ์—…๋ฐ์ดํŠธ๊ฐ€ ์‹คํ–‰
    console.log('useEffect');
  });
  return (
    <>
      <div>counter : {counter}</div>
      <button onClick={() => setCounter(counter + 1)}>+1</button>
    </>
  );
}

 

๋งˆ์šดํŠธ๋ ๋•Œ, ์—…๋ฐ์ดํŠธ๋  ๋•Œ(์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง๋จ) 'useEffect'๊ฐ€ ์ฝ˜์†”์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!

 

 

2) ์ธ์ž๋กœ ๋นˆ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ

  // useEffect
  useEffect(() => {
    console.log('useEffect');
  }, []);

 

๋งˆ์šดํŠธ๋  ๋•Œ๋งŒ ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๊ณ , ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ(์—…๋ฐ์ดํŠธํ•  ๋•Œ)๋Š” useEffect๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค

 

 

3) ๊ฐ’์ด ์žˆ๋Š” ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ

 

๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ์™€ ์—†์„๋•Œ์˜ ์ฐจ์ด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ํ•˜๋‚˜ ๋” ์ƒ์„ฑํ–ˆ๋‹ค.

์ธ์ž๊ฐ’์œผ๋กœ๋Š” ์ƒˆ๋กœ ์ƒ์„ฑํ•œ counter2์˜ ์ƒํƒœ๊ฐ’์„ ๋„ฃ์–ด์คฌ๋‹ค.

function Counter() {
  const [counter, setCounter] = useState(0);
  const [counter2, setCounter2] = useState(100);
  // useEffect
  useEffect(() => {
    console.log('useEffect');
  }, [counter2]);
  return (
    <>
      <div>counter : {counter}</div>
      <button onClick={() => setCounter(counter + 1)}>+1</button>
      <hr />
      <div>counter2 : {counter2}</div>
      <button onClick={() => setCounter2(counter2 - 1)}>-1</button>
    </>
  );
}

 

 

๋งˆ์šดํŠธ๋  ๋•Œ์™€, ์ธ์ž๋กœ ๋„ฃ์€ counter2์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ (์—…๋ฐ์ดํŠธํ•  ๋•Œ๋งŒ) useEffect๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

4) ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ

 

์–ธ๋งˆ์šดํŠธ ์‹œ ์ •๋ฆฌ๋ฅผ ์œ„ํ•ด return๋ฌธ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

  // useEffect
  useEffect(() => {
    console.log('useEffect');
    return () => {
      console.log('returned function');
    };
  }, [counter2]);

 

 

 

update์ค‘์—๋„ ๊ณ„์† returned function์ด ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ,

์ด๋Š” ์—…๋ฐ์ดํŠธ - ์–ธ๋งˆ์šดํŠธ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๊ธฐ์กด ํ•จ์ˆ˜๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— return๋ฌธ๋„ ๊ฐ™์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

+ ์ด๋•Œ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์•„์˜ˆ ์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ตณ์ด returnํ•˜๋Š” ์ด์œ ๊ฐ€ ์—†์–ด์ง€๋ฏ€๋กœ, ์ ์ ˆํ•˜๊ฒŒ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋„ฃ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. 
+ ๋นˆ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋„ฃ์œผ๋ฉด unmount๋  ๋•Œ๋งŒ return๋ฌธ์ด ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.

 

 



clean-up ํ•จ์ˆ˜


useEffect์—์„œ return์œผ๋กœ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋ฅผ ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

React๊ฐ€ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์ž๋™์œผ๋กœ ์ด์ „์˜ effect๋ฅผ ์ •๋ฆฌ(clean-up)ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์—์„œ ๊ณ„์† returned function์ด ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ์ด์œ ๋„ ๊ณ„์† ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ๋‹ค์Œ useEffect๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๊ธฐ์กด effect๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

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

์˜์กด์„ฑ ๋ฐฐ์—ด cleanup ์‹คํ–‰ ์‹œ์ 
์ƒ๋žต ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ๋‹ค์Œ ์‹คํ–‰ ์ „ cleanup ์‹คํ–‰
[] unmount์‹œ์—๋งŒ cleanup ์‹คํ–‰
[value] value๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค, ๋ฐ”๋€Œ๊ธฐ ์ „ cleanup ์‹คํ–‰

 

clean-up์ด ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ด์œ ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ , ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ํƒ€์ด๋จธ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ณ , ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๊ฐ’์„ ์„ค์ •ํ•œ ๊ฒฝ์šฐ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋ฐ”๋กœ ๋ฐ˜์˜ํ•ด ์˜ฌ๋ฐ”๋ฅธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 


 

 

 

์ƒ๋ช… ์ฃผ๊ธฐ ํ•จ์ˆ˜์˜ ํ•„์š”์„ฑ

 

์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” state๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ ๋ฆฌ์Šคํ„ฐ๋‚˜ ํƒ€์ด๋จธ๋ฅผ ๋“ฑ๋ก / ํ•ด์ œํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜ค๋Š” ๋“ฑ์˜ ๋™์ž‘์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

 

1. ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ (API ์š”์ฒญ)

์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ์‹œ ํ™”๋ฉด ๋ฉˆ์ถค ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ ์ž‘์—…ํ•˜๊ฒŒ ๋œ๋‹ค. 

fetch()๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ, ๋ฐ์ดํ„ฐ์˜ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์€ ์ฑ„ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ ๋’ค ์‘๋‹ต์ด ์˜ค๋ฉด ๊ทธ๋•Œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.

 

 

1) ์˜ˆ์‹œ

 

json-server : jsonํŒŒ์ผ์„ ์ด์šฉํ•ด ๋ชจ์˜์šฉ RESTful API ์„œ๋ฒ„ ๋ฐ DB๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์–ด๋กœ json-server๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค. ์ด ๋•Œ -g๋Š” global์„ ์˜๋ฏธํ•˜๋ฉฐ ์ „์—ญ์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. 

npm i -g json-server

 

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ญํ• ์„ ํ•ด์ค„ jsonํŒŒ์ผ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

 

db.json

{
  "createOrder": [
    { "id": 1, "content": "npm create vite@latest my-app -- --template react" },
    { "id": 2, "content": "cd my-app" },
    { "id": 3, "content": "npm install" }
  ]
}

 

๊ทธ๋ฆฌ๊ณ  json-server๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. db.jsonํŒŒ์ผ์„ watching ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

json-server --watch db.json 
## ๊ธฐ๋ณธ ํฌํŠธ๋Š” 3000์ด๋ผ์„œ ๋’ค์— --port 3004 ๋ฅผ ๋ถ™์ด๋ฉด 3004๋ฒˆ ํฌํŠธ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์™ผ์ชฝ์˜ http://localhost:3000/data๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์˜ค๋ฅธ์ชฝ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ํŽ˜์ด์ง€๊ฐ€ ๋œฌ๋‹ค

 

fetch ๋ฉ”์„œ๋“œ๋กœ ์‹คํ–‰ํ•œ json-server์˜ data๋ฅผ ์š”์ฒญํ–ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  then์œผ๋กœ ๋ฐ›์•„์˜จ ์š”์ฒญ์„ json()์œผ๋กœ jsonํ˜•์‹์„ ์ž…๋ ฅ๋ฐ›์•„ => javascript ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  data ๋ผ๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด์ค€๋‹ค.

ํ• ๋‹น๋œ data๋ฅผ map()์œผ๋กœ ํ™”๋ฉด์— ๋ฟŒ๋ ค์ฃผ๋ฉด...

function App() {
  let data;

  fetch('http://localhost:3000/data')
    .then((res) => res.json())
    .then((res) => (data = res));
  return (
    <>
      <div>๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑํ•˜๊ธฐ</div>
      {data.map((el) => (
        <div key={el.id}>{el.content}</div>
      ))}
    </>
  );
}

 

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค!

 

 

data.map์—์„œ data๊ฐ€ undefined ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— map()์„ ์ฝ์–ด์˜ฌ ์ˆ˜๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค... 

fetch๊ฐ€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋™์•ˆ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋จผ์ € ๋ Œ๋”๋ง๋˜๊ธฐ ๋•Œ๋ฌธ์— data๊ฐ€ undefined์ธ ์ƒํƒœ๋กœ ๋ Œ๋”๋ง๋œ ๊ฒƒ์ด๋‹ค. 

 

๋•Œ๋ฌธ์— ์ด๋Ÿด ๋•Œ๋Š” useState, useEffect๋กœ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. 

 

function App() {
  const [data, setData] = useState([]);

  useEffect(() => {
    fetch('http://localhost:3000/data')
      .then((res) => res.json())
      .then((res) => setData(res));
  }, []);

  return (
    <>
      <div>๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑํ•˜๊ธฐ</div>
      {data.map((el) => (
        <div key={el.id}>{el.content}</div>
      ))}
    </>
  );
}

 

useState๋กœ data์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ

useEffect๋กœ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋นˆ ๋ฐฐ์—ด๋กœ ์„ค์ •ํ•ด ๋งˆ์šดํŠธ๋  ๋•Œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด

data๋ฅผ ๋นˆ ๋ฐฐ์—ด๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ์œผ๋ฏ€๋กœ map์„ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— data๊ฐ€ ๋ฐฐ์—ด์ธ์ง€ ํ™•์ธ์ด ๊ฐ€๋Šฅ

 

* ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋นˆ ๋ฐฐ์—ด๋กœ ์„ค์ •ํ•˜๋Š” ์ด์œ 

: ํŽ˜์ด์ง€๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง ๋  ๋•Œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— fetch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋™์•ˆ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๊ณ , ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋ฉด ๊ณ„์†ํ•ด์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๋ฉด์„œ fetch()๊ฐ€ ๊ณ„์† ์‹คํ–‰์ด ๋˜๋Š”๋ฐ, ์ด๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.

๋•Œ๋ฌธ์— useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋นˆ ๋ฐฐ์—ด๋กœ ์„ค์ •ํ•ด ์ฒ˜์Œ ๋งˆ์šดํŠธ๋  ๋•Œ๋งŒ useEffect ๋‚ด์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒฐ๊ณผ ํ™”๋ฉด

 

 


 

 

2. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ

1) ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ

useEffect์™€ useState๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งˆ์šฐ์Šค๊ฐ€ ์›€์ง์ผ ๋•Œ๋งˆ๋‹ค ๋งˆ์šฐ์Šค๋ฅผ ๋”ฐ๋ผ์˜ค๋Š” div์š”์†Œ์™€ mouse์˜ ํ˜„์žฌ ์œ„์น˜๊ฐ’์„ ํ‘œ์‹œํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

function App() {
  return (
    <>
      <Mousefollower />
    </>
  );
}

// ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ
const Mousefollower = () => {
  // ๋งˆ์šฐ์Šค์˜ ์ขŒํ‘œ ์ƒํƒœ ์ƒ์„ฑ
  const [position, setPosition] = useState({ x: 0, y: 0 });
  
  // ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๋“ฑ๋ก
  useEffect(() => {
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค (์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค) handleMouseMove๋ฅผ ๋“ฑ๋ก
    const handleMouseMove = (e) => {
      // ์ขŒํ‘œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ (e.clientX, e.clientY๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ์ค€ ๋งˆ์šฐ์Šค ์ขŒํ‘œ๊ฐ’)
      setPosition({ x: e.clientX, y: e.clientY });
      console.log('mouseMoved');
    };
    window.addEventListener('mouseover', handleMouseMove);
    
    // ํด๋ฆฐ์—… ํ•จ์ˆ˜, ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ์ง์ „ ๊ธฐ์กด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค
    return () => {
      window.removeEventListener('mouseover', handleMouseMove);
    };
  });

  return (
    <>
      <div
        style={{
          position: 'fixed',
          top: position.y,
          left: position.x,
          width: '20px',
          height: '20px',
          borderRadius: '50%',
          background: 'green',
          transform: 'translate(-50%, -50%)',
        }}></div>
      <p>
        ๋งˆ์šฐ์Šค ์œ„์น˜: {position.x}px, {position.y}px
      </p>
    </>
  );
};

 

(์ด๋•Œ ํด๋ฆฌ๋„ˆ ํ•จ์ˆ˜๋กœ ์ด์ „ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”๋กœ๋ฐ”๋กœ ์ œ๊ฑฐํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์Œ“์—ฌ์„œ ์ฝ˜์†”์ฐฝ์œผ๋กœ useEffect์˜ ์‹คํ–‰ ํšŸ์ˆ˜๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค... )

 

 

 

2) ์Šคํฌ๋กค ์ด๋ฒคํŠธ

์Šคํฌ๋กค ์ขŒํ‘œ์˜ ๊ฒฝ์šฐ window๋‚˜ document์—์„œ ๋ฐ”๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์šฐ์Šค์™€ ๋‹ฌ๋ฆฌ ๊ตณ์ด ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ๊ฑฐ์น˜์น˜ ์•Š์•„๋„ ๋œ๋‹ค. ๋‹ค๋งŒ ์Šคํฌ๋กค ์ง„ํ–‰๋„๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

function App() {
  return (
    <>
      <div style={{ height: '300vh' }}></div>
      <Mousefollower />
      <ScrollIndicator />
    </>
  );
}

const ScrollIndicator = () => {
 // ์Šคํฌ๋กค ์ง„ํ–‰๋„๋ฅผ ํ‘œ์‹œํ•  ๋ฐ”์˜ ๋„ˆ๋น„ ์ƒํƒœ ์ƒ์„ฑ
  const [scrollWidth, setscrollWidth] = useState(0);

  useEffect(() => {
    // ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์Šคํฌ๋กค ์ง„ํ–‰๋ฅ ์„ ๋ฐ›์•„์˜ด
    const handleScroll = () => {
      // ์Šคํฌ๋กค ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
      const scrollTop = window.scrollY;
      const scrollHeight = document.documentElement.scrollHeight;
      const clientHeight = document.documentElement.clientHeight;
      const scrollPercentage = (scrollTop / (scrollHeight - clientHeight)) * 100;
      // ๋ฐ›์•„์˜จ ์ง„ํ–‰๋ฅ ์„ ๋ฐ”์˜ ๋„ˆ๋น„๋กœ ์„ค์ •
      setscrollWidth(scrollPercentage);
    };
    // ์Šคํฌ๋กค ์‹œ handleScroll ์‹คํ–‰
    window.addEventListener('scroll', handleScroll);
    return () => { // ํด๋ฆฐ์—… ํ•จ์ˆ˜!
      window.removeEventListener('scroll', handleScroll);
    };
  });
  return (
    <>
      <div
        style={{
          position: 'fixed',
          top: 0,
          left: 0,
          width: `${scrollWidth}%`,
          height: '10px',
          background: 'green',
        }}></div>
      <div
        style={{
          position: 'fixed',
          bottom: '50px',
          left: '50%',
          transform: 'translateX(-50%)',
        }}>
        ์Šคํฌ๋กค ์ง„ํ–‰๋„ : {scrollWidth.toFixed(0)}%
      </div>
    </>
  );
};

 

 

 


3. ํƒ€์ด๋จธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ

๋‹ค์Œ ์ฝ”๋“œ๋Š” 3์ดˆ์•ˆ์— ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์ง€ ์•Š์œผ๋ฉด alert์ฐฝ์„ ๋„์›Œ์ค€๋‹ค.

function App() {
  return (
    <>
      <AlertTimer />
    </>
  );
}

// ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด alertํ•˜๋Š” ํƒ€์ด๋จธ ๊ฐ์ฒด
const AlertTimer = () => {
  // alert์˜ ์ƒํƒœ ์ƒ์„ฑ
  const [showAlert, setShowAlert] = useState(true);

  useEffect(() => {
    // 3์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด alert ์‹คํ–‰
    // setTimeout์€ ํƒ€์ด๋จธ ์•„์ด๋””๋ฅผ ์ˆซ์žํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    const setTimeoutId = setTimeout(() => {
      // showAlert๊ฐ€ true๋ผ๋ฉด alert, ์•„๋‹ˆ๋ฉด null
      showAlert === true ? alert('์‹œ๊ฐ„์ดˆ๊ณผ') : null;
    }, 3000);
    return () => {
      // ์œ„์—์„œ ๋ฐ›์•„์˜จ ํƒ€์ด๋จธ ์•„์ด๋”” ์ธ์ž๋กœ ๋„˜๊ฒจ, ํ•ด๋‹น ํƒ€์ด๋จธ๋ฅผ ์ œ๊ฑฐํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.
      clearTimeout(setTimeoutId);
    };
  });
  
  // 3์ดˆ ์•ˆ์— ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์•ผ showAlert๊ฐ’์ด false๋กœ ๋ณ€๊ฒฝ๋ผ alert ์ฐฝ์ด ์—ด๋ฆฌ์ง€ ์•Š์Œ
  return <button onClick={() => setShowAlert(false)}>๋นจ๋ฆฌ ํด๋ฆญ!!</button>;
};

 

+ ์—ฌ๊ธฐ์„œ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋„ฃ๋Š” ๊ฒฝ์šฐ

 

[] : showAlert์˜ ์ดˆ๊ธฐ๊ฐ’(true)๋ฅผ ๊ธฐ์–ตํ•œ ์ƒํƒœ๋กœ ๋งˆ์šดํŠธํ• ๋•Œ๋งŒ useEffect๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ 3์ดˆ ๋’ค์— alert์ฐฝ์„ ๋„์šด๋‹ค.

[showAlert] - ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ๊ฒฝ์šฐ : 

  1. showAlert ๊ฐ’์ด true → false๋กœ ๋ณ€ํ™”
  2. ์˜์กด์„ฑ ๋ฐฐ์—ด [showAlert]์— ์˜ํ•ด useEffect ์žฌ์‹คํ–‰, ์ด์ „ ํƒ€์ด๋จธ๋Š” ํด๋ฆฐ์—… ํ•จ์ˆ˜๋กœ ์ œ๊ฑฐ๋˜๊ณ  ์ƒˆ๋กœ์šด setTimeout์ด ์žฌ์‹คํ–‰๋จ
  3. ๊ทธ๋Ÿฌ๋‚˜ showAlert = false์ด๋ฏ€๋กœ 3์ดˆ๋’ค์— ์กฐ๊ฑด์— ๊ฑธ๋ ค alert๊ฐ€ ์‹คํ–‰์ด ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋๋‚œ๋‹ค

[showAlert] - ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์ง€ ์•Š์€ ๊ฒฝ์šฐ :

  1. showAlert ๊ฐ’์ด ๋ณ€ํ™”ํ•˜์ง€ ์•Š์Œ
  2. 3์ดˆ ๋’ค์— alert์ฐฝ์„ ๋„์›€, ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ์ข…๋ฃŒ

 

 

์˜์กด์„ฑ ๋ฐฐ์—ด์„ []๋กœ ๋น„์šธ๊ฑฐ๋ฉด useRef๋กœ ์“ฐ๋Š”๊ฒŒ ๋‚˜์€๋ฐ, ์ด๋Š” ๋‹ค์Œ ๊ธ€๋กœ... 

 

 

 

์ฐธ๊ณ 
ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ : https://ko.legacy.reactjs.org/docs/state-and-lifecycle.html
Effect Hook : https://ko.legacy.reactjs.org/docs/react-component.html
, https://ko.legacy.reactjs.org/docs/hooks-effect.html

์ด๋ฏธ์ง€ ์ถœ์ฒ˜
class component : https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/
function component : https://wavez.github.io/react-hooks-lifecycle/ 

 

'react' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React / custom Hook  (1) 2025.04.11
React / useRef  (0) 2025.04.11
React / Router ์‹ค์Šต - ๋™๋ฌผ ์ •๋ณด ์‚ฌ์ดํŠธ ๋งŒ๋“ค๊ธฐ  (0) 2025.04.09
React / Router  (0) 2025.04.09
React / ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง  (0) 2025.04.09