๐Ÿš€ ์ƒˆ๋กœ์šด React ์ฑŒ๋ฆฐ์ง€: useOptimistic์œผ๋กœ ์ฆ‰์‹œ UI ๊ตฌํ˜„

๋ฐœํ–‰: (2026๋…„ 5์›” 23์ผ PM 07:37 GMT+9)
4 ๋ถ„ ์†Œ์š”
์›๋ฌธ: Dev.to

์ถœ์ฒ˜: Dev.to

์ข‹์•„์š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์„œ๋ฒ„๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์‚ฌ์ด์— 1์ดˆ ์ •๋„ ๋ฉˆ์ถ”๋Š” ๊ฑธ ๋ณธ ์  ์žˆ๋‚˜์š”? ๊ทธ ์ž‘์€ ์ง€์—ฐ ๋•Œ๋ฌธ์— ์•ฑ์ด ๋А๋ฆฟ๋А๋ฆฟํ•˜๊ฒŒ ๋А๊ปด์ง‘๋‹ˆ๋‹ค. Reactโ€ฏ19๋Š” ๋ฐ”๋กœ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด useOptimistic๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค โ€” ์„œ๋ฒ„ ์‘๋‹ต ์ „์— UI๊ฐ€ ๋จผ์ € ๋ณ€ํ•˜๊ณ , ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ์›๋ž˜๋Œ€๋กœ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
๐Ÿ”ฅ ์ง€๊ธˆ ๋„์ „ ์‹œ์ž‘ํ•˜๊ธฐ

React์˜ useOptimistic ํ›…์„ ์‚ฌ์šฉํ•ด ์ฆ‰์‹œ ๋ฐ˜์‘ํ•˜๋Š” ํ•˜ํŠธ ํ† ๊ธ€์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”. ํ•˜ํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ฐ”๋กœ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๋€Œ๊ณ , React๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์„œ๋ฒ„๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์‹คํŒจํ•˜๋ฉด ํ•˜ํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์›๋ž˜ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค โ€” ์ˆ˜๋™ ๋กค๋ฐฑ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ์นด๋“œ๋ฅผ ๋‚˜๋ž€ํžˆ ๋ Œ๋”๋งํ•˜์„ธ์š”: ํ•˜๋‚˜๋Š” โ€œSuccessful toggleโ€(์„ฑ๊ณต ํ† ๊ธ€)์ด๋ผ๊ณ  ๋ผ๋ฒจ๋งํ•˜๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” โ€œError toggleโ€(์˜ค๋ฅ˜ ํ† ๊ธ€)์ด๋ผ๊ณ  ๋ผ๋ฒจ๋งํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์นด๋“œ ๋ชจ๋‘ ํ•˜ํŠธ๊ฐ€ ์ค‘๋ฆฝ ์ƒํƒœ(์ข‹์•„์š” ์•ˆ ๋œ ์ƒํƒœ)์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๊ณต ํ† ๊ธ€ ์นด๋“œ์˜ ํ•˜ํŠธ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  • ์„œ๋ฒ„ ์‘๋‹ต ์ „์— ํ•˜ํŠธ๋ฅผ ์ฆ‰์‹œ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๊ฐ€ ๋ณ€๊ฒฝ์„ ํ™•์ธํ•œ ํ›„์—๋„ ํ•˜ํŠธ๋ฅผ ๋นจ๊ฐ„์ƒ‰ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ํ† ๊ธ€ ์นด๋“œ์˜ ํ•˜ํŠธ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  • ์„œ๋ฒ„ ์‘๋‹ต ์ „์— ํ•˜ํŠธ๋ฅผ ์ฆ‰์‹œ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ•˜ํŠธ๋ฅผ ์ค‘๋ฆฝ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.

  • useOptimistic ํ›…์„ startTransition๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด ๋‚™๊ด€์  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์„ธ์š”.

  • addOptimistic๋Š” ๋ฐ˜๋“œ์‹œ startTransition ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด UI๋Š” ์—…๋ฐ์ดํŠธ๋˜์ง€๋งŒ React๊ฐ€ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

  • passthrough ์ƒํƒœ๋Š” ๋ถˆ๋ฆฌ์–ธ(์ข‹์•„์š” ์—ฌ๋ถ€)๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ ์ •์  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

  • toggleFavoriteError๋Š” ํ•ญ์ƒ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. try/catch์™€ console.error๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋นจ๊ฐ„ ์˜ค๋ฅ˜ ์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋ฉด์„œ ๋‚™๊ด€์  ๋˜๋Œ๋ฆผ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์‹œ์ž‘ ํŒŒ์ผ์— ์žˆ๋Š” data-testid ์†์„ฑ์€ ์ด๋ฏธ ํ…Œ์ŠคํŠธ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋‹ˆ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์ง€ ๋งˆ์„ธ์š”.

  • ์•ฑ ์ œ๋ชฉ์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

  • ๋‘ ์นด๋“œ์™€ ๋ผ๋ฒจ์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

  • ํ•˜ํŠธ๊ฐ€ ์ข‹์•„์š” ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‚™๊ด€์ ์œผ๋กœ ํ•˜ํŠธ๋ฅผ ์ฆ‰์‹œ ํ† ๊ธ€ํ•˜๊ณ  ์„ฑ๊ณต ์‹œ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„ ์˜ค๋ฅ˜ ์‹œ ํ•˜ํŠธ๋ฅผ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.

๋งŒ์•ฝ setState(optimisticValue)์™€ try/catch๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜๋™ ๋กค๋ฐฑ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์™”๋‹ค๋ฉด, useOptimistic๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋Ÿฐ ๋ณด์ผ

0 ์กฐํšŒ
Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

๋‚ด ์Šคํ‚ฌ

ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ AI ์ง€์‹œ๋ฌธ์„ ๋งŒ๋“ค๊ณ , ์„ค์น˜ํ•˜๊ณ , ๊ด€๋ฆฌํ•˜์„ธ์š” โ€” ์ฝ”๋”ฉ์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. CREATE ์ด๋ฆ„์„ ์ •ํ•˜๊ณ , ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๊ณ , ์›ํ•˜๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜์„ธ์š” โ€” ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

PREDICTION-20260525-0007: ๋น„๋Œ€์นญ ๋ ˆ๋ฒ„๋ฆฌ์ง€๋ฅผ ์ด์šฉํ•œ ์ง€๋ฃจํ•จ [2026-Q3 through 2027-Q3]

Motivationโ€‘Patternโ€‘Log Public์€ ๋™๊ธฐ ๋ถ„์„์— ๊ธฐ๋ฐ˜ํ•œ AI ์‹œ๋Œ€ ์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ ๊ณต๊ฒฉ ํŒจํ„ด์— ๋Œ€ํ•œ ๋‚ ์งœ๊ฐ€ ๊ธฐ์žฌ๋œ, ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ธก ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ธก์€ โ€ฆ

์„œ๋ฒ„ ์—†์ด 100๊ฐœ์˜ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ๋„๊ตฌ๋ฅผ ๋งŒ๋“  ๋ฐฉ๋ฒ• (FFmpeg WASM, PDF-lib, AI Background Removal)

์ œ๊ฐ€ ImgToolkit์„ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๋ชฉํ‘œ๋Š” ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค: ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ๋ชจ๋“  ์ด๋ฏธ์ง€โ€‘ํˆด ์‚ฌ์ดํŠธ๋Š” ํŒŒ์ผ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜, ์ถœ๋ ฅ๋ฌผ์— ์›Œํ„ฐ๋งˆํฌ๋ฅผ ์‚ฝ์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.