React์ experimental_useOptimistic ํ ์ด ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ๊ณผ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ํ ๋๊ด์ ์ ๋ฐ์ดํธ ์ฒ๋ฆฌ ์๋ ์ต์ ํ ์ ๋ต์ ์์๋ณด์ธ์.
React experimental_useOptimistic ์ฑ๋ฅ: ๋๊ด์ ์ ๋ฐ์ดํธ ์ฒ๋ฆฌ ์๋
React์ experimental_useOptimistic ํ
์ ๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์๋ฒ ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ UI๊ฐ ์ฆ์ ์
๋ฐ์ดํธ๋์ด ์ฆ๊ฐ์ ์ธ ์ก์
์ฒ๋ผ ๋ณด์ด๊ฒ ํฉ๋๋ค. ํ์ง๋ง ์๋ชป ๊ตฌํ๋ ๋๊ด์ ์
๋ฐ์ดํธ๋ ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ experimental_useOptimistic์ ์ฑ๋ฅ์ ์ํฅ์ ๋ํด ๊น์ด ์์๋ณด๊ณ , ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ ์ข์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํ ์
๋ฐ์ดํธ ์ฒ๋ฆฌ ์๋ ์ต์ ํ ์ ๋ต์ ์ ๊ณตํฉ๋๋ค.
๋๊ด์ ์ ๋ฐ์ดํธ์ experimental_useOptimistic ์ดํดํ๊ธฐ
๋๊ด์ ์
๋ฐ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์
์ด ์ฑ๊ณตํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์๋ฒ๋ก๋ถํฐ ํ์ธ์ ๋ฐ๊ธฐ *์ *์ UI๋ฅผ ๊ทธ์ ๋ง๊ฒ ์
๋ฐ์ดํธํ๋ UI ๊ธฐ์ ์
๋๋ค. ์ด๋ ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ํฌ๊ฒ ํฅ์์ํค๋ ์ธ์ง๋ ๋ฐ์์ฑ์ ๋ง๋ค์ด๋
๋๋ค. experimental_useOptimistic์ React์์ ์ด ํจํด์ ๊ตฌํ์ ๋จ์ํํฉ๋๋ค.
๊ธฐ๋ณธ ์๋ฆฌ๋ ๊ฐ๋จํฉ๋๋ค: ์ด๋ค ์ํ๊ฐ ์๊ณ , ๊ทธ ์ํ๋ฅผ ๋ก์ปฌ์์ (๋๊ด์ ์ผ๋ก) ์
๋ฐ์ดํธํ๋ ํจ์, ๊ทธ๋ฆฌ๊ณ ์๋ฒ์์ ์ค์ ์
๋ฐ์ดํธ๋ฅผ ์ํํ๋ ํจ์๊ฐ ์์ต๋๋ค. experimental_useOptimistic์ ์๋ ์ํ์ ๋๊ด์ ์
๋ฐ์ดํธ ํจ์๋ฅผ ๋ฐ์ UI์ ํ์๋ ์๋ก์ด '๋๊ด์ ' ์ํ๋ฅผ ๋ฐํํฉ๋๋ค. ์๋ฒ๊ฐ ์
๋ฐ์ดํธ๋ฅผ ํ์ธํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ค์ ์ํ๋ก ๋๋๋ฆฝ๋๋ค.
๋๊ด์ ์ ๋ฐ์ดํธ์ ์ฃผ์ ์ด์ :
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ ์ข๊ฒ ๋๊ปด์ง๊ฒ ํฉ๋๋ค.
- ์ธ์ง๋ ์ง์ฐ ์๊ฐ ๊ฐ์: ์๋ฒ ์์ฒญ๊ณผ ๊ด๋ จ๋ ๋๊ธฐ ์๊ฐ์ ์์ ์ค๋๋ค.
- ์ฐธ์ฌ๋ ์ฆ์ง: ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์ฅ๋ คํฉ๋๋ค.
experimental_useOptimistic์ ์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
experimental_useOptimistic์ ๋งค์ฐ ์ ์ฉํ์ง๋ง, ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
1. ๋น๋ฒํ ์ํ ์ ๋ฐ์ดํธ:
๋ชจ๋ ๋๊ด์ ์ ๋ฐ์ดํธ๋ ์ปดํฌ๋ํธ์ ์ ์ฌ์ ์ผ๋ก ๊ทธ ์์๋ค์ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํฉ๋๋ค. ์ ๋ฐ์ดํธ๊ฐ ๋๋ฌด ์ฆ๊ฑฐ๋ ๋ณต์กํ ๊ณ์ฐ์ ํฌํจํ๋ฉด ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์์: ๊ณต๋ ๋ฌธ์ ํธ์ง๊ธฐ๋ฅผ ์์ํด ๋ณด์ธ์. ๋ชจ๋ ํค ์ ๋ ฅ์ด ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ๋ฐํ๋ค๋ฉด, ์ปดํฌ๋ํธ๋ ์ด๋น ์์ญ ๋ฒ ๋ฆฌ๋ ๋๋ง๋ ์ ์์ผ๋ฉฐ, ํนํ ํฐ ๋ฌธ์์์๋ ์ง์ฐ์ ์ ๋ฐํ ์ ์์ต๋๋ค.
2. ๋ณต์กํ ์ ๋ฐ์ดํธ ๋ก์ง:
experimental_useOptimistic์ ์ ๊ณตํ๋ ์
๋ฐ์ดํธ ํจ์๋ ๊ฐ๋ฅํ ํ ๊ฐ๋ฒผ์์ผ ํฉ๋๋ค. ์
๋ฐ์ดํธ ํจ์ ๋ด์ ๋ณต์กํ ๊ณ์ฐ์ด๋ ์ฐ์ฐ์ ๋๊ด์ ์
๋ฐ์ดํธ ๊ณผ์ ์ ๋๋ฆฌ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
์์: ๋๊ด์ ์ ๋ฐ์ดํธ ํจ์๊ฐ ํฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊น์ ๋ณต์ฌ๋ฅผ ํฌํจํ๊ฑฐ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ ์ํํ๋ ๊ฒฝ์ฐ, ๋๊ด์ ์ ๋ฐ์ดํธ๋ ๋๋ ค์ง๊ณ ํจ๊ณผ๊ฐ ๋จ์ด์ง๋๋ค.
3. ์ฌ์กฐ์ ์ค๋ฒํค๋:
React์ ์ฌ์กฐ์ (reconciliation) ๊ณผ์ ์ ์ ๋ฐ์ดํธ ์ ํ์ ๊ฐ์ DOM์ ๋น๊ตํ์ฌ ์ค์ DOM์ ์ ๋ฐ์ดํธํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒฐ์ ํฉ๋๋ค. ๋น๋ฒํ ๋๊ด์ ์ ๋ฐ์ดํธ๋ ํนํ ๋ณ๊ฒฝ ์ฌํญ์ด ํด ๊ฒฝ์ฐ ์ฌ์กฐ์ ์ค๋ฒํค๋๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค.
4. ์๋ฒ ์๋ต ์๊ฐ:
๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ์ง์ฐ ์๊ฐ์ ๊ฐ๋ฆฌ์ง๋ง, ๋๋ฆฐ ์๋ฒ ์๋ต์ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ํ์ธํ๊ฑฐ๋ ๊ฑฐ๋ถํ๋ ๋ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด, ๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ๋๋๋ ค์ง๊ฑฐ๋ ์์ ๋ ๋ ์ฌ์ฉ์๋ ์ด์ํ ์ ํ์ ๊ฒฝํํ ์ ์์ต๋๋ค.
experimental_useOptimistic ์ฑ๋ฅ ์ต์ ํ ์ ๋ต
experimental_useOptimistic์ ์ฌ์ฉํ์ฌ ๋๊ด์ ์
๋ฐ์ดํธ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ช ๊ฐ์ง ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ๋๋ฐ์ด์ฑ(Debouncing)๊ณผ ์ฐ๋กํ๋ง(Throttling):
๋๋ฐ์ด์ฑ: ํน์ ์ง์ฐ ์๊ฐ ํ์ ์ฌ๋ฌ ์ด๋ฒคํธ๋ฅผ ๋จ์ผ ์ด๋ฒคํธ๋ก ๊ทธ๋ฃนํํฉ๋๋ค. ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ๋๋ฌด ์์ฃผ ์ ๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒ์ ํผํ๊ณ ์ถ์ ๋ ์ ์ฉํฉ๋๋ค.
์ฐ๋กํ๋ง: ํจ์๊ฐ ์คํ๋ ์ ์๋ ๋น์จ์ ์ ํํฉ๋๋ค. ์ด๋ ์ ๋ฐ์ดํธ๊ฐ ์ง์ ๋ ๊ฐ๊ฒฉ๋ณด๋ค ๋ ์์ฃผ ํธ๋ฆฌ๊ฑฐ๋์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์ (๋๋ฐ์ด์ฑ): ์์ ์ธ๊ธํ ๊ณต๋ ๋ฌธ์ ํธ์ง๊ธฐ์ ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ 200๋ฐ๋ฆฌ์ด ๋์ ํ์ดํ์ ๋ฉ์ถ ํ์๋ง ๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ๋๋ก ๋๋ฐ์ด์ฑํฉ๋๋ค. ์ด๋ ๋ฆฌ๋ ๋๋ง ํ์๋ฅผ ํฌ๊ฒ ์ค์ ๋๋ค.
import { debounce } from 'lodash';
import { experimental_useOptimistic, useState } from 'react';
function DocumentEditor() {
const [text, setText] = useState("Initial text");
const [optimisticText, setOptimisticText] = experimental_useOptimistic(text, (prevState, newText) => newText);
const debouncedSetOptimisticText = debounce((newText) => {
setOptimisticText(newText);
// Also send the update to the server here
sendUpdateToServer(newText);
}, 200);
const handleChange = (e) => {
const newText = e.target.value;
setText(newText); // Update actual state immediately
debouncedSetOptimisticText(newText); // Schedule optimistic update
};
return (
);
}
์์ (์ฐ๋กํ๋ง): ์ผ์ ๋ฐ์ดํฐ๋ก ์ ๋ฐ์ดํธ๋๋ ์ค์๊ฐ ์ฐจํธ๋ฅผ ์๊ฐํด ๋ณด์ธ์. UI์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ก ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ด๋น ํ ๋ฒ ์ดํ๋ก ์ฐ๋กํ๋งํฉ๋๋ค.
2. ๋ฉ๋ชจ์ด์ ์ด์ (Memoization):
๋๊ด์ ์ํ๋ฅผ props๋ก ๋ฐ๋ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด React.memo๋ฅผ ์ฌ์ฉํ์ธ์. React.memo๋ props๋ฅผ ์๊ฒ ๋น๊ตํ๊ณ props๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํฉ๋๋ค.
์์: ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ๋๊ด์ ํ
์คํธ๋ฅผ ํ์ํ๊ณ ์ด๋ฅผ prop์ผ๋ก ๋ฐ๋๋ค๋ฉด, ํด๋น ์ปดํฌ๋ํธ๋ฅผ React.memo๋ก ๊ฐ์ธ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋๊ด์ ํ
์คํธ๊ฐ ์ค์ ๋ก ๋ณ๊ฒฝ๋ ๋๋ง ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
import React from 'react';
const DisplayText = React.memo(({ text }) => {
console.log("DisplayText re-rendered");
return {text}
;
});
export default DisplayText;
3. ์ ๋ ํฐ์ ์ํ ์ ๊ทํ:
์ ๋ ํฐ: ๋๊ด์ ์ํ์์ ํน์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ํ์์ํค๊ธฐ ์ํด ์ ๋ ํฐ(์: Reselect ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ์ฌ์ฉํ์ธ์. ์ ๋ ํฐ๋ ํ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ์ด์ฆํ์ฌ ์ํ์ ์์ ํ์ ์งํฉ์๋ง ์์กดํ๋ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ํ ์ ๊ทํ: ๋๊ด์ ์ ๋ฐ์ดํธ ์ค์ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๋ฐ์ดํฐ์ ์์ ์ต์ํํ๊ธฐ ์ํด ์ํ๋ฅผ ์ ๊ทํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์กฐํํ์ธ์. ์ ๊ทํ๋ ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์กฐ๊ฐ์ผ๋ก ๋ถํดํ์ฌ ๋ ๋ฆฝ์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์๋๋ก ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
์์: ํญ๋ชฉ ๋ชฉ๋ก์ด ์๊ณ ํ ํญ๋ชฉ์ ์ํ๋ฅผ ๋๊ด์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ, ํญ๋ชฉ์ ID๋ก ํค๋ฅผ ์ง์ ํ ๊ฐ์ฒด์ ์ ์ฅํ์ฌ ์ํ๋ฅผ ์ ๊ทํํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ ์ฒด ๋ชฉ๋ก์ด ์๋ ๋ณ๊ฒฝ๋ ํน์ ํญ๋ชฉ๋ง ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
4. ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ:
์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋จ์ํํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ(์: Immer ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ์ฌ์ฉํ์ธ์. ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ ๋ฐ์ดํธ๊ฐ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๋์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ก ๋ณด์ฅํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ณ ๋ฆฌ๋ ๋๋ง์ ์ต์ ํํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์์: Immer๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ ์ํ๋ฅผ ์ค์๋ก ๋ณ๊ฒฝํ ๊ฑฑ์ ์์ด ๋๊ด์ ์ ๋ฐ์ดํธ ํจ์ ๋ด์์ ์์ ๋ ์ํ์ ๋ณต์ฌ๋ณธ์ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
import { useImmer } from 'use-immer';
import { experimental_useOptimistic } from 'react';
function ItemList() {
const [items, updateItems] = useImmer([
{ id: 1, name: "Item A", status: "pending" },
{ id: 2, name: "Item B", status: "completed" },
]);
const [optimisticItems, setOptimisticItems] = experimental_useOptimistic(
items,
(prevState, itemId) => {
return prevState.map((item) =>
item.id === itemId ? { ...item, status: "processing" } : item
);
}
);
const handleItemClick = (itemId) => {
setOptimisticItems(itemId);
// Send the update to the server
sendUpdateToServer(itemId);
};
return (
{optimisticItems.map((item) => (
- handleItemClick(item.id)}>
{item.name} - {item.status}
))}
);
}
5. ๋น๋๊ธฐ ์์ ๊ณผ ๋์์ฑ:
์น ์์ปค(Web Worker)๋ ๋น๋๊ธฐ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์คํ๋ก๋ํ์ธ์. ์ด๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋๊ด์ ์ ๋ฐ์ดํธ ์ค์๋ UI๊ฐ ๋ฐ์์ฑ์ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์: ๋๊ด์ ์ ๋ฐ์ดํธ ํจ์๊ฐ ๋ณต์กํ ๋ฐ์ดํฐ ๋ณํ์ ํฌํจํ๋ ๊ฒฝ์ฐ, ๋ณํ ๋ก์ง์ ์น ์์ปค๋ก ์ฎ๊ธฐ์ธ์. ์น ์์ปค๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ณํ์ ์ํํ๊ณ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ์ธ ์ค๋ ๋๋ก ๋ค์ ๋ณด๋ผ ์ ์์ต๋๋ค.
6. ๊ฐ์ํ(Virtualization):
ํฐ ๋ชฉ๋ก์ด๋ ํ ์ด๋ธ์ ๊ฒฝ์ฐ, ํ๋ฉด์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋งํ๋ ๊ฐ์ํ ๊ธฐ์ ์ ์ฌ์ฉํ์ธ์. ์ด๋ ๋๊ด์ ์ ๋ฐ์ดํธ ์ค์ ํ์ํ DOM ์กฐ์์ ์์ ํฌ๊ฒ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
์์: react-window๋ react-virtualized์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ๋ทฐํฌํธ ๋ด์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋งํ์ฌ ํฐ ๋ชฉ๋ก์ ํจ์จ์ ์ผ๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค.
7. ์ฝ๋ ๋ถํ (Code Splitting):
์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์๋ ๋ ์์ ์ฒญํฌ๋ก ๋๋์ธ์. ์ด๋ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ์ค์ด๊ณ ๋๊ด์ ์ ๋ฐ์ดํธ์ ์ฑ๋ฅ์ ํฌํจํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
์์: React.lazy์ Suspense๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋๋ง ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํ์ธ์. ์ด๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์ค์ ํ์ฑํ๊ณ ์คํํด์ผ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์์ ์ค์ ๋๋ค.
8. ํ๋กํ์ผ๋ง ๋ฐ ๋ชจ๋ํฐ๋ง:
React ๊ฐ๋ฐ์ ๋๊ตฌ ๋ฐ ๊ธฐํ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ธ์. ๋๊ด์ ์ ๋ฐ์ดํธ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ ๋ฐ์ดํธ ์๊ฐ, ๋ฆฌ๋ ๋๋ง ํ์, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ๊ฐ์ ์งํ๋ฅผ ์ถ์ ํ์ธ์.
์์: React Profiler๋ ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋๋์ง, ์ด๋ค ์ ๋ฐ์ดํธ ํจ์๊ฐ ์คํํ๋ ๋ฐ ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋์ง ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๊ตญ์ ์ ๊ณ ๋ ค์ฌํญ
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด experimental_useOptimistic์ ์ต์ ํํ ๋ ๋ค์ ์ฌํญ์ ์ผ๋์ ๋์ธ์:
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ: ๋ค๋ฅธ ์ง๋ฆฌ์ ์์น์ ์ฌ์ฉ์๋ ๋ค์ํ ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ ๊ฒฝํํ ๊ฒ์ ๋๋ค. ๋์ ์ง์ฐ ์๊ฐ์์๋ ๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ์ถฉ๋ถํ ์ด์ ์ ์ ๊ณตํ๋์ง ํ์ธํ์ธ์. ์ง์ฐ ์๊ฐ ๋ฌธ์ ๋ฅผ ์ํํ๊ธฐ ์ํด ํ๋ฆฌํ์นญ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ๊ธฐ๊ธฐ ์ฑ๋ฅ: ์ฌ์ฉ์๋ ๋ค์ํ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๊ฐ์ง ๊ด๋ฒ์ํ ๊ธฐ๊ธฐ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ ์ฌ์ ๊ธฐ๊ธฐ์์๋ ์ฑ๋ฅ์ด ์ข๋๋ก ๋๊ด์ ์ ๋ฐ์ดํธ ๋ก์ง์ ์ต์ ํํ์ธ์. ๊ธฐ๊ธฐ ์ฑ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๊ธฐ ์ํด ์ ์ํ ๋ก๋ฉ ๊ธฐ์ ์ ์ฌ์ฉํ์ธ์.
- ๋ฐ์ดํฐ ํ์งํ: ํ์งํ๋ ๋ฐ์ดํฐ(์: ๋ ์ง, ํตํ, ์ซ์)๋ฅผ ํฌํจํ๋ ๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ํ์ํ ๋, ์
๋ฐ์ดํธ๊ฐ ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ง๊ฒ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํ๋์๋์ง ํ์ธํ์ธ์. ๋ฐ์ดํฐ ํ์งํ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด
i18next์ ๊ฐ์ ๊ตญ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์. - ์ ๊ทผ์ฑ: ๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ๋ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ์ธ์. ์์ ์ด ์งํ ์ค์์ ๋ํ๋ด๋ ๋ช ํํ ์๊ฐ์ ์ ํธ๋ฅผ ์ ๊ณตํ๊ณ ์์ ์ด ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ์ ๋ ์ ์ ํ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ธ์. ARIA ์์ฑ์ ์ฌ์ฉํ์ฌ ๋๊ด์ ์ ๋ฐ์ดํธ์ ์ ๊ทผ์ฑ์ ํฅ์์ํค์ธ์.
- ์๊ฐ๋: ์๊ฐ ๋ฏผ๊ฐ์ฑ ๋ฐ์ดํฐ(์: ์ผ์ , ์ฝ์)๋ฅผ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ํ์ํ ๋ ์๊ฐ๋ ์ฐจ์ด์ ์ ์ํ์ธ์. ์ ํํ ํ์๋ฅผ ์ํด ์๊ฐ์ ์ฌ์ฉ์์ ํ์ง ์๊ฐ๋๋ก ๋ณํํ์ธ์.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์๋๋ฆฌ์ค
1. ์ ์ ์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ :
์ ์ ์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ผํ ์นดํธ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๊ด์ ์ ๋ฐ์ดํธ๋ก๋ถํฐ ํฐ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ "์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธฐ" ๋ฒํผ์ ํด๋ฆญํ๋ฉด, ์๋ฒ๊ฐ ์ถ๊ฐ๋ฅผ ํ์ธํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ํญ๋ชฉ์ด ์ฆ์ ์นดํธ ๋์คํ๋ ์ด์ ์ถ๊ฐ๋ฉ๋๋ค. ์ด๋ ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ ์ข์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
๊ตฌํ:
import { experimental_useOptimistic, useState } from 'react';
function ProductCard({ product }) {
const [cartItems, setCartItems] = useState([]);
const [optimisticCartItems, setOptimisticCartItems] = experimental_useOptimistic(
cartItems,
(prevState, productId) => [...prevState, productId]
);
const handleAddToCart = (productId) => {
setOptimisticCartItems(productId);
// Send the add-to-cart request to the server
sendAddToCartRequest(productId);
};
return (
{product.name}
{product.price}
Items in cart: {optimisticCartItems.length}
);
}
2. ์์ ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ :
์์ ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฒ์๋ฌผ์ '์ข์์'๋ฅผ ๋๋ฅด๊ฑฐ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ๋๊ด์ ์ ๋ฐ์ดํธ๋ก ํฅ์๋ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ "์ข์์" ๋ฒํผ์ ํด๋ฆญํ๋ฉด, ์๋ฒ ํ์ธ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ข์์ ์๊ฐ ์ฆ์ ์ฆ๊ฐํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์ฌ์ฉ์๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด ๋ฉ์์ง๊ฐ ์ฆ์ ์ฑํ ์ฐฝ์ ํ์๋ฉ๋๋ค.
3. ์์ ๊ด๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ :
์์ ๊ด๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ์ ์๋ฃ๋ก ํ์ํ๊ฑฐ๋ ์ฌ์ฉ์์๊ฒ ์์ ์ ํ ๋นํ๋ ๊ฒ์ ๋๊ด์ ์ ๋ฐ์ดํธ๋ก ๊ฐ์ ๋ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์์ ์ ์๋ฃ๋ก ํ์ํ๋ฉด, UI์์ ํด๋น ์์ ์ด ์ฆ์ ์๋ฃ๋ก ํ์๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ์์ ์ ํ ๋นํ๋ฉด, ํด๋น ์์ ์ด ์ฆ์ ํ ๋น๋ฐ์ ์ฌ๋์ ์์ ๋ชฉ๋ก์ ํ์๋ฉ๋๋ค.
๊ฒฐ๋ก
experimental_useOptimistic์ React ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์์ฑ ์๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. ๋๊ด์ ์
๋ฐ์ดํธ์ ์ฑ๋ฅ์ ์ํฅ์ ์ดํดํ๊ณ ์ด ๊ธ์์ ์ค๋ช
ํ ์ต์ ํ ์ ๋ต์ ๊ตฌํํจ์ผ๋ก์จ, ๋๊ด์ ์
๋ฐ์ดํธ๊ฐ ํจ๊ณผ์ ์ด๋ฉด์๋ ์ฑ๋ฅ์ด ์ข๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋กํ์ผ๋งํ๊ณ , ์ฑ๋ฅ ์งํ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ ์ธ๊ณ ์ฌ์ฉ์์ ํน์ ์๊ตฌ์ ๋ง๊ฒ ์ต์ ํ ๊ธฐ์ ์ ์กฐ์ ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ฑ๋ฅ๊ณผ ์ ๊ทผ์ฑ์ ์ด์ ์ ๋ง์ถค์ผ๋ก์จ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ฐ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.