React: ๊ฐœ๋ณ„ ์ด๋ฒคํŠธ ๋‚ด๋ถ€์— ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ •๋ฆฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2019๋…„ 03์›” 05์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

์ด ๋ฒ„๊ทธ๋Š” ๋งค์šฐ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

https://twitter.com/kentcdodds/status/1102659818660102145

setInterval(fn, 0) ์˜ํ•ด ์˜ˆ์ •๋œ fn ์ด setRunning(false) ์— ์˜ํ•ด ๋ฐœ์ƒํ•œ [running] ํšจ๊ณผ ์ •๋ฆฌ ์•ž์—์„œ ์ ํ”„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๊ฒฉ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฐœ์ƒํ•˜๊ณ  ์ด๋ฒคํŠธ ์ค‘์— ๋ฐœ์ƒํ•œ setLapse(0) ๋ฅผ setLapse(someValue) ๋ฎ์–ด ์”๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ https://github.com/facebook/react/issues/14750#issuecomment -460409609 ๋˜๋Š” ์ ์–ด๋„ ์ผ๋ถ€์— ์„ค๋ช… ๋œ ๋ฌธ์ œ๋ฅผ ์ƒ๊ธฐ์‹œํ‚ต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ์ด ๋ฌธ์ œ๋Š” ์ผ๋ฐ˜ React ํ‚ค ์ž…๋ ฅ (๋ฐ ๊ธฐํƒ€ "์ด์‚ฐ"์ด๋ฒคํŠธ)์—๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋ถˆ์—ฐ์†์ ์ธ ์‚ฌ๊ฑด์„ ์–ป๊ธฐ ์ „์— ์ˆ˜๋™์  ํšจ๊ณผ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—์„œ๋Š” ํšจ๊ณผ๊ฐ€ ํด๋ฆญ ์ „์ด ์•„๋‹ˆ๋ผ ํด๋ฆญ setState ๋„ ์ˆ˜๋™ ํšจ๊ณผ๋ฅผ ํ”Œ๋Ÿฌ์‹œํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (๊ทธ๊ฒƒ์€ ๊ทธ๋“ค์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋ชฉ์ ์„ ๋ฌด๋„ˆ ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ์„ค๊ณ„๋œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ฉฐ ํƒ€์ด๋ฐ์ด ์ค‘์š” ํ•  ๋•Œ ์ˆ˜์ •์€ useLayoutEffect . ์•„๋‹ˆ๋ฉด rAF ์†”๋ฃจ์…˜?

Hooks Question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํƒ€์ด๋จธ๊ฐ€ ์‹ค์ œ๋กœ ์ค‘์ง€ ๋œ ๊ฒฝ์šฐ์—๋งŒ ์žฌ์„ค์ •์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ํ”„๋ ˆ์ž„์—์„œ ํ•ญ์ƒ 0์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด running์ด false ์ผ ๋•Œ ํ•ญ์ƒ 0์„ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ์˜ ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ๊ฐ์†๊ธฐ๋กœ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ์†๊ธฐ๋Š” ์ค‘์ง€ ์ƒํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•  ๋•Œ ์‰ฝ๊ฒŒ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฑฐ๋ถ€ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ ์žฌ์„ค์ •ํ•˜๋Š” ๋…ผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

๋ฌธ์ œ๋Š” ํƒ€์ด๋จธ ์ž์ฒด๊ฐ€ ๊ฐœ๋ณ„ ์ด๋ฒคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์‚ฐ ์ด๋ฒคํŠธ๋Š” ๋‹ค๋ฅธ ์ด์‚ฐ ์ด๋ฒคํŠธ์™€ ๊ด€๋ จํ•ด์„œ ๋งŒ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ์—ฌ๊ธฐ์„œ ์›ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํƒ€์ด๋จธ ์ค‘์ง€๋Š” ๋ชจ๋“  ์„ค์ • ์ƒํƒœ๊ฐ€ ๋น„๋™๊ธฐ์ด๋ฏ€๋กœ ๋น„๋™๊ธฐ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”Œ๋Ÿฌ์‹œ๋˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ๊ฒƒ์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

setRunning(false); // I would like to add a stop of this timer to the queue to be performed later
setLapse(0); // I would like to add an operation to set lapse to zero later
// lots of random stuff that can happen before the batch flushes
// This might also queue an operation to set lapse to something else
// actual rendering
// If concurrent mode, lots of other random stuff that can happen while rendering
// This might also queue an operation to set lapse to something else
// Actually do all that work in order

๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋˜๋Š” ์ˆœ์„œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํƒ€์ด๋จธ๊ฐ€ ์‹ค์ œ๋กœ ์ค‘์ง€ ๋œ ๊ฒฝ์šฐ์—๋งŒ ์žฌ์„ค์ •์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ํ”„๋ ˆ์ž„์—์„œ ํ•ญ์ƒ 0์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด running์ด false ์ผ ๋•Œ ํ•ญ์ƒ 0์„ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ์˜ ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ๊ฐ์†๊ธฐ๋กœ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ์†๊ธฐ๋Š” ์ค‘์ง€ ์ƒํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•  ๋•Œ ์‰ฝ๊ฒŒ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฑฐ๋ถ€ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ ์žฌ์„ค์ •ํ•˜๋Š” ๋…ผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ดํ•ด๊ฐ€๋œ๋‹ค. ๊ฐ์‚ฌ.

https://mobile.twitter.com/dan_abramov/status/1104069236132057089
https://codesandbox.io/s/23m1659rlp

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰