React์ experimental_useFormState ํ ์ ์ฌ์ธต ๋ถ์ํ๊ณ , ํผ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ ๊ณ ๊ธ ์ต์ ํ ๊ธฐ์ ์ ๋ฐฐ์๋ณด์ธ์. ํจ์จ์ ์ธ ์ํ ์ ๋ฐ์ดํธ ๋ฐ ๋ ๋๋ง ์ ๋ต์ ํ๊ตฌํฉ๋๋ค.
React experimental_useFormState ์ฑ๋ฅ: ํผ ์ํ ์ ๋ฐ์ดํธ ์ต์ ํ ๋ง์คํฐํ๊ธฐ
React์ experimental_useFormState ํ
์ ์ปดํฌ๋ํธ ๋ด์์ ์ง์ ํผ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ํผ ์ก์
์ ์ฒ๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ํ
์ ํผ ํธ๋ค๋ง์ ๋จ์ํํ์ง๋ง, ๋ถ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ด๋ํ ์ ์์ต๋๋ค. ์ด ์ข
ํฉ ๊ฐ์ด๋์์๋ experimental_useFormState๋ฅผ ์ต๊ณ ์ฑ๋ฅ์ผ๋ก ์ต์ ํํ์ฌ ํนํ ๋ณต์กํ ํผ์์ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ํ๊ตฌํฉ๋๋ค.
experimental_useFormState ์ดํดํ๊ธฐ
experimental_useFormState ํ
(ํ์ฌ ์คํ์ ๊ธฐ๋ฅ์ด๋ฉฐ ๋ณ๊ฒฝ๋ ์ ์์)์ ํผ ์ํ์ ์ก์
์ ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ํ
์ ์ฌ์ฉํ๋ฉด ํผ ์
๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ก์
ํจ์๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ, React๋ ์ก์
๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ฆฌ๋ ๋๋งํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ํนํ ๋ณต์กํ ํผ ๋ก์ง์ ๋ค๋ฃฐ ๋ ๊ธฐ์กด์ ์ํ ๊ด๋ฆฌ ๊ธฐ์ ๋ณด๋ค ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
experimental_useFormState์ ์ฅ์
- ์ค์ํ๋ ํผ ๋ก์ง: ํผ ์ํ์ ์ ๋ฐ์ดํธ ๋ก์ง์ ํ๊ณณ์ ํตํฉํฉ๋๋ค.
- ๋จ์ํ๋ ์ ๋ฐ์ดํธ: ์ฌ์ฉ์ ์ํธ์์ฉ์ ๊ธฐ๋ฐํ ํผ ์ํ ์ ๋ฐ์ดํธ ๊ณผ์ ์ ๊ฐ์ํํฉ๋๋ค.
- ์ต์ ํ๋ ๋ฆฌ๋ ๋๋ง: React๊ฐ ์ด์ ์ํ์ ๋ค์ ์ํ๋ฅผ ๋น๊ตํ์ฌ ๋ถํ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํจ์ผ๋ก์จ ๋ฆฌ๋ ๋๋ง์ ์ต์ ํํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ฑ๋ฅ ๋ฌธ์ ์
์ด๋ฌํ ์ฅ์ ์๋ ๋ถ๊ตฌํ๊ณ experimental_useFormState๋ ์ ์คํ๊ฒ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง: ์ํ๋ฅผ ๋๋ฌด ์์ฃผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ๋ณ๊ฒฝ๋์ง ์์ ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํ๋ฉด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๋ณต์กํ ์ก์ ํจ์: ์ก์ ํจ์ ๋ด์์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ด๋ ๋ถ์ ํจ๊ณผ๋ฅผ ์ํํ๋ฉด UI ์๋๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค.
- ๋นํจ์จ์ ์ธ ์ํ ์ ๋ฐ์ดํธ: ์ผ๋ถ๋ง ๋ณ๊ฒฝ๋์์์๋ ๋ถ๊ตฌํ๊ณ ๋ชจ๋ ์ ๋ ฅ ๋ณ๊ฒฝ ์ ์ ์ฒด ํผ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
- ๋์ฉ๋ ํผ ๋ฐ์ดํฐ: ์ ์ ํ ์ต์ ํ ์์ด ๋๋์ ํผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ์ ๋ ๋๋ง ์๋ ์ ํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ต์ ํ ๊ธฐ๋ฒ
experimental_useFormState์ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ค๋ฉด ๋ค์ ์ต์ ํ ๊ธฐ๋ฒ์ ๊ณ ๋ คํ์ธ์:
1. ๋ฉ๋ชจ์ด์ ์ด์ ์ ํตํ ์ ์ด ์ปดํฌ๋ํธ ์ต์ ํ
์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ณ ๋ฉ๋ชจ์ด์ ์ด์
์ ํ์ฉํ์ฌ ํผ ์์์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ์ธ์. ์ ์ด ์ปดํฌ๋ํธ๋ React ์ํ๋ฅผ ์ ์ผํ ์ ๋ณด ์์ค๋ก ์์กดํ๋ฏ๋ก React๊ฐ ์
๋ฐ์ดํธ๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค. React.memo์ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์
๊ธฐ๋ฒ์ props๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์์:
```javascript import React, { experimental_useFormState, memo } from 'react'; const initialState = { name: '', email: '', }; async function updateFormState(prevState, formData) { "use server"; // ์๋ฒ ์ธก ์ ํจ์ฑ ๊ฒ์ฌ ๋๋ ์ ๋ฐ์ดํธ ์๋ฎฌ๋ ์ด์ await new Promise(resolve => setTimeout(resolve, 100)); return { ...prevState, ...formData }; } const InputField = memo(({ label, name, value, onChange }) => { console.log(`Rendering InputField: ${label}`); // ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋์ง ํ์ธ return (์ค๋ช :
InputField์ปดํฌ๋ํธ๋React.memo๋ก ๊ฐ์ธ์ ธ ์์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ์ props(label,name,value,onChange)๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.handleChangeํจ์๋ ์ ๋ฐ์ดํธ๋ ํ๋๋ง ํฌํจํ๋ ์ก์ ์ ๋์คํจ์นํฉ๋๋ค. ์ด๋ ์ ์ฒด ํผ ์ํ์ ๋ํ ๋ถํ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.- ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ์ ๋ ฅ ํ๋์ ๊ฐ์ด React ์ํ์ ์ํด ์ง์ ์ ์ด๋๋ฏ๋ก ์ ๋ฐ์ดํธ๊ฐ ๋ ์์ธก ๊ฐ๋ฅํ๊ณ ํจ์จ์ ์ด ๋ฉ๋๋ค.
2. ์ ๋ ฅ ์ ๋ฐ์ดํธ ๋๋ฐ์ด์ฑ ๋ฐ ์ค๋กํ๋ง
์ฆ์ ์ ๋ฐ์ดํธ๋ฅผ ์ ๋ฐํ๋ ํ๋(์: ๊ฒ์ ํ๋, ์ค์๊ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ)์ ๊ฒฝ์ฐ, ์ ๋ ฅ ์ ๋ฐ์ดํธ๋ฅผ ๋๋ฐ์ด์ฑํ๊ฑฐ๋ ์ค๋กํ๋งํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ๋๋ฐ์ด์ฑ์ ๋ง์ง๋ง ์ ๋ ฅ ํ ์ผ์ ์๊ฐ ๋์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐ๋ฉด, ์ค๋กํ๋ง์ ์ ๋ฐ์ดํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ ์๋๋ฅผ ์ ํํฉ๋๋ค.
์์ (Lodash๋ฅผ ์ฌ์ฉํ ๋๋ฐ์ด์ฑ):
```javascript import React, { experimental_useFormState, useCallback } from 'react'; import debounce from 'lodash.debounce'; const initialState = { searchTerm: '', }; async function updateFormState(prevState, formData) { "use server"; // ์๋ฒ ์ธก ๊ฒ์ ๋๋ ์ ๋ฐ์ดํธ ์๋ฎฌ๋ ์ด์ await new Promise(resolve => setTimeout(resolve, 500)); return { ...prevState, ...formData }; } function SearchForm() { const [state, dispatch] = experimental_useFormState(updateFormState, initialState); const debouncedDispatch = useCallback( debounce((formData) => { dispatch(formData); }, 300), [dispatch] ); const handleChange = (e) => { const { name, value } = e.target; debouncedDispatch({ [name]: value }); }; return ( ); } export default SearchForm; ```์ค๋ช :
- Lodash์
debounceํจ์๋ ํผ ์ ๋ฐ์ดํธ ๋์คํจ์น๋ฅผ ์ง์ฐ์ํค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. debouncedDispatchํจ์๋dispatchํจ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋๋ฐ์ด์ค๋ ํจ์๊ฐ ์ฌ์์ฑ๋๋๋กuseCallback์ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค.handleChangeํจ์๋ ์ ๋ฐ์ดํธ๋ ํผ ๋ฐ์ดํฐ์ ํจ๊ปdebouncedDispatch๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉ์๊ฐ 300ms ๋์ ํ์ดํ์ ๋ฉ์ถ ๋๊น์ง ์ค์ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ฐ์ํต๋๋ค.
3. ๋ถ๋ณ์ฑ๊ณผ ์์ ๋น๊ต
์ก์ ํจ์๊ฐ ๊ธฐ์กด ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋์ ์ ๋ฐ์ดํธ๋ ์ํ ๊ฐ์ ๊ฐ์ง ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ก ํ์ธ์. React๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ธฐ ์ํด ์์ ๋น๊ต์ ์์กดํ๋ฉฐ, ์ํ๋ฅผ ์ง์ ๋ณ๊ฒฝํ๋ฉด ๋ฆฌ๋ ๋๋ง์ด ํ์ํ ๋ ๋ฐ์ํ์ง ์์ ์ ์์ต๋๋ค.
์์ (์ฌ๋ฐ๋ฅธ ๋ถ๋ณ์ฑ):
```javascript async function updateFormState(prevState, formData) { "use server"; // ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค return { ...prevState, ...formData }; } ```์์ (์๋ชป๋ ๊ฐ๋ณ์ฑ):
```javascript async function updateFormState(prevState, formData) { "use server"; // ์๋ชป๋ ๋ฐฉ๋ฒ: ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค Object.assign(prevState, formData); // ์ด ๋ฐฉ๋ฒ์ ํผํ์ธ์! return prevState; } ```์ค๋ช :
- ์ฌ๋ฐ๋ฅธ ์์๋ ์คํ๋ ๋ ์ฐ์ฐ์(
...)๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธ๋ ํผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ React๊ฐ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. - ์๋ชป๋ ์์๋
Object.assign์ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ์ํ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ ํฉ๋๋ค. ์ด๋ React๊ฐ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ง ๋ชปํ๊ฒ ํ์ฌ ์๊ธฐ์น ์์ ๋์๊ณผ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
4. ์ ํ์ ์ํ ์ ๋ฐ์ดํธ
๋ชจ๋ ์ ๋ ฅ ๋ณ๊ฒฝ ์ ์ ์ฒด ์ํ ๊ฐ์ฒด๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋์ , ๋ณ๊ฒฝ๋ ์ํ์ ํน์ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ์ธ์. ์ด๋ React๊ฐ ์ํํด์ผ ํ ์์ ๋์ ์ค์ด๊ณ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์์:
```javascript const handleChange = (e) => { const { name, value } = e.target; dispatch({ [name]: value }); // ํน์ ํ๋๋ง ์ ๋ฐ์ดํธํฉ๋๋ค }; ```์ค๋ช :
handleChangeํจ์๋ ์ ๋ ฅ ํ๋์name์์ฑ์ ์ฌ์ฉํ์ฌ ์ํ์์ ํด๋น ํ๋๋ง ์ ๋ฐ์ดํธํฉ๋๋ค.- ์ด๋ ์ ์ฒด ์ํ ๊ฐ์ฒด๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ํนํ ๋ง์ ํ๋๊ฐ ์๋ ํผ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
5. ๋๊ท๋ชจ ํผ์ ์์ ์ปดํฌ๋ํธ๋ก ๋ถํ ํ๊ธฐ
ํผ์ด ๋งค์ฐ ํฐ ๊ฒฝ์ฐ, ๋ ์๊ณ ๋ ๋ฆฝ์ ์ธ ์ปดํฌ๋ํธ๋ก ๋ถํ ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์ด๋ ๋ฆฌ๋ ๋๋ง์ ๋ถ๋ฆฌํ๊ณ ํผ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์์:
```javascript // MyForm.js import React, { experimental_useFormState } from 'react'; import PersonalInfo from './PersonalInfo'; import AddressInfo from './AddressInfo'; const initialState = { firstName: '', lastName: '', email: '', address: '', city: '', }; async function updateFormState(prevState, formData) { "use server"; // ์๋ฒ ์ธก ์ ํจ์ฑ ๊ฒ์ฌ ๋๋ ์ ๋ฐ์ดํธ ์๋ฎฌ๋ ์ด์ await new Promise(resolve => setTimeout(resolve, 100)); return { ...prevState, ...formData }; } function MyForm() { const [state, dispatch] = experimental_useFormState(updateFormState, initialState); const handleChange = (e) => { const { name, value } = e.target; dispatch({ [name]: value }); }; return ( ); } export default MyForm; // PersonalInfo.js import React from 'react'; function PersonalInfo({ state, onChange }) { return (๊ฐ์ธ ์ ๋ณด
์ฃผ์ ์ ๋ณด
์ค๋ช :
- ํผ์
PersonalInfo์AddressInfo๋ ๊ฐ์ ์ปดํฌ๋ํธ๋ก ๋ถํ ๋ฉ๋๋ค. - ๊ฐ ์ปดํฌ๋ํธ๋ ํผ์ ์์ฒด ์น์ ์ ๊ด๋ฆฌํ๋ฉฐ ๊ด๋ จ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
- ์ด๋ ๊ฐ ์ ๋ฐ์ดํธ ์ React๊ฐ ์ํํด์ผ ํ ์์ ๋์ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
6. ์ก์ ํจ์ ์ต์ ํ
์ก์ ํจ์๊ฐ ๊ฐ๋ฅํ ํ ํจ์จ์ ์ธ์ง ํ์ธํ์ธ์. ์ก์ ํจ์ ๋ด์์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ด๋ ๋ถ์ ํจ๊ณผ๋ฅผ ์ํํ๋ฉด UI ์๋๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค. ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ผ๋ก ์คํ๋ก๋ํ๊ฑฐ๋ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
์์ (๋น์ฉ์ด ํฐ ๊ณ์ฐ ๋ฉ๋ชจ์ด์ ์ด์ ํ๊ธฐ):
```javascript import React, { experimental_useFormState, useMemo } from 'react'; const initialState = { input: '', result: '', }; async function updateFormState(prevState, formData) { "use server"; // ๋น์ฉ์ด ํฐ ๊ณ์ฐ ์๋ฎฌ๋ ์ด์ const result = await expensiveComputation(formData.input); return { ...prevState, ...formData, result }; } const expensiveComputation = async (input) => { // ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ณ์ฐ ์๋ฎฌ๋ ์ด์ await new Promise(resolve => setTimeout(resolve, 500)); return input.toUpperCase(); }; function ComputationForm() { const [state, dispatch] = experimental_useFormState(updateFormState, initialState); const memoizedResult = useMemo(() => state.result, [state.result]); const handleChange = (e) => { const { name, value } = e.target; dispatch({ [name]: value }); }; return ( ); } export default ComputationForm; ```์ค๋ช :
expensiveComputationํจ์๋ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ณ์ฐ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค.useMemoํ ์ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ฆํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋state.result๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๊ฒฐ๊ณผ๊ฐ ๋ค์ ๊ณ์ฐ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.- ์ด๋ ๋ถํ์ํ ๊ฒฐ๊ณผ ์ฌ๊ณ์ฐ์ ๋ฐฉ์งํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
7. ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ํ ๊ฐ์ํ
ํผ์ด ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ(์: ์์ฒ ๊ฐ์ ์ต์ ๋ชฉ๋ก)๋ฅผ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ, ๊ฐ์ํ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋งํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์ด๋ React๊ฐ ๊ด๋ฆฌํด์ผ ํ๋ DOM ๋ ธ๋ ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
react-window๋ react-virtualized์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ React ์ ํ๋ฆฌ์ผ์ด์
์์ ๊ฐ์ํ๋ฅผ ๊ตฌํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
8. ์๋ฒ ์ก์ ๋ฐ ์ ์ง์ ํฅ์
ํผ ์ ์ถ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ฒ ์ก์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์ด๋ ํผ ์ฒ๋ฆฌ๋ฅผ ์๋ฒ๋ก ์คํ๋ก๋ํ๊ณ ํด๋ผ์ด์ธํธ์์ ์คํํด์ผ ํ๋ JavaScript์ ์์ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ํ, JavaScript๊ฐ ๋นํ์ฑํ๋ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ ํผ ๊ธฐ๋ฅ์ด ์๋ํ๋๋ก ์ ์ง์ ํฅ์์ ์ ์ฉํ ์ ์์ต๋๋ค.
9. ํ๋กํ์ผ๋ง ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
React DevTools ๋ฐ ๋ธ๋ผ์ฐ์ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ธ์. ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง, CPU ์ฌ์ฉ๋ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ๋ชจ๋ํฐ๋งํ์ฌ ์ต์ ํ๊ฐ ํ์ํ ์์ญ์ ์ฐพ์๋ด์ธ์. ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง์ ์ต์ ํ๊ฐ ํจ๊ณผ์ ์ธ์ง ํ์ธํ๊ณ ํผ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ์๋ก์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ํผ ๋์์ธ ๊ณ ๋ ค์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํผ์ ๋์์ธํ ๋๋ ๋ฌธํ์ , ์ง์ญ์ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์ฃผ์ ํ์: ๊ตญ๊ฐ๋ง๋ค ์ฃผ์ ํ์์ด ๋ค๋ฆ ๋๋ค. ๋ค์ํ ์ฃผ์ ํ์์ ์ฒ๋ฆฌํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๊ฐ ์ฃผ์ ๊ตฌ์ฑ ์์์ ๋ํด ๋ณ๋์ ํ๋๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ๊ตญ๊ฐ์์๋ ๋์ ์ด๋ฆ ์์ ์ฐํธ๋ฒํธ๋ฅผ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ๊ตญ๊ฐ์์๋ ๋ค์ ์ฌ์ฉํฉ๋๋ค.
- ๋ ์ง ๋ฐ ์๊ฐ ํ์: ํ์งํ ๋ฐ ๋ค์ํ ๋ ์ง/์๊ฐ ํ์(์: MM/DD/YYYY ๋ DD/MM/YYYY)์ ์ง์ํ๋ ๋ ์ง ๋ฐ ์๊ฐ ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ ํ๋ฒํธ ํ์: ๊ตญ์ ์ ํ๋ฒํธ ํ์๊ณผ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ง์ํ๋ ์ ํ๋ฒํธ ์ ๋ ฅ์ ์ฌ์ฉํ์ธ์.
- ํตํ ํ์: ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ํตํ ๊ธฐํธ์ ํ์์ ํ์ํ์ธ์.
- ์ด๋ฆ ์์: ์ผ๋ถ ๋ฌธํ๊ถ์์๋ ์ฑ์ด ์ด๋ฆ๋ณด๋ค ๋จผ์ ์ต๋๋ค. ์ด๋ฆ๊ณผ ์ฑ์ ๋ํด ๋ณ๋์ ํ๋๋ฅผ ์ ๊ณตํ๊ณ ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ์์๋ฅผ ์กฐ์ ํ์ธ์.
- ์ ๊ทผ์ฑ: ์ ์ ํ ARIA ์์ฑ์ ์ ๊ณตํ๊ณ ์๋งจํฑ HTML ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ ํผ์ ์ ๊ทผํ ์ ์๋๋ก ํ์ธ์.
- ํ์งํ: ํผ ๋ ์ด๋ธ๊ณผ ๋ฉ์์ง๋ฅผ ์ฌ์ฉ์์ ์ธ์ด๋ก ๋ฒ์ญํ์ธ์.
์์ (๊ตญ์ ์ ํ๋ฒํธ ์ ๋ ฅ):
react-phone-number-input๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ๋ค์ํ ๊ตญ์ ํ์์ผ๋ก ์ ํ๋ฒํธ๋ฅผ ์
๋ ฅํ ์ ์์ต๋๋ค:
๊ฒฐ๋ก
experimental_useFormState์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ค๋ฉด ์ ์ด ์ปดํฌ๋ํธ, ๋ฉ๋ชจ์ด์ ์ด์
, ๋๋ฐ์ด์ฑ, ๋ถ๋ณ์ฑ, ์ ํ์ ์ํ ์
๋ฐ์ดํธ ๋ฐ ํจ์จ์ ์ธ ์ก์
ํจ์๋ฅผ ํฌํจํ ๊ธฐ์ ์ ์กฐํฉ์ด ํ์ํฉ๋๋ค. ์ด๋ฌํ ์์๋ฅผ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ณ ์ฑ๋ฅ ํผ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ต์ ํ๊ฐ ํจ๊ณผ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ํผ์ ํ๋กํ์ผ๋งํ๊ณ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ๊ธ๋ก๋ฒ ๋์์ธ ์ธก๋ฉด์ ๊ณ ๋ คํจ์ผ๋ก์จ ๋ค์ํ ๊ตญ์ ์ฌ์ฉ์๋ฅผ ์ํด ์ ๊ทผํ๊ธฐ ์ฝ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ํผ์ ๋ง๋ค ์ ์์ต๋๋ค.
experimental_useFormState๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ต์ React ๋ฌธ์์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ์ ํ์ธํ๋ ๊ฒ์ด ์ต์ ์ ํผ ์ฑ๋ฅ์ ์ ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ์ต์ ํ์ ์ ์ํ๊ธฐ ์ํด ํผ ๊ตฌํ์ ์ ๊ธฐ์ ์ผ๋ก ๊ฒํ ํ๊ณ ๊ฐ์ ํ์ธ์.