๐Ÿ…

3. useEffect

3.1 useEffect๋ž€?

3.1.1 useEffect์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

ย 
๊ทธ๋ฆผ 3-1 ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ทธ๋ฆผ 3-1 ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ
๊ทธ๋ฆผ 3-1 ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ
์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ์ฒ˜์Œ ๋‚˜ํƒ€๋‚  ๋•Œ๋ฅผ โ€˜๋งˆ์šดํŠธ(Mount)โ€™๋ผ๊ณ  ํ•˜๊ณ , ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์งˆ ๋•Œ๋ฅผ โ€˜์–ธ๋งˆ์šดํŠธ(Unmount)โ€™ ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜์„œ ์‚ฌ๋ผ์งˆ ๋•Œ๊นŒ์ง€์˜ ์ผ์ƒ์„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
ย 
React ์•ฑ์ด ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๋งˆ์šดํŠธ ์ƒํƒœ์— ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์šดํŠธ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด React๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ณ„์‚ฐํ•ด ๊ฐ€์ƒ DOM์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ€์ƒ DOM์œผ๋กœ ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•œ ํ›„, ๋ Œ๋”๋ง๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ์‹ค์ œ DOM์— ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹ค์ œ DOM์— ์—…๋ฐ์ดํŠธ๋œ ๋‚ด์šฉ์ด ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋Š” ํŽ˜์ธํŒ… ๊ณผ์ •๊นŒ์ง€๋ฅผ ๋ฐŸ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
API๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์ธ HTTPํ†ต์‹  ์ž‘์—…์€ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ปดํฌ๋„ŒํŠธ์˜ ๋ณธ๋ฌธ ์•ˆ์— HTTPํ†ต์‹  ์ž‘์—…์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์ž‘์—…์„ ๋‹ค์‹œ ์š”์ฒญํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. API๋กœ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ํด ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์˜ ํŽ˜์ธํŒ… ์ž‘์—…์ด ๋Šฆ์ถฐ์ ธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋น„ํšจ์œจ์ ์œผ๋กœ ์šด์˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
์ด๋Ÿฌํ•œ ๋ถ€์ˆ˜ํšจ๊ณผ(Side Effects)๋“ค์€ ์ฃผ์š” ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐ์— ์ง์ ‘์ ์œผ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ฃผ์š” ๋ Œ๋”๋ง ์ž‘์—…๊ณผ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ฒ„๊ทธ๋ฅผ ์˜ˆ๋ฐฉํ•˜๋Š” ๋ฐ์—๋„ ๋„์›€์„ ์ค„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ข‹์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ์— ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ React Hook์ด ๋ฐ”๋กœ useEffect์ž…๋‹ˆ๋‹ค.
ย 
๐Ÿ’ก
๋ถ€์ˆ˜ํšจ๊ณผ(Side Effect) ๋ž€?
๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ์—๋Š” โ€˜render()ย ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €์™€ ์ง์ ‘์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.โ€™ ๋ผ๊ณ  ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜๋ฉด render() ํ•จ์ˆ˜๋Š” ์ฃผ์š” ํ™”๋ฉด์˜ ๋ Œ๋”๋ง๋งŒ์„ ๋‹ด๋‹นํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ๋ฐ–์— ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ๋“ค์„ ๋ถ€์ˆ˜ํšจ๊ณผ๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ย 
๊ธฐ์กด์˜ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ๋ฐฉ์‹์—์„œ๋Š” ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
import React from "react"; class Section1 extends React.Component { constructor(props) { super(props); this.state = { count: 0, }; } componentDidMount() { console.log("ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚จ ๐Ÿ™‚"); } componentDidUpdate() { console.log("์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ ๐Ÿ˜‹"); } componentWillUnmount() { console.log("์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค ..."); } render() { return ( <div> <h2>ํด๋ฆญํ•œ ํšŸ์ˆ˜: {this.state.count}</h2> <button onClick={() => this.setState({ count: this.state.count + 1 })}> Click Me๐Ÿ’› </button> </div> ); } } export default Section1;
componentDidMount, componentDidUpdate, componentWillUnmount ๋Š” ๋Œ€ํ‘œ์ ์ธ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. componentDidMount ๋Š” ์ œ์ผ ์ฒ˜์Œ ๋ Œ๋”๋ง ํ›„ ๋”์ด ์—…๋ฐ์ดํŠธ๋˜๋Š” ์งํ›„์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค setState ๊ฐ€ ์‹คํ–‰๋˜์–ด ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜ componentDidUpdate ๋ฉ”์„œ๋“œ๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. componentWillUnmount ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋˜์–ด DOM์—์„œ ์ œ๊ฑฐ๋  ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-2 ์ฝ”๋“œ ์‹คํ–‰ ํ™”๋ฉด๊ทธ๋ฆผ 3-2 ์ฝ”๋“œ ์‹คํ–‰ ํ™”๋ฉด
๊ทธ๋ฆผ 3-2 ์ฝ”๋“œ ์‹คํ–‰ ํ™”๋ฉด
ย 
useEffect Hook์€ ์ด๋Ÿฌํ•œ React ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ์ธ componentDidMount, componentDidUpdate, componentWillUnmount ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•œ React Hook์ž…๋‹ˆ๋‹ค. useEffect Hook์„ ์‚ฌ์šฉํ•˜๋ฉด React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋ Œ๋”๋ง ๋œ ์ดํ›„, ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ์™€ ์–ธ๋งˆ์šดํŠธ ๋  ๋•Œ๊ฐ€ ๋ถ„๊ธฐ๋˜์–ด ์„œ๋กœ ๋‹ค๋ฅธ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ˜๋ฉด, useEffect Hook์„ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๊ด€๋ จ ์ฝ”๋“œ๋“ค์„ ๋ชจ์•„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ ํ•ด์„ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

3.1.2 useEffect์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ๋™์ž‘๋ฐฉ์‹

ย 
React ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ componentDidMount , componentDidUpdate, componentWillUnmount๊ฐ€ useEffect์—์„œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. useEffect Hook์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ย 
useEffect(()=> { //์ž‘์—… ๋‚ด์šฉ (Callback ํ•จ์ˆ˜ ์ž‘์„ฑ) }, [, depsList])
ย 
useEffect๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ์ธ์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ž‘์—… ๋‚ด์šฉ์„ ๋‹ด์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์˜์กด์„ฑ ๋ฐฐ์—ด(Array dependencies)์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๋ฐฐ์—ด์ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ž‘์—… ๋‚ด์šฉ์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜์ง€๋งŒ, ์˜์กด์„ฑ ๋ฐฐ์—ด์€ ์˜ต์…˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ์ ์œผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
์˜์กด์„ฑ ๋ฐฐ์—ด์— ์ง€์ •ํ•œ ์ƒํƒœ๋‚˜ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ์— useEffect Hook์— ์ง€์ •ํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ์ „๋‹ฌ๊ฐ’์— ๋”ฐ๋ผ useEffect Hook์ด ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
useEffect(()=> { //์ž‘์—… ๋‚ด์šฉ (Callback ํ•จ์ˆ˜ ์ž‘์„ฑ) })
ย 
์ฒซ ๋ฒˆ์งธ๋กœ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์€ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” componentDidMount ์™€ componentDidUpdate ๋ฅผ ํ•ฉ์นœ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋ Œ๋”๋ง ๋œ ์งํ›„์— ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜ ์ธ์ž์ธ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ , props๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•ด ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
ย 
useEffect(()=> { //์ž‘์—… ๋‚ด์šฉ (Callback ํ•จ์ˆ˜ ์ž‘์„ฑ) },[])
ย 
๋‹ค์Œ์œผ๋กœ ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. componentDidMount์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋งˆ์šดํŠธ๋˜๊ณ  ์ฒซ ๋ Œ๋”๋ง์ด ๋๋‚œ ์งํ›„์—๋งŒ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
ย 
useEffect(()=> { //์ž‘์—… ๋‚ด์šฉ (Callback ํ•จ์ˆ˜ ์ž‘์„ฑ) }, [state, props.a])
ย 
์œ„์™€ ๊ฐ™์ด ๋ฐฐ์—ด์— ์ƒํƒœ๋‚˜ ์†์„ฑ์„ ์ง€์ •ํ•  ๊ฒฝ์šฐ์—๋Š” componentDidMount ์™€ componentDidUpdate ๋ฅผ ํ•ฉ์นœ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋ Œ๋”๋ง ๋œ ์งํ›„(componentDidMount)์—๋„ ์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜ ์ธ์ž์ธ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ , ์ด ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ์–ด๋–ค ๊ฐ’์— ๋ณ€๊ฒฝ์ด ์ƒ๊ฒผ์„ ๋•Œ(componentDidUpdate)๋„ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์ง€์ •ํ•œ ์š”์†Œ๋ฅผ ๊ด€์ฐฐํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ์š”์†Œ์˜ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์ด๋ ‡๊ฒŒ ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฐ’๋“ค์— ์˜์กดํ•˜๊ณ  ์žˆ์–ด, ์ด ๋ฐฐ์—ด์„ ์˜์กด์„ฑ ๋ฐฐ์—ด(Array dependencies) ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
ย 
useEffect(()=> { return () => { //cleanUp } }, [state, props.a])
ย 
๊ทธ๋Ÿผ componentWillUnmount๋Š” useEffect Hook์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„๋ ๊นŒ์š”? ๋ฐ”๋กœ ์ด ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ๋ฐ˜ํ™˜๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋  ๋•Œ ์ด ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ˜ํ™˜๋˜์–ด ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •๋ฆฌ ํ•จ์ˆ˜(clean-up function)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ถ”ํ›„ 3.6์ ˆ์—์„œ ์ƒ์„ธํ•˜๊ฒŒ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 

3.2 useEffect ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

3.2.1 ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ๋™์ž‘ํ•˜๋Š” useEffect

ย 
์•ž 3.2์ ˆ์—์„œ useEffect Hook์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์‹ค์ œ ์˜ˆ์ œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋ฆฌ๋ Œ๋”๋ง์ด ๋  ๋•Œ๋งˆ๋‹ค ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋งˆ์šดํŠธ ์‹œ์ ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ์˜ˆ์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
ย 
ex. ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ์˜ˆ
// Section3.js import React, { useEffect, useState } from "react"; const Section3 = () => { const [count, setCount] = useState(0); useEffect(() => { console.log("๋ Œ๋”๋ง ๋˜๊ณ  ์žˆ๋‚˜์š”? ๐Ÿค”"); }); return ( <div> <h2>ํด๋ฆญํ•œ ํšŸ์ˆ˜: {count}</h2> <button type="button" onClick={(e) => setCount((count) => count + 1)}> Click Me! </button> </div> ); }; export default Section3;
ย 
โ€œClick Me!โ€ ๋ฒ„ํŠผ์—๊ฒŒ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ค„ ๋•Œ๋งˆ๋‹ค count์˜ ๊ฐ’์ด 1 ์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์•ˆ์— useEffect Hook์„ ๋„ฃ์–ด useEffect ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•  ๋•Œ๋งˆ๋‹ค ์ฝ˜์†”์ฐฝ์— โ€œ๋ Œ๋”๋ง ๋˜๊ณ  ์žˆ๋‚˜์š”? ๐Ÿค”โ€ ๋กœ๊ทธ๊ฐ€ ๋‚จ๋„๋ก ํ•˜๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ตœ์ดˆ ๋ Œ๋”๋ง์ด ๋˜์—ˆ์„ ๋•Œ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด๊ณผ ์ฝ˜์†”์ฐฝ์ด ์•„๋ž˜ ๊ทธ๋ฆผ 3-3๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-3๊ทธ๋ฆผ 3-3
๊ทธ๋ฆผ 3-3
ย 
์ตœ์ดˆ ๋ Œ๋”๋ง์ด ์ง„ํ–‰๋˜์—ˆ์„ ๋•Œ, ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฝ˜์†”์ฐฝ์— โ€œ๋ Œ๋”๋ง ๋˜๊ณ  ์žˆ๋‚˜์š”? ๐Ÿค”โ€ ๊ฐ€ ์ฐํžŒ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์ด ์ตœ์ดˆ ๋ Œ๋”๋ง ๋˜๋Š” ์‹œ์ ์— ์ด๋ฏธ ํ•œ ๋ฒˆ useEffect๊ฐ€ ๋™์ž‘ํ•˜์˜€๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
์ด์ œ ์ฒ˜์Œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด๊ณผ ์ฝ˜์†”์ฐฝ์„ ํ™•์ธํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด โ€œ๋ Œ๋”๋ง ๋˜๊ณ  ์žˆ๋‚˜์š”? ๐Ÿค”โ€๊ฐ€ ํ•œ ๋ฒˆ ๋” ์ฝ˜์†”์ฐฝ์— ์ถœ๋ ฅ๋˜์—ˆ์Œ์„ ์•„๋ž˜ ๊ทธ๋ฆผ 3-4๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ตœ์ดˆ ๋ Œ๋”๋ง ์ž‘์—…์—์„œ useEffect๊ฐ€ ๋™์ž‘ํ•œ ์ดํ›„, ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์— ๋”ฐ๋ฅธ count ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ์—…๋ฐ์ดํŠธํ•œ ๋’ค, ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” ๊ณผ์ • ์†์—์„œ useEffect์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ํ•œ ๋ฒˆ ๋” ๋™์ž‘ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-4๊ทธ๋ฆผ 3-4
๊ทธ๋ฆผ 3-4
ย 
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘ ๋ฒˆ์งธ ๋ฒ„ํŠผ์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฃผ์—ˆ์„ ๋•Œ ์ฒซ ๋ฒˆ์งธ์™€ ๊ฐ™์ด ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด๊ณผ ์ฝ˜์†”์ฐฝ์ด ์˜ˆ์ƒ๋œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•จ์„ ์•„๋ž˜ ๊ทธ๋ฆผ 3-5๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-5๊ทธ๋ฆผ 3-5
๊ทธ๋ฆผ 3-5
ย 
์ด์ฒ˜๋Ÿผ ์ตœ์ดˆ ๋ Œ๋”๋ง์ด ๋™์ž‘ํ•œ ์‹œ์ ์— useEffect Hook์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋™์ž‘๋˜๊ณ , ๊ทธ ์ดํ›„ ๋ฒ„ํŠผ์— ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ count ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๊ฒŒ ๋˜๋ฉด์„œ useEffect Hook์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ๊ธˆ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด์ฒ˜๋Ÿผ useEffect Hook์— ๋‘ ๋ฒˆ์งธ ์ธ์ž(argument)๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, useEffect ์•ˆ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ์œ„์˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ 3.4์ ˆ์—์„œ๋Š” ์ด useEffect Hook์„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์ดˆ๋กœ ๋งˆ์šดํŠธ ๋˜์—ˆ์„ ์‹œ์ ์—์„œ๋งŒ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๊ณ , ๊ทธ ์ดํ›„์—๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 

3.2.2 ๋งˆ์šดํŠธ ์‹œ์ ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” useEffect

ย 
์ตœ์ดˆ ๋ Œ๋”๋ง์—์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋˜๋Š” ๋•Œ์—๋งŒ useEffect Hook์ด ๋™์ž‘ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์–ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น useEffect ํ•จ์ˆ˜๊ฐ€ ์ปดํฌ๋„ŒํŠธ ์•ˆ์˜ ์–ด๋– ํ•œ ๊ฒƒ์—๋„ ์˜์กดํ•˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋‚ด์–ด ์ค๋‹ˆ๋‹ค.
๋‹ค์Œ ์•„๋ž˜์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•˜์—ฌ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜์˜ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ๋Š” ๊ธฐ์กด์˜ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ useEffect Hook์— ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋นˆ ๋ฐฐ์—ด๋งŒ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
ย 
ex. ์ตœ์ดˆ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ฒฝ์šฐ(๋งˆ์šดํŠธ ๋˜๋Š” ๋•Œ)์—๋งŒ useEffect Hook์ด ๋™์ž‘ํ•˜๋Š” ์˜ˆ
// Section4.js import React, { useEffect, useState } from "react"; const Section4 = () => { const [count, setCount] = useState(0); useEffect(() => { console.log("๋ Œ๋”๋ง ๋˜๊ณ  ์žˆ๋‚˜์š”? ๐Ÿค”"); }, []); return ( <div> <h2>ํด๋ฆญํ•œ ํšŸ์ˆ˜: {count}</h2> <button type="button" onClick={(e) => setCount((count) => count + 1)}> Click Me! </button> </div> ); }; export default Section4;
ย 
์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค, ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด๊ณผ ์ฝ˜์†”์ฐฝ์„ ํ™•์ธํ•˜๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ 3-6๊ณผ ๊ฐ™์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-6๊ทธ๋ฆผ 3-6
๊ทธ๋ฆผ 3-6
ย 
์•ž์„  3.3์ ˆ์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ๊ณผ ๊ฐ™์ด ์ตœ์ดˆ ๋ Œ๋”๋ง ์‹œ์ ์—์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋˜๋ฉฐ useEffect()๊ฐ€ ๋™์ž‘ํ•˜์˜€์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๊ด€์ฐฐํ•œ ๋ฐ”์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด์ œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ count ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œ์ผœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๋„๋ก ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-7๊ทธ๋ฆผ 3-7
๊ทธ๋ฆผ 3-7
ย 
useEffect Hook์— ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ๊ธฐ ์ „๊ณผ๋Š” ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์ฝ˜์†”์ฐฝ์— โ€œ๋ Œ๋”๋ง ๋˜๊ณ  ์žˆ๋‚˜์š”? ๐Ÿค”โ€๊ฐ€ ํ•œ ๋ฒˆ ๋” ์ถœ๋ ฅ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” useEffect์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์šฐ์—ฐ์ผ์ง€๋„ ๋ชจ๋ฅด๋‹ˆ ํ•œ ๋ฒˆ ๋” ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด๋ด…๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-8๊ทธ๋ฆผ 3-8
๊ทธ๋ฆผ 3-8
ย 
๋‘ ๋ฒˆ์งธ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฝ˜์†”์ฐฝ์— โ€œ๋ Œ๋”๋ง ๋˜๊ณ  ์žˆ๋‚˜์š”? ๐Ÿค”โ€๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•ž์„œ ์‚ดํŽด๋ณธ 3.3์ ˆ์˜ ๋‚ด์šฉ๊ณผ ๊ฐ™์ด, useEffect Hook์— ๋‘ ๋ฒˆ์งธ ์ธ์ž(argument)๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, useEffect ์•ˆ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ 3.3์ ˆ์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด, ์ด๋ฒˆ์—๋Š” ์ด useEffect Hook์— ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์–ด์คŒ์œผ๋กœ์จ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์ดˆ๋กœ ๋งˆ์šดํŠธ ๋˜์—ˆ์„ ์‹œ์ ์—์„œ๋งŒ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๊ณ , ๊ทธ ์ดํ›„์—๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ์Œ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.
ย 

3.2.3 ํŠน์ • ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ ๋™์ž‘ํ•˜๋Š” useEffect

ย 
3.3์ ˆ๊ณผ ๊ฐ™์ด ๋งค๋ฒˆ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค useEffect Hook์ด ๋™์ž‘ํ•˜๊ณ  ์ฝœ๋ฐฑํ•จ์ˆ˜์— console.log๊ฐ€ ์•„๋‹Œ ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๊ณ  ๊ต‰์žฅํžˆ ๋น„ํšจ์œจ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์ • ๊ฐ’์ด ๋ณ€ํ™”ํ•  ๋•Œ๋งŒ useEffect Hook์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์ฒซ ๋ฒˆ์งธ ์ธ์ž์— ์ฝœ๋ฐฑํ•จ์ˆ˜, ๋‘ ๋ฒˆ์งธ ์ธ์ž์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด์— useState ์ƒํƒœ๋‚˜ props๋กœ ๋ฐ›์€ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ž์— ๊ฐ’์ด ํฌํ•จ๋œ ๋ฐฐ์—ด์ด ๋“ค์–ด๊ฐ€๋ฉด ์ฒ˜์Œ ๋ Œ๋”๋ง ๋  ๋•Œ, ๋ฐฐ์—ด ์•ˆ์˜ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ useEffect Hook์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
ย 
ex. ํŠน์ • ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ useEffect Hook์ด ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ
import React, { useState, useEffect } from "react"; const Section5 = () => { const [text, setText] = useState(""); const textChange = (event) => { setText(event.target.value); }; useEffect(() => { console.log("๋ Œ๋”๋ง ๋˜๊ณ  ์žˆ๋‚˜์š”?"); }, []); useEffect(() => { console.log("text๊ฐ€ ๋ณ€ํ•˜๊ณ  ์žˆ๋‚˜์š”?"); }, [text]); return ( <div> <input type="text" value={text} onChange={textChange} /> <p>์ž…๋ ฅํ•œ ๋ฌธ๊ตฌ : {text}</p> </div> ); }; export default Section5;
ย 
input ์ฐฝ์— ๋ฌธ๊ตฌ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž…๋ ฅํ•œ ๊ทธ๋Œ€๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆผ 3-9๊ทธ๋ฆผ 3-9
๊ทธ๋ฆผ 3-9
ย 
์ตœ์ดˆ ๋ Œ๋”๋ง ์‹œ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. ์ฝ˜์†” ์ฐฝ์— โ€˜๋ Œ๋”๋ง์ด ๋˜๊ณ  ์žˆ๋‚˜์š”?โ€™์™€ โ€˜text๊ฐ€ ๋ณ€ํ•˜๊ณ  ์žˆ๋‚˜์š”?โ€™๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ ๋‘ ๊ฐœ์˜ useEffect Hook์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-10๊ทธ๋ฆผ 3-10
๊ทธ๋ฆผ 3-10
ย 
input ์ฐฝ์— hi๋ฅผ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ž์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์–ด์ค€ ์ฒซ ๋ฒˆ์งธ useEffect Hook์€ ๋” ์ด์ƒ ๋™์ž‘ํ•˜์ง€ ์•Š๊ณ  text ๊ฐ’์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋‘ ๋ฒˆ์งธ useEffect Hook๋งŒ h๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ํ•œ ๋ฒˆ, i๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ํ•œ ๋ฒˆ ์ด ๋‘ ๋ฒˆ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. text ๊ฐ’์„ ์กฐ๊ธˆ ๋” ๋ณ€ํ™” ์‹œ์ผœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-11๊ทธ๋ฆผ 3-11
๊ทธ๋ฆผ 3-11
ย 
input ์ฐฝ์— ๊ณต๋ฐฑ๊ณผ hello๋ฅผ ์ถ”๊ฐ€๋กœ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ 3-10์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ โ€˜text๊ฐ€ ๋ณ€ํ•˜๊ณ  ์žˆ๋‚˜์š”?โ€™๋ผ๋Š” ๋ฌธ์žฅ๋งŒ ์ถ”๊ฐ€๋กœ ์ฝ˜์†” ์ฐฝ์— ํ‘œ์‹œ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋‘ ๋ฒˆ์งธ ์ธ์ž์— ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์ตœ์ดˆ ๋ Œ๋”๋ง ๋•Œ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ํ•œ ๋ฒˆ ๋™์ž‘ํ•˜๊ณ  React๊ฐ€ ๋‘ ๋ฒˆ์งธ ์ธ์ž์˜ ์ƒํƒœ๋ฅผ ๋Š์ž„์—†์ด ์ถ”์ ํ•˜์—ฌ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ ๋งˆ๋‹ค useEffect์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

3.2.4 clean-up ํ•˜๋Š” useEffect

ย 
๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ ์ข…์ข… ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜๋ฉด ๋” ์ด์ƒ ํ•„์š”์—†๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์ •๋ฆฌํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํƒ€์ด๋จธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ ํƒ€์ด๋จธ ๋ฆฌ์…‹์„ ์œ„ํ•ด ์ด์ „ ๊ธฐ๋ก์„ ์ •๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์ •๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ด์ „ ์ž‘์—…์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
useEffect(()=> { return () => { //cleanUp } }, [state, props.a])
ย 
๋จผ์ € ์ •๋ฆฌํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ์•ž์„œ ์‚ดํŽด๋ณด์•˜๋“ฏ ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. useEffect ๋‚ด๋ถ€์—์„œ return ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ์€ ์ •๋ฆฌํ•จ์ˆ˜๋ฅผ ๋„ฃ์œผ๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋œ ํ›„ ์ •๋ฆฌํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
ย 
function Timer() { console.log("ํƒ€์ด๋จธ ์‹คํ–‰ ์ „"); useEffect(() => { const timer = setInterval(() => { console.log("ํƒ€์ด๋จธ ์ง„ํ–‰"); }, 1000); return () => { clearIneterval(timer); console.log("ํƒ€์ด๋จธ ์ข…๋ฃŒ"); }; }); return <p>ํƒ€์ด๋จธ ์ง„ํ–‰ ์ค‘</p>; }
ย 
์œ„ ์ฝ”๋“œ๋Š” setInterval์„ ์‚ฌ์šฉํ•˜์—ฌ 1์ดˆ๋งˆ๋‹ค ์ฝ˜์†”์— โ€œํƒ€์ด๋จธ ์ง„ํ–‰โ€์ด ๋‚˜์˜ค๋„๋ก ๋งŒ๋“  ํƒ€์ด๋จธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํƒ€์ด๋จธ ํ•จ์ˆ˜์—์„œ useEffect๋Š” clearIneterval์„ ์ •๋ฆฌ ํ•จ์ˆ˜์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ •๋ฆฌํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํƒ€์ด๋จธ ์ข…๋ฃŒ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž‘์—…์ด ๊ณ„์† ๋ˆ„์ ๋˜์–ด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ํƒ€์ด๋จธ ์‹คํ–‰ ๊ฐ„๊ฒฉ์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋กœ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด ์ •๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ์™€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ๋•Œ๋ฅผ ๋น„๊ตํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
function App() { const [startTimer, setStartTimer] = useState(false); return ( <> {startTimer && <Timer /> ? ( startTimer && <Timer /> ) : ( <p>ํƒ€์ด๋จธ ์‹คํ–‰ ์ค€๋น„</p> )} <button onClick={() => setStartTimer(!startTimer)}>Timer</button> </> ); }
ย 
ํƒ€์ด๋จธ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด App ์ปดํฌ๋„ŒํŠธ์— ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํƒ€์ด๋จธ๊ฐ€ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋ธŒ๋ผ์šฐ์ €์— โ€œํƒ€์ด๋จธ ์ง„ํ–‰ ์ค‘โ€์ด ๋œจ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด โ€œํƒ€์ด๋จธ ์‹คํ–‰ ์ค€๋น„โ€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์ •๋ฆฌํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ˜์†”์ฐฝ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์ž โ€œํƒ€์ด๋จธ ์ง„ํ–‰ ์ „โ€์ด ์ฝ˜์†”์ฐฝ์— ์ฐํžˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„ ํƒ€์ด๋จธ๊ฐ€ 5์ดˆ ์ •๋„ ์ง„ํ–‰๋˜๋ฉฐ ์ฝ˜์†”์— โ€œํƒ€์ด๋จธ ์ง„ํ–‰ ์ค‘โ€์ด 5๋ฒˆ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํƒ€์ด๋จธ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๊ทธ๊ฒƒ์€ ์ฝ˜์†”์ฐฝ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. useEffect๊ฐ€ ์ •๋ฆฌํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด clearIneterval ๋กœ ์ธํ•ด ํƒ€์ด๋จธ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  1์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์ง„ํ–‰๋˜๋˜ ์ž‘์—…์€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฒ„ํŠผ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋” ๋ˆŒ๋ €์„ ๋•Œ ํƒ€์ด๋จธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ 1์ดˆ๋งˆ๋‹ค ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-12๊ทธ๋ฆผ 3-12
๊ทธ๋ฆผ 3-12
๊ทธ๋ฆผ 3-13๊ทธ๋ฆผ 3-13
๊ทธ๋ฆผ 3-13
๊ทธ๋ฆผ 3-14๊ทธ๋ฆผ 3-14
๊ทธ๋ฆผ 3-14
ย 
์ •๋ฆฌํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด useEffect์—์„œ return์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋กœ ์ธํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋˜์–ด๋„ ์ด์ „ ๋ถ€์ˆ˜ ํšจ๊ณผ์˜ ๊ธฐ๋ก์ด ์ •๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ย 
function Timer() { console.log("ํƒ€์ด๋จธ ์‹คํ–‰ ์ „"); useEffect(() => { const timer = setInterval(() => { console.log("ํƒ€์ด๋จธ ์ง„ํ–‰"); }, 1000); return <p>ํƒ€์ด๋จธ ์ง„ํ–‰ ์ค‘</p>; }
ย 
์ •๋ฆฌํ•จ์ˆ˜๊ฐ€ ์—†์–ด๋„ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ธŒ๋ผ์šฐ์ €์— ๋‚˜ํƒ€๋‚˜๋Š” ๋ชจ์Šต์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜ ๊ทธ๋ฆผ 3-17 ์ฝ˜์†”์ฐฝ์„ ๋ณด๋ฉด ํƒ€์ด๋จธ ์ง„ํ–‰์ด ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹คํ–‰ ๊ธฐ๋ก์ด ๊ณ„์† ์Œ“์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ด๋จธ ์‹คํ–‰ ๊ฐ„๊ฒฉ์ด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์ผ์ •ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด 1์ดˆ๋งˆ๋‹ค ํƒ€์ด๋จธ๊ฐ€ ์‹คํ–‰๋˜์ง€๋งŒ ๋‘ ๋ฒˆ, ์„ธ ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋” ๋น ๋ฅธ ์†๋„๋กœ ์ฝ˜์†”์— โ€œํƒ€์ด๋จธ ์ง„ํ–‰ ์ค‘โ€์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ •๋ฆฌํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž‘์—…์ด ๋ˆ„์ ๋˜์–ด ํƒ€์ด๋จธ ๊ฐ„๊ฒฉ์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ •๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด์„œ๋„ ์ •๋ฆฌ ๊ณผ์ •์€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆผ 3-15๊ทธ๋ฆผ 3-15
๊ทธ๋ฆผ 3-15
๊ทธ๋ฆผ 3-16๊ทธ๋ฆผ 3-16
๊ทธ๋ฆผ 3-16
๊ทธ๋ฆผ 3-17๊ทธ๋ฆผ 3-17
๊ทธ๋ฆผ 3-17
ย 
์ •๋ฆฌ ํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค์™€ Hook์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ ์ •๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” componentDidMount์—์„œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  componentWillUnmount์—์„œ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useEffect Hook์ด ์ •๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ถ€์ˆ˜ ํšจ๊ณผ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— React๊ฐ€ ์ •๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค. React๋Š” ๋งˆ์šดํŠธ๊ฐ€ ํ•ด์ œ๋˜๊ณ  ์ •๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— React๋Š” ๋‹ค์Œ ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „๊นŒ์ง€ ์ด์ „ ๋ Œ๋”๋ง์˜ ์ •๋ฆฌ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ด๋จธ ์ฝ”๋“œ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
function Timer() { useEffect(() => { const timer = setInterval(() => {}, 1000); console.log("๋งˆ์šดํŠธ ๋  ๋•Œ ์‹คํ–‰"); return () => { console.log("์–ธ๋งˆ์šดํŠธ ๋  ๋•Œ ์‹คํ–‰"); clearInterval(timer); }; }); return <p>ํƒ€์ด๋จธ</p>; }
ย 
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ ์ฝ˜์†”์— โ€œ๋งˆ์šดํŠธ ๋  ๋•Œ ์‹คํ–‰โ€์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ํƒ€์ด๋จธ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋ฒ„ํŠผ์„ ๋‹ค์‹œ ๋ˆ„๋ฅด๋ฉด ์ฝ˜์†”์— "์–ธ๋งˆ์šดํŠธ ๋  ๋•Œ ์‹คํ–‰"์ด ๋‚˜ํƒ€๋‚˜๊ณ  ํƒ€์ด๋จธ๋Š” ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํ•จ์ˆ˜๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋˜๊ณ  ๋‚˜์„œ ์ •๋ฆฌํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ 3-18 ์ฝ˜์†”์ฐฝ์„ ํ†ตํ•ด ์œ„ ๊ณผ์ •์ด ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜์—ˆ์Œ์„ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 3-18๊ทธ๋ฆผ 3-18
๊ทธ๋ฆผ 3-18
ย 
ย 
ย