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

 

 

1. useEffect ๋ž€?

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋žœ๋”๋ง ์ดํ›„์— ์‹คํ–‰์‹œํ‚ฌ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค. useEffect์˜ effect๋Š” side-effect๋ผ๋Š” ๋œป์ด๋ฉฐ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋žœ๋”๋ง ๋œ ํ›„ (main-effect) ์— ํ•ด์•ผํ•  ์ž‘์—…๋“ค์„ ๋งํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ ์ •๋ณด๋ฅผ ๋‹ค๋ฅธ ๋ฐ์„œ ๊ฐ€์ ธ์™€ ๋‚˜์ค‘์— ๋‚ด์šฉ์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค๊ฑฐ๋‚˜, ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋“ฑ์˜ ์ž‘์—…์„ ํ•˜๋Š” ์ž‘์—…๋“ค์— ํ•ด๋‹นํ•œ๋‹ค. DOM ์—…๋ฐ์ดํŠธ, Browser Paint๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์— UseEffect๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ฐธ๊ณ ๋กœ useEffect๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ componentDidMount, componentDidUpdate ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

 

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

1) callback

: render()ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋ฉฐ, return ๊ฐ’์œผ๋กœ clean-up ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

2) dependency

: Skipping effect๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด effect๋ฅผ ์„ ํƒ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. render() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด, dependency๋ฅผ ๊ฑฐ์ณ effect๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ํ•œ๋ฒˆ๋” ํ•„ํ„ฐ๋งํ•œ๋‹ค. ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•  ๋ณ€์ˆ˜๋“ค์„ ๋ฐฐ์—ด์— ๋‹ด์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ฐ”๋€ ๊ฐ’์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋งŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. deps๋ฅผ ์ƒ๋žตํ•˜๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋žœ๋”๋ง ๋  ๋•Œ ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค. deps๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ด๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ, ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋ฉฐ didMount ์—ญํ• ๋งŒํ•˜๊ณ , didUpdate ์—ญํ• ์€ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

// ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋žœ๋”๋ง ๋  ๋•Œ ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.

useEffect(() => {
	console.log("useEffect๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.")
	return () => {
    	console.log("์ƒˆ๋กœ์šด useEffect๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.")
    }
});
// ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์ดˆ๋กœ ๋งˆ์šดํŠธ ๋  ๋•Œ๋งŒ ์‹คํ–‰๋œ๋‹ค.

useEffect(() => {
	console.log("useEffect๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.")
	return () => {
    	console.log("์ปดํฌ๋„ŒํŠธ ์ œ๊ฑฐ๋  ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค.")
    }
},[]);
// ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ๋ฐ”๋€” ๋•Œ ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.

useEffect(() => {
	console.log(`useEffect๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค. newState:${state}`)
	return () => {
    	console.log(`useEffect๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ ๋งˆ๋‹ค ์ด์ „์˜ effect๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋œ๋‹ค. 
        prevState: ${state} `)
    }
},[state]);

3) clean-up ๊ตฌํ˜„

- useEffect๊ฐ€ ๋‹ค์‹œ ํ•œ๋ฒˆ ์‹คํ–‰๋  ๋•Œ, ์ด์ „์— ์‹คํ–‰ํ–ˆ๋˜ ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„๋œ ํ•จ์ˆ˜๋‹ค.
- ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ componentWillUnMount ์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
- clean-up ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ด์ „์˜ state๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋Š”๋ฐ, ๋งŒ์•ฝ clean-upํ•˜์ง€ ์•Š์œผ๋ฉด, ์ปดํฌ๋„ŒํŠธ๋Š” ์‚ฌ๋ผ์ง€๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋Š” ๊ณ„์† ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

useEffect(() => {
    console.log(`effect: ${count}`)
    return () => {
      console.log(`clean-up: ${count}`)
    }
},[count])

์‹คํ–‰ ์ˆœ์„œ (ํด๋ฆญ ์‹œ count 1 ์ฆ๊ฐ€)

1. effect: 0 (์ฒ˜์Œ ๋žœ๋”๋ง ๋์„ ๋•Œ)
2. clean-up: 0 (ํด๋ฆญ ์‹œ)
3. effect:1

 

3) useEffect๋Š” ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

function FuncComp(props){
  
  useEffect(function(){
    console.log("useEffect A")
  })

  useEffect(function(){
    console.log("useEffect B")
  })
}
๋ฐ˜์‘ํ˜•