๐ ์๋ก์ด React ์ฑ๋ฆฐ์ง: useOptimistic์ผ๋ก ์ฆ์ UI ๊ตฌํ
์ถ์ฒ: 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๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ฐ ๋ณด์ผ