useEffect์™€ useLayoutEffect

๋ฐ•์ƒ์šฐยท2023๋…„ 5์›” 29์ผ
0
post-thumbnail

useEffect

๐Ÿ’ก ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” React Hook.

useEffect๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ์•  ์ฃผ๊ธฐ์—์„œ ํ™”๋ฉด์ด ๋žœ๋”๋ง(Rendering)๋˜๊ณ  ํŽ˜์ธํŒ…(Painting)๋œ ์ดํ›„์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

๋žœ๋”๋ง ์ดํ›„ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— useEffect๋‚ด๋ถ€์— DOM์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ๊นœ๋นก์ž„์„ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋œ๋‹ค.


useLayouEffect

๐Ÿ’ก ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ์ „์— useEffect๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

useLayoutEffect๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋žœ๋”๋ง ๋œ ์ดํ›„์— ์‹คํ–‰๋˜๊ณ , useLayoutEffect๊ฐ€ ์‹คํ–‰๋œ ์ดํ›„์— ํŽ˜์ธํŒ…์ด ์ˆ˜ํ–‰๋œ๋‹ค. useLayoutEffect๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ํŽ˜์ธํŒ… ์ด์ „์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— DOM ์กฐ์ž‘์ด ์žˆ๋”๋ผ๋„ ํ™”๋ฉด ๊นœ๋นก์ž„์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

Render - DOM Tree๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ์—˜๋ฆฌ๋ฒˆํŠธ์˜ ์Šคํƒ€์ผ ์†์„ฑ์„ ๊ณ„์‚ฐ
Paint - ์‹ค์ œ ์Šคํฌ๋ฆฐ์— ๊ณ„์‚ฐํ•œ Layout์„ ํ‘œ์‹œํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ณผ์ •


Why useLayoutEffect?

๐Ÿ’ก ๊ณต์‹๋ฌธ์„œ์—์„œ๋„ useLayoutEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ƒ ์ €ํ•˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ค๋ช…ํ•œ๋‹ค.

useLayoutEffect๋Š” ์œ„์น˜๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š๊ณ  ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๋Š” ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ์˜ ํˆดํŒ๋‚˜๋จธ์ง€ ์ปดํฌ๋„ŒํŠธ ํˆดํŒ

๋‘ ์‚ฌ์ง„์„ ๋ณด๋ฉด ํˆดํŒ์˜ ๋ฐฉํ–ฅ์ด ์ปดํฌ๋„ŒํŠธ(๋ฒ„ํŠผ)์˜ ์œ„์น˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

ํˆดํŒ์˜ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ด useEffect ๋‚ด์—์„œ ์ฒ˜๋ฆฌ๋˜๊ฒŒ ๋˜๋ฉด, ํŽ˜์ธํŒ…์ด ๋๋‚œ ์‹œ์ ์—์„œ ํˆดํŒ์˜ ์œ„์น˜๊ฐ€ ๊ณ„์‚ฐ๋˜๊ณ ,
๊ทธ์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ์˜ ์œ„์น˜๋ฅผ ๋‹ค์‹œ ์กฐ์ ˆํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๋žœ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ useLayoutEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, useLayoutEffect์˜ ๋‚ด๋ถ€ ๋™์ž‘(์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํฌ๋„ŒํŠธ์˜ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐ)์„ ์ˆ˜ํ–‰ํ•œ ํ›„, React๊ฐ€ DOM์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ํ‘œํ˜„ํ•œ๋‹ค.

์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ์˜ ํˆดํŒ๋‚˜๋จธ์ง€ ์ปดํฌ๋„ŒํŠธ ํˆดํŒ
useEffect (์ถœ์ฒ˜: React ๊ณต์‹๋ฌธ์„œ)useLayoutEffect (์ถœ์ฒ˜: React ๊ณต์‹๋ฌธ์„œ)

๋‚ด๋ถ€๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, useLayoutEffect๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋๋‚˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค.
๋”ฐ๋ผ์„œ useLayoutEffect์ดํ›„ ์‹คํ–‰๋  painting์„ ์ฐจ๋‹จํ•œ๋‹ค.

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


์ •๋ฆฌํ•˜๋ฉด,

๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ๋ฐ›์•„ ๊ฒฐ์ •ํ•˜๊ณ  ์‹ถ๊ฑฐ๋‚˜, ๋žœ๋”๋ง ์‹œ์ ์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์œ„์น˜๋ฅผ ํŠน์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ์˜ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ์ดํ›„์— ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹ค์ œ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •(ํŽ˜์ธํŒ…) ์ดํ›„์— ๊ณ„์‚ฐ ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜๊ธฐ ๋–„๋ฌธ์— ์ดˆ๊ธฐ ์œ„์น˜์—์„œ ์‹ค์ œ ๊ณ„์‚ฐ๋œ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๊ฐ€ ๊นœ๋นก์ด๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ useLayoutEffect์˜ ๊ฒฝ์šฐ ํŽ˜์ธํŒ… ๊ณผ์ • ์ด์ „์— ๋™๊ธฐ์ ์œผ๋กœ ๊ณ„์‚ฐ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ดํŒ… ์‹œ์ ์—์„œ๋Š” ๊ณ„์‚ฐ๋œ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด, ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

useLayoutEffect๋Š” useEffect์™€ ๋‹ฌ๋ฆฌ ๋™๊ธฐ์ ์œผ๋กœ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, useEffect ๋‚ด๋ถ€ ๋กœ์ง์ด ๋ณต์žกํ•  ์ˆ˜๋ก ์ƒ๋Œ€์ ์œผ๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ  ์žˆ๋‹ค.


Reference

React ๊ณต์‹๋ฌธ์„œ : useEffect

React ๊ณต์‹๋ฌธ์„œ : useLayoutEffect

Medium ๋ธ”๋กœ๊ทธ : [React] useEffect ์™€ useLayoutEffect ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

profile
๋‚˜๋„ ์ž˜ํ•˜๊ณ  ์‹ถ๋‹ค..!

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