Notice
Recent Posts
Recent Comments
Link
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

POTATO THAT WANT TO BE HUMAN

[React] LiftCycle๊ณผ useEffect ๋ณธ๋ฌธ

FRONTEND/React

[React] LiftCycle๊ณผ useEffect

๋…œํž 2022. 11. 4. 15:44
๋ฐ˜์‘ํ˜•

๐Ÿ”Ž ๋ฆฌ์•กํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด

๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ view๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ์—๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด(์ˆ˜๋ช…์ฃผ๊ธฐ)๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๋ช…์€ ๋ณดํ†ต ํŽ˜์ด์ง€์—์„œ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์ธ ์ค€๋น„๊ณผ์ •์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ํŽ˜์ด์ง€์—์„œ ์‚ฌ๋ผ์งˆ ๋•Œ ๋๋‚œ๋‹ค.

 

๋‹ค์Œ์€ ๋ฆฌ์•กํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์— ๋Œ€ํ•ด ์ž˜ ๋‚˜ํƒ€๋‚ธ ๋‹ค์ด์–ด๊ทธ๋žจ ์‚ฌ์ดํŠธ์ด๋‹ค.

๋ณธ ๊ธ€์— ์‚ฌ์šฉ๋œ ๋‹ค์ด์–ด๊ทธ๋žจ ์—ญ์‹œ ์œ„ ์‚ฌ์ดํŠธ๋ฅผ ์บก์ณํ•œ ๊ฒƒ์ด๋‹ค.

 

React Lifecycle Methods diagram

Fully interactive and accessible React Lifecycle Methods diagram.

projects.wojtekmaj.pl

 

 

 

๋ฆฌ์•กํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์€ ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • ์ƒ์„ฑ ๋  ๋•Œ  โžก ๋งˆ์šดํŠธ
  • ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ  โžก ์—…๋ฐ์ดํŠธ
  • ์ œ๊ฑฐ ํ•  ๋•Œ  โžก ์–ธ๋งˆ์šดํŠธ

๋งˆ์šดํŠธ๋Š” DOM์ด ์ƒ์„ฑ๋˜๊ณ  ์›น๋ธŒ๋ผ์šฐ์ € ์ƒ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋œปํ•˜๊ณ ,

์–ธ๋งˆ์šดํŠธ๋Š” DOM์—์„œ ์ œ๊ฑฐ๋˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

์—…๋ฐ์ดํŠธ๋Š” ๋‹ค์Œ 4๊ฐ€์ง€ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.

  1. props๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ
  2. state๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ
  3. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ
  4. this.forceUpdate๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ•์ œ๋กœ ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•  ๋•Œ

 

๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ๊ฐ์˜ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ž

1. constructor

constructor๋Š” ์ƒ์„ฑ์ž๋กœ, ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ์ฒ˜์Œ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ดˆ๊ธฐ state๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ดˆ๊ธฐ state๋ฅผ ์„ค์ •ํ•  ๋•Œ constructor๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useState๋ฅผ ์‚ฌ์šฉํ•ด ์ดˆ๊ธฐ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

2. render

render๋Š” ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ด๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋กœ, ์œ ์ผํ•œ ํ•„์ˆ˜ ๋ฉ”์„œ๋“œ์ด๋‹ค. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” render๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. componentDidMount

์ด ๋ฉ”์„œ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์ฒซ ๋ Œ๋”๋ง์„ ๋งˆ์นœ ํ›„ ์‹คํ–‰ํ•œ๋‹ค. 

 

4. componentDidUpdate

์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ๋ Œ๋”๋ง์„ ์™„๋ฃŒํ•œ ํ›„ ์‹คํ–‰ํ•œ๋‹ค. ์—…๋ฐ์ดํŠธ๊ฐ€ ๋๋‚œ ์งํ›„์ด๋ฏ€๋กœ, DOM ๊ด€๋ จ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

 

5. componentWillUnmount

์ด ๋ฉ”์„œ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ DOM์—์„œ ์ œ๊ฑฐํ•  ๋•Œ ์‹คํ–‰ํ•œ๋‹ค. componentDidMount์—์„œ ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ ์ œ๊ฑฐ ์ž‘์—…์„ ํ•ด์•ผํ•œ๋‹ค. 

 

 

๐Ÿ”Ž useEffect

useEffect๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ํ•จ์ˆ˜, ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜์กด๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด deps์„ ๋„ฃ๋Š”๋‹ค. ๊ธฐ๋ณธ ํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

useEffect(() => {
    // ์‹คํ–‰ํ•  ์ฝ”๋“œ 
} , [deps])

 

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

์œ„์—์„œ ๋ณธ ๋ผ์ดํ”„์‚ฌ์ดํด์˜ ๋‹จ๊ณ„์— ๋งž์ถฐ์„œ ์‚ดํŽด๋ณด์ž.

 

 

1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋์„ ๋•Œ (componentDidMount)

deps๋ฅผ ๋น„์šฐ๊ฒŒ ๋œ๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋‚˜ํƒ€๋‚  ๋•Œ์—๋งŒ useEffect์— ๋“ฑ๋กํ•œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

useEffect(() => {
    console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค.');
}, []);

 

 

2. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ (componentDidUpdate)

deps์— ํŠน์ • ๊ฐ’์„ ๋„ฃ๊ฒŒ ๋œ๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋งˆ์šดํŠธ ๋  ๋•Œ์—๋„ ํ˜ธ์ถœ๋˜๊ณ , ์ง€์ •ํ•œ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ์—๋„ ํ˜ธ์ถœ๋œ๋‹ค. 

๋˜ deps์•ˆ์— ํŠน์ • ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์–ธ๋งˆ์šดํŠธ์‹œ์—๋„ ํ˜ธ์ถœ๋˜๊ณ , ๊ฐ’์ด ๋ฐ”๋€Œ๊ธฐ ์ง์ „์—๋„ ํ˜ธ์ถœ๋œ๋‹ค.

useEffect(() => {
    console.log(number);
    console.log('number๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค.');
}, [number]);

useEffect์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒํƒœ๋‚˜ props๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ผญ deps ๋ฐฐ์—ด ์•ˆ์— ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด,  useEffect ์•ˆ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ตœ์‹  ์ƒํƒœ, props๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค.

 

 

3. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋์„ ๋•Œ (componentWillUnmount)

useEffect์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ cleanup ํ•จ์ˆ˜๋ผ ํ•œ๋‹ค. 

cleanup ํ•จ์ˆ˜๋Š” useEffect์— ๋Œ€ํ•œ ๋’ท์ •๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ์ด๋ฆ„์œผ๋กœ ๋ถˆ๋ฆฌ๋Š”๋ฐ, 

deps๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ cleanup ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

useEffect(() => {
    console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค.');
    
    return () => {
    	console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค.');
    }
}, []);

 

deps ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ

deps ์— ์žˆ๋Š” ๊ฐ’์ด ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ์ง์ „์— cleanup ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

useEffect(() => {
    console.log('number๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค.');
    
    return () => {
    	console.log('number๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๊ธฐ ์ง์ „ ์‹คํ–‰๋œ๋‹ค.');
    }
}, [number]);

 

 

 

4. deps ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด?

deps ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ƒ๋žตํ•˜๊ฒŒ ๋˜๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•
Comments