Frontend/React

[ ๋ฆฌ์•กํŠธ(React) ] useLayoutEffect, useEffect์˜ ์ฐจ์ด์  ์‹คํ—˜์œผ๋กœ ์‰ฝ๊ฒŒ ์•Œ์•„๋ณด๊ธฐ

YWTechIT 2021. 8. 19. 21:35
728x90

๐Ÿ“ useLayoutEffect, useEffect์˜ ์ฐจ์ด์  ์•Œ์•„๋ณด๊ธฐ

react๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ paint screen ๋‹จ๊ณ„ ์ดํ›„ ์ฆ‰, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋ Œ๋”๋ง ๋œ ์ดํ›„ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ(side Effect) (์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ๊ตฌ๋… ์„ค์ •ํ•˜๊ธฐ, ์ˆ˜๋™์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ์ž‘์—… ๋“ฑ์„ ๋งํ•œ๋‹ค.)๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•  ๋•Œ ์ฃผ๋กœ useEffect๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

(์•„๋ž˜ ์‚ฌ์ง„์€ github์—์„œ ๊ฐ€์ ธ์˜จ hook-flow ์‚ฌ์ง„์ธ๋ฐ, `flow`๋ฅผ ํ•œ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ์–ด์„œ ๊ฐ€์ ธ์™€๋ดค๋‹ค.)

 

 

๋‹ค์‹œ ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ํ™”๋ฉด์— state์˜ ๊ฐ’์ด ๋ฐ”๋€Œ์–ด์„œ ํ™”๋ฉด์ด ๊นœ๋นก์ด๊ฑฐ๋‚˜ DOM์„ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? paint screen ๋‹จ๊ณ„ ์ด์ „ ์ฆ‰, ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ๋ฐ”๋กœ ์ „์— ๊ฐ’์„ ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๋ฉด useLayoutEffect hook์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

์ •๋ง๋กœ useLayoutEffect๋Š” ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์‹คํ—˜์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋งŒ์•ฝ, localStorage์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž‘์—…์„ ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, useEffect, useLayoutEffect ์ค‘ ์–ด๋–ค ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด์•ผ ์ ํ•ฉํ• ๊นŒ? ์ž˜๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ํ•˜๋‹จ์˜ gif๋ฅผ ๋ณด๊ณ  ์–ด๋–ค gif๊ฐ€ useEffect ํ˜น์€ useLayoutEffect๋ฅผ ์‚ฌ์šฉํ–ˆ์„์ง€ ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•ด๋ณด์ž.

 

 

 

๋„ˆ๋ฌด ์‰ฌ์› ๋Š”๊ฐ€? ์ •๋‹ต์€ ์ฒซ๋ฒˆ์งธ gif๊ฐ€ ๋ฐ”๋กœ useLayoutEffect๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์ด๊ณ  ๋‘ ๋ฒˆ์งธ gif๋Š” useEffect๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์ด๋‹ค. ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๋Š”์ง€ ๋ˆˆ์„ ํฌ๊ฒŒ ๋œจ๊ณ  ๋ณด๋ฉด ๋ณด์ผ ํ…๋ฐ, ๋‘ ๋ฒˆ์งธ gif๋Š” ํ™”๋ฉด์— ๋ Œ๋”๋ง ๋œ ์ดํ›„์— localStorage ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—๋Š” ๋นˆ ๊ณต๊ฐ„์ด์—ˆ๋‹ค๊ฐ€ ๋ Œ๋”๋ง์ด ๋๋‚˜๋ฉด ํ™”๋ฉด์ด ์›€์ง์ด๋ฉด์„œ ๊ฐ’์ด ์ฑ„์›Œ์ง€๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ  ๋ฐ˜๋ฉด์—, ์ฒซ๋ฒˆ์งธ gif๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๊ทธ๋ ค์ง€๊ธฐ ์ „์— ๋กœ์ง์„ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ๋ง๋”ํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒฐ๋ก ์ ์œผ๋กœ ๋ Œ๋”๋ง ์ด์ „์— ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ณ ์‹ถ๋‹ค๋ฉด useLayoutEffect๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ Œ๋”๋ง ์ดํ›„์— ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ณ ์‹ถ๋‹ค๋ฉด useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ์ ํ•ฉํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์–ธ์ œ๋‚˜ ๊ทธ๋ ‡๋“ฏ ๋ฐ˜๋ก€๋Š” ์ถฉ๋ถ„ํžˆ ์กด์žฌํ•˜๋ฏ€๋กœ, ๋ฌด์ž‘์ • ๋”ฐ๋ผ ์“ฐ๋Š” ๊ฒƒ๋ณด๋‹ค ์™œ ์ด๊ฒƒ์„ ์จ์•ผ ํ•˜๋Š”์ง€, ํ˜„์žฌ ๋‚˜์˜ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

๊ธ€์„ ๋งˆ์น˜๋ฉด์„œ ์ด๋Ÿฐ ์„ธ์„ธํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ์‹ ๊ฒฝ ์จ์•ผ ํ•ด..?๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ์‹คํ—˜๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์ž‘์€ ๊ฒฝ์šฐ์—๋Š” ๋ฏธ๋ฏธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ ๋ฐฐํฌ ์ดํ›„ ๊ฐ’์ด ์ปค์ ธ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์กฐ๊ธˆ์ด๋ผ๋„ ๋Š๋ ค์ง€๊ฒŒ ๋œ๋‹ค๋ฉด ์ง€๊ธˆ๊ณผ ๊ฐ™์€ ๋ชจ์Šต์ด ํ™•์—ฐํ•˜๊ฒŒ ๋ณด์ผ ๊ฒƒ์ด๊ณ  ์ด๋Š” ๊ณง ๊ณ ๊ฐ์˜ ๊ฒฝํ—˜์„ฑ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋‚จ๋“ค๋ณด๋‹ค ๊ฒฝ์Ÿ๋ ฅ ์žˆ๋Š” front-end๊ฐ€ ๋˜๋ ค๋ฉด ์ด๋Ÿฐ ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ์บ์น˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

reference

  1. react-docs-hooks-effect
๋ฐ˜์‘ํ˜•