230914 React LifeCycle

๋‚˜์œค๋นˆยท2023๋…„ 9์›” 14์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
54/55

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

1. ๋งˆ์šด๋“œ(Mounting)

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

  • getDerivedStateFromProps : props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ props๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ state๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • render : ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•œ๋‹ค.

  • componentDidMount : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ์ฒ˜์Œ์œผ๋กœ ๋žœ๋”๋ง๋œ ํ›„ ํ˜ธ์ถœ๋œ๋‹ค. ์ฃผ๋กœ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ์˜ ๋กœ๋”ฉ, ์™ธ๋ถ€ API ํ˜ธ์ถœ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

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

  • getDerivedStateFromProps : ๋งˆ์šดํŠธ ๋‹จ๊ณ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ props ๋ณ€๊ฒฝ ์‹œ ํ˜ธ์ถœ๋˜๋ฉฐ, ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • shouldComponentUpdate : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•  ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฝ์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • render : ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋žœ๋”๋งํ•œ๋‹ค.

  • getSnapshotBeforeUpdate : ์‹ค์ œ DOM ์—…๋ฐ์ดํŠธ ์ „์— ํ˜ธ์ถœ๋˜๋ฉฐ ์ฃผ๋กœ ์ด์ „ ์ƒํƒœ์™€ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์Šคํฌ๋กค ์œ„์น˜ ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

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

  • componentWillUnmount : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋œ๋‹ค. ์ฃผ๋กœ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•ด์ œ, ํƒ€์ด๋จธ ์ œ๊ฑฐ ๋“ฑ ๋ฆฌ์†Œ์Šค ํ•ด์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿ“Œ ํ•œํŽธ, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ React Hook์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ(state) ๊ด€๋ฆฌ์™€ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒํƒœ์™€ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ Hook์œผ๋กœ๋Š” useState ์™€ useEffect ๊ฐ€ ์žˆ๋‹ค.

1. useState

useState : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ˜„์žฌ ์ƒํƒœ์™€ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

import React, { useState } from 'react';

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

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increase</button>
    </div>
  );
}

2. useEffect

useEffect : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ์™€ ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋œ๋‹ค. useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ, ์—…๋ฐ์ดํŠธ๋  ๋•Œ, ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋œ ํ›„ ์‹คํ–‰๋˜๋Š” ๋กœ์ง์€ ํ›…์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ž‘์„ฑํ•œ๋‹ค.

    useEffect(() => {
      // ๋งˆ์šดํŠธ ์‹œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
    }, []);
    
  2. ํŠน์ • ์ƒํƒœ ๋˜๋Š” props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ๋กœ์ง์€ ํ›…์˜ ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์ž‘์„ฑํ•œ๋‹ค.

    useEffect(() => {
      // ํŠน์ • ์ƒํƒœ ๋˜๋Š” props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
    }, [dependency]);
    
  3. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ๋กœ์ง์€ ํ›…์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•œ๋‹ค. ์ด๋Š” cleanup ํ•จ์ˆ˜๋ผ ์นญํ•œ๋‹ค.

    useEffect(() => {
      return () => {
        // ์–ธ๋งˆ์šดํŠธ ์‹œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
      };
    }, []);
    

๐Ÿ“Œ ์ด์ฒ˜๋Ÿผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ React Hook์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ์™€ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ๋Š” ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๋ฉฐ ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฟˆ๊พธ๋Š”

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