Search
Duplicate

Lifecycle

Lifecycle Methods (์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ)

์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ํŠน์ • ์‹œ์ ์— ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ

Mounting

๋ฉ”์†Œ๋“œ
์„ค๋ช…
constructor(props)
์ปดํฌ๋„ŒํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
getDerivedStateFromProps()
ํ”„๋กญ์Šค์˜ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
render()
ํ˜„์žฌ ์ƒํƒœ์™€ ํ”„๋กญ์Šค์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ UI๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
componentDidMount()
์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์— ๋งˆ์šดํŠธ๋œ ํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

Updating

๋ฉ”์†Œ๋“œ
์„ค๋ช…
getDerivedStateFromProps()
ํ”„๋กญ์Šค์˜ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
shouldComponentUpdate()
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
render()
ํ˜„์žฌ ์ƒํƒœ์™€ ํ”„๋กญ์Šค์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ UI๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
getSnapshotBeforeUpdate()
DOM์ด ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ์ „์— ์ •๋ณด๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.
componentDidUpdate()
์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์—…๋ฐ์ดํŠธ๋œ ํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

Unmounting

๋ฉ”์†Œ๋“œ
์„ค๋ช…
componentWillUnmount()
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ํ•ด์ œ๋˜๊ณ  ์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ (Lifecycle)

React ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” 3๊ฐ€์ง€ ์ฃผ์š” ๋‹จ๊ณ„

Mounting

: ์ปดํฌ๋„ŒํŠธ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ DOM ์— ์‚ฝ์ž…๋˜๋Š” ๋‹จ๊ณ„

Updating

: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋‹จ๊ณ„

Unmounting

: ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM ์—์„œ ์ œ๊ฑฐ๋˜๋Š” ๋‹จ๊ณ„

Mounting

โ€ข
constructor(props)
โ€ข
getDerivedStateFromProps()
โ€ข
render()
โ€ข
componentDidMount()

constructor(props)

โ€ข
์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ๋กœ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ฒ˜์Œ์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
โ€ข
props๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ super(props)๋กœ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ฃผ๋กœ ์ดˆ๊ธฐ ์ƒํƒœ์˜ ์„ค์ •๊ณผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฐ”์ธ๋”ฉ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

getDerivedStateFromProps()

โ€ข
Mounting ๋‹จ๊ณ„์—์„œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  render ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
โ€ข
props์™€ state๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ผ๋ฐ˜์ ์œผ๋กœ props์— ์˜์กด์ ์ธ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

render()

โ€ข
render ๋ฉ”์„œ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ UI๋ฅผ ์ •์˜ํ•˜๊ณ , React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
render ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์‹ค์ œ DOM์— ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— getDerivedStateFromProps์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

componentDidMount()

โ€ข
์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์— ์‚ฝ์ž…๋œ ํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
โ€ข
์ฃผ๋กœ ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋“ฑ์˜ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€ข
์ด ๋‹จ๊ณ„์—์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜์–ด UI๊ฐ€ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.

Updating

โ€ข
getDerivedStateFromProps()
โ€ข
shouldComponentUpdate()
โ€ข
render()
โ€ข
getSnapshotBeforeUpdate()
โ€ข
componentDidUpdate()

getDerivedStateFromProps()

โ€ข
Updating ๋‹จ๊ณ„์—์„œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  render ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
โ€ข
props์™€ state๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ฃผ๋กœ props์— ์˜์กดํ•˜๋Š” ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

shouldComponentUpdate()

โ€ข
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
โ€ข
true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๊ณ , false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐฉ์ง€๋ฉ๋‹ˆ๋‹ค.
โ€ข
์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

render()

โ€ข
render ๋ฉ”์„œ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ UI๋ฅผ ์ •์˜ํ•˜๊ณ , React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜์–ด UI๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

getSnapshotBeforeUpdate()

โ€ข
render ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ดํ›„, ์‹ค์ œ๋กœ DOM์— ์ปค๋ฐ‹๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
โ€ข
์ฃผ๋กœ ์—…๋ฐ์ดํŠธ ์ „์˜ DOM ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

componentDidUpdate()

โ€ข
์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์™„๋ฃŒํ•œ ํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
โ€ข
์ด ๋‹จ๊ณ„์—์„œ ์ด์ „ props ๋ฐ state์™€ ์ตœ์‹  props ๋ฐ state์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์ฃผ๋กœ ์—…๋ฐ์ดํŠธ ์ดํ›„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Unmounting

โ€ข
componentWillUnmout()

componentWillUnmout()

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

์˜ˆ์‹œ์ฝ”๋“œ

import React, { Component } from 'react'; class LifecycleClass extends Component { constructor(props) { super(props); console.log('constructor: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค.'); this.state = { data: null, }; } static getDerivedStateFromProps(nextProps, prevState) { console.log('getDerivedStateFromProps: nextProps์™€ prevState๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.'); return null; } componentDidMount() { console.log('componentDidMount: ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์— ๋งˆ์šดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'); // ๋น„๋™๊ธฐ ์ž‘์—…, ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. this.fetchData(); } shouldComponentUpdate(nextProps, nextState) { console.log('shouldComponentUpdate: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.'); return true; } getSnapshotBeforeUpdate(prevProps, prevState) { console.log('getSnapshotBeforeUpdate: ๊ฐ€์ƒ DOM์—์„œ ์‹ค์ œ DOM์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.'); return null; } componentDidUpdate(prevProps, prevState, snapshot) { console.log('componentDidUpdate: ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์—…๋ฐ์ดํŠธ๋œ ํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.'); } componentWillUnmount() { console.log('componentWillUnmount: ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.'); } fetchData() { // ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. setTimeout(() => { console.log('๋ฐ์ดํ„ฐ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค!'); this.setState({ data: '๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ' }); }, 2000); } render() { console.log('render: ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ์ค‘์ž…๋‹ˆ๋‹ค.'); return ( <div> <h1>์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ์˜ˆ์ œ</h1> <p>๋ฐ์ดํ„ฐ: {this.state.data}</p> </div> ); } } export default LifecycleClass;
JavaScript
๋ณต์‚ฌ
import React, { useState, useEffect, useRef, useMemo } from 'react'; const LifecycleFunction = (props) => { // constructor ๋Œ€์‹  useState๋กœ ์ƒํƒœ ์ดˆ๊ธฐํ™” console.log('constructor: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค.'); const [data, setData] = useState(null); const [count, setCount] = useState(0); const [otherValue, setOtherValue] = useState(0); // useMemo - ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ›… // - ์ฒซ ๋ฒˆ์งธ ์ธ์ž: ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•  ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜ // - ๋‘ ๋ฒˆ์งธ ์ธ์ž: ์˜์กด์„ฑ ๋ฐฐ์—ด - ๋ฐฐ์—ด ๋‚ด ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์žฌ๊ณ„์‚ฐ // - ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด์ „์— ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉ // - ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ณ„์‚ฐ์„ ์ตœ์ ํ™”ํ•  ๋•Œ ์‚ฌ์šฉ // - ๋ Œ๋”๋ง๋งˆ๋‹ค ์‹คํ–‰๋˜์ง€ ์•Š์•„ ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ๋ฐฉ์ง€ // ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด๋ž€? // : ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜์—ฌ ๋™์ผํ•œ ์ž…๋ ฅ์— ๋Œ€ํ•ด ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ์ €์žฅ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ• const expensiveCalculation = useMemo(() => { console.log('useMemo: ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ ์ค‘...'); // ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (count๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์‹คํ–‰) let result = 0; for (let i = 0; i < 1000000; i++) { result += count; } return result; }, [count]); // count๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์žฌ๊ณ„์‚ฐ, otherValue๊ฐ€ ๋ณ€ํ•ด๋„ ์žฌ๊ณ„์‚ฐ ์•ˆ ํ•จ // getDerivedStateFromProps - ๋ Œ๋”๋ง ์ค‘์— ์ฒ˜๋ฆฌ console.log('getDerivedStateFromProps: nextProps์™€ prevState๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.'); // ์ด์ „ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ref (componentDidUpdate์šฉ) const prevDataRef = useRef(); // getSnapshotBeforeUpdate ๋Œ€์ฒด - DOM ์—…๋ฐ์ดํŠธ ์ „ ๊ฐ’ ์ €์žฅ useEffect(() => { console.log('getSnapshotBeforeUpdate: ๊ฐ€์ƒ DOM์—์„œ ์‹ค์ œ DOM์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.'); prevDataRef.current = data; }); // componentDidMount - ๋งˆ์šดํŠธ ์‹œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ useEffect(() => { console.log('componentDidMount: ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์— ๋งˆ์šดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'); // ๋น„๋™๊ธฐ ์ž‘์—…, ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. fetchData(); // componentWillUnmount - cleanup ํ•จ์ˆ˜ return () => { console.log('componentWillUnmount: ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.'); }; }, []); // ๋นˆ ๋ฐฐ์—ด: ๋งˆ์šดํŠธ/์–ธ๋งˆ์šดํŠธ ์‹œ์—๋งŒ ์‹คํ–‰ // componentDidUpdate - data๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ useEffect(() => { if (prevDataRef.current !== undefined) { console.log('componentDidUpdate: ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์—…๋ฐ์ดํŠธ๋œ ํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.'); } }, [data]); // shouldComponentUpdate - React.memo๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ (์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ) console.log('shouldComponentUpdate: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.'); const fetchData = () => { // ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. setTimeout(() => { console.log('๋ฐ์ดํ„ฐ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค!'); setData('๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ'); }, 2000); }; // render console.log('render: ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ์ค‘์ž…๋‹ˆ๋‹ค.'); return ( <div> <h1>์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ์˜ˆ์ œ</h1> <p>๋ฐ์ดํ„ฐ: {data}</p> <hr /> <h2>useMemo ์˜ˆ์ œ</h2> <p>Count: {count}</p> <p>๊ณ„์‚ฐ๋œ ๊ฐ’ (useMemo): {expensiveCalculation}</p> <p>๋‹ค๋ฅธ ๊ฐ’: {otherValue}</p> <button onClick={() => setCount(count + 1)}> Count ์ฆ๊ฐ€ (useMemo ์žฌ๊ณ„์‚ฐ) </button> <button onClick={() => setOtherValue(otherValue + 1)}> ๋‹ค๋ฅธ ๊ฐ’ ์ฆ๊ฐ€ (useMemo ์žฌ๊ณ„์‚ฐ ์•ˆ ํ•จ) </button> <p style={{ fontSize: '12px', color: '#666', marginTop: '10px' }}> ๐Ÿ’ก "๋‹ค๋ฅธ ๊ฐ’ ์ฆ๊ฐ€" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด๋„ useMemo๋Š” ์žฌ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ฝ˜์†” ํ™•์ธ) </p> </div> ); }; export default LifecycleFunction;
JavaScript
๋ณต์‚ฌ