React์ experimental_useFormState ์ฝ๋๋ค์ดํฐ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค. ๊ธฐ๋ฅ, ์ด์ , ๋ณต์กํ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ํจ์จ์ ์ธ ํผ ์ํ ๋๊ธฐํ๋ฅผ ์ํ ์ค์ ์ฌ์ฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
React experimental_useFormState ์ฝ๋๋ค์ดํฐ: ํผ ์ํ ๋๊ธฐํ ๋ง์คํฐํ๊ธฐ
React์ ์งํํ๋ ํ๊ฒฝ์ ๊ฐ๋ฐ์๊ฐ ๋ณด๋ค ํจ์จ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์๋๋ก ํ์ ์ ์ธ ๋๊ตฌ๋ฅผ ๊ณ์ ๋์
ํ๊ณ ์์ต๋๋ค. ํ์ฌ ์คํ์ ์ธ ๋๊ตฌ ์ค ํ๋๋ experimental_useFormState ์ฝ๋๋ค์ดํฐ์
๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ React ์ ํ๋ฆฌ์ผ์ด์
๋ด์์ ํผ ์ํ ๋๊ธฐํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ด ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ดํดํ๊ณ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ข
ํฉ์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ ๋ฌด์์ธ๊ฐ์?
experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ ํนํ ๋น๋๊ธฐ ์
๋ฐ์ดํธ ๋๋ ์๋ฒ ์ก์
์ ์ฒ๋ฆฌํ ๋ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ๋ฌ ๋ถ๋ถ์์ ํผ ์ํ๋ฅผ ๋๊ธฐํํ ์ ์๋ ๋ฉ์ปค๋์ฆ์
๋๋ค. ๋ณต์กํ ํผ ์ํธ ์์ฉ์ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ์ํ ์
๋ฐ์ดํธ ๋ฐ ๋ถ์์ฉ์ ์ฒ๋ฆฌํ๋ ์ค์ ์ง์ค์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์ ํต์ ์ผ๋ก React์์ ํผ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด ์ฌ๋ฌ useState ํ
์ ์ ๊ธ๋งํ๊ณ , props๋ฅผ ์ ๋ฌํ๊ณ , ๋น๋๊ธฐ ์์
์ด ๊ด๋ จ๋ ๊ฒฝ์ฐ ์ ์ฌ์ ์ธ ๊ฒฝ์ ์กฐ๊ฑด์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ ๋ณด๋ค ๊ตฌ์กฐํ๋๊ณ ์์ธก ๊ฐ๋ฅํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ์ฌ ์ด๋ฌํ ๋ณต์ก์ฑ์ ์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
experimental_useFormState ์ฝ๋๋ค์ดํฐ ์ฌ์ฉ์ ์ด์
- ์ค์ ์ง์ค์ ์ํ ๊ด๋ฆฌ: ํผ ์ํ์ ๋ํ ๋จ์ผ ์์ค๋ฅผ ์ ๊ณตํ์ฌ ์ถ๋ก ํ๊ณ ๋๋ฒ๊ทธํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ๊ฐ์ํ๋ ๋น๋๊ธฐ ์ ๋ฐ์ดํธ: ์๋ฒ ์ก์ ๋๋ ๊ธฐํ ๋น๋๊ธฐ ์์ ์ ํฌํจํ๋ ํผ ์ ์ถ ์ฒ๋ฆฌ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํฉ๋๋ค.
- ํฅ์๋ ์ฑ๋ฅ: ํผ ์ํ ๋ณ๊ฒฝ์ ์ํฅ์ ๋ฐ๋ ๊ตฌ์ฑ ์์๋ง ์ ๋ฐ์ดํธํ์ฌ ๋ค์ ๋ ๋๋ง์ ์ต์ ํํฉ๋๋ค.
- ํฅ์๋ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ์ฑ: ์ ์ฉ ์ฝ๋๋ค์ดํฐ ๋ด์์ ํผ ๋ก์ง์ ์บก์ํํ์ฌ ๋ ๊นจ๋ํ๊ณ ์ฒด๊ณ์ ์ธ ์ฝ๋๋ฅผ ์ด์งํฉ๋๋ค.
- ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ: ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๊ฒ ์ฒ๋ฆฌํ๊ณ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ์ฌ ์ผ๊ด๋๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
ํต์ฌ ๊ฐ๋ ์ดํด
๊ตฌํ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ๋ช ๊ฐ์ง ํต์ฌ ๊ฐ๋ ์ ๋ช ํํ ํด ๋ณด๊ฒ ์ต๋๋ค.
์ฝ๋๋ค์ดํฐ
์ฝ๋๋ค์ดํฐ๋ ํผ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ์ค์ ํ๋ธ์ ๋๋ค. ํ์ฌ ์ํ๋ฅผ ์ ์งํ๊ณ , ์ํ ์ ๋ฐ์ดํธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ณ , ๋ถ์์ฉ์ ์ฒ๋ฆฌํฉ๋๋ค. ํผ ๋ฐ์ดํฐ ํ๋ฆ์ ์ค์ผ์คํธ๋ ์ดํฐ๋ผ๊ณ ์๊ฐํ์ญ์์ค. ์ด๊ธฐ ์ํ์ ์ก์ ์ ๋ํ ์๋ต์ผ๋ก ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๋ฐฉ์์ ์ง์ํ๋ ๋ฆฌ๋์ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
์ํ
์ํ๋ ํผ ํ๋์ ํ์ฌ ๊ฐ๊ณผ ๊ด๋ จ ๋ฉํ๋ฐ์ดํฐ(์: ์ ํจ์ฑ ๊ฒ์ฌ ์ค๋ฅ, ๋ก๋ฉ ์ํ)๋ฅผ ๋ํ๋ ๋๋ค. ์ฝ๋๋ค์ดํฐ๊ฐ ๊ด๋ฆฌํ๊ณ ํผ ๊ตฌ์ฑ ์์์ ๋ฐฐํฌํ๋ ๋ฐ์ดํฐ์ ๋๋ค.
์ก์
์ก์ ์ ์ํ๋ฅผ ์์ ํ๋ ค๋ ์๋๋ฅผ ์ค๋ช ํ๋ ์ผ๋ฐ JavaScript ๊ฐ์ฒด์ ๋๋ค. ์ก์ ์ ์ฝ๋๋ค์ดํฐ์ ๋์คํจ์น๋๋ฉฐ, ์ฝ๋๋ค์ดํฐ๋ ์ก์ ์ ํ๊ณผ ํ์ด๋ก๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ก์ ์ ์ฝ๋๋ค์ดํฐ์ ๋ณ๊ฒฝํด์ผ ํ ์ฌํญ์ ์๋ ค์ฃผ๋ ๋ฉ์ ์ ์ ๋๋ค.
๋ฆฌ๋์
๋ฆฌ๋์๋ ํ์ฌ ์ํ์ ์ก์ ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ ์ํ๋ฅผ ๋ฐํํ๋ ์์ ํจ์์ ๋๋ค. ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ ์ํ๊ฐ ์งํํ๋ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ ์ญํ ์ ํ๋ ์ฝ๋๋ค์ดํฐ์ ํต์ฌ์ ๋๋ค. ์ด ํจ์๋ ์์ํด์ผ ํฉ๋๋ค. ์ฆ, ๋ถ์์ฉ์ด ์์ด์ผ ํ๋ฉฐ ๋์ผํ ์ ๋ ฅ์ ๋ํด ํญ์ ๋์ผํ ์ถ๋ ฅ์ ๋ฐํํด์ผ ํฉ๋๋ค.
์๋ฒ ์ก์ (๋ฐ ๋ฎคํ ์ด์ )
์๋ฒ ์ก์
์ ์๋ฒ์์ ์คํ๋๋ ๋น๋๊ธฐ ํจ์์
๋๋ค. ํผ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ถํ๊ฑฐ๋ ๋ค๋ฅธ ์๋ฒ ์ธก ์์
์ ์ํํ๋ ๋ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฎคํ
์ด์
์ ๋น์ทํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ์์
(๋ ์ฝ๋ ์์ฑ, ์
๋ฐ์ดํธ ๋๋ ์ญ์ )์ ๋ํ๋
๋๋ค. experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ ์ด๋ฌํ ๋น๋๊ธฐ ํธ์ถ์ ์ค์ฌ์ผ๋ก ์ํ๋ฅผ ์ค์ผ์คํธ๋ ์ด์
ํ๊ณ ๋ก๋ฉ ์ํ์ ์ค๋ฅ ์กฐ๊ฑด์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ ๋ ๋น์ ๋ฐํฉ๋๋ค.
์ค์ ๊ตฌํ: ๋จ๊ณ๋ณ ๊ฐ์ด๋
experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ค์ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ์ฉ์ ์ ๋ณด(์ด๋ฆ ๋ฐ ์ด๋ฉ์ผ)๋ฅผ ์์งํ๊ณ ์๋ฒ์ ์ ์ถํ๊ธฐ ์ํ ๊ฐ๋จํ ํผ์ ๋ง๋ญ๋๋ค.
1. ์ฝ๋๋ค์ดํฐ ์ค์
๋จผ์ ์ฝ๋๋ค์ดํฐ๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ด๊ธฐ ์ํ๋ฅผ ๋ง๋ค๊ณ , ์ก์ ์ ํ์ ์ ์ํ๊ณ , ๋ฆฌ๋์ ํจ์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
// ์ด๊ธฐ ์ํ
const initialState = {
name: '',
email: '',
isLoading: false,
error: null,
};
// ์ก์
์ ํ
const UPDATE_NAME = 'UPDATE_NAME';
const UPDATE_EMAIL = 'UPDATE_EMAIL';
const SUBMIT_FORM = 'SUBMIT_FORM';
const SUBMIT_SUCCESS = 'SUBMIT_SUCCESS';
const SUBMIT_ERROR = 'SUBMIT_ERROR';
// ๋ฆฌ๋์ ํจ์
function reducer(state, action) {
switch (action.type) {
case UPDATE_NAME:
return { ...state, name: action.payload };
case UPDATE_EMAIL:
return { ...state, email: action.payload };
case SUBMIT_FORM:
return { ...state, isLoading: true, error: null };
case SUBMIT_SUCCESS:
return { ...state, isLoading: false };
case SUBMIT_ERROR:
return { ...state, isLoading: false, error: action.payload };
default:
return state;
}
}
2. ํผ ๊ตฌ์ฑ ์์ ๋ง๋ค๊ธฐ
๋ค์์ผ๋ก ํผ์ ๋ ๋๋งํ๋ React ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ญ๋๋ค. experimental_useFormState ํ
์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์์๋ฅผ ์ฝ๋๋ค์ดํฐ์ ์ฐ๊ฒฐํฉ๋๋ค.
import React, { useCallback } from 'react';
import { experimental_useFormState as useFormState } from 'react';
function MyForm() {
const [state, dispatch] = useFormState(reducer, initialState);
const handleChange = useCallback((event) => {
const { name, value } = event.target;
dispatch({ type: name === 'name' ? UPDATE_NAME : UPDATE_EMAIL, payload: value });
}, [dispatch]);
const handleSubmit = useCallback(async (event) => {
event.preventDefault();
dispatch({ type: SUBMIT_FORM });
try {
// ์๋ฒ ์์ฒญ ์๋ฎฌ๋ ์ด์
await new Promise((resolve) => setTimeout(resolve, 1000));
// ์ฑ๊ณต์ ์ธ ์ ์ถ ์๋ฎฌ๋ ์ด์
dispatch({ type: SUBMIT_SUCCESS });
alert('ํผ์ด ์ฑ๊ณต์ ์ผ๋ก ์ ์ถ๋์์ต๋๋ค!');
} catch (error) {
dispatch({ type: SUBMIT_ERROR, payload: error.message });
}
}, [dispatch]);
return (
);
}
export default MyForm;
3. ์ฝ๋ ์ค๋ช
useFormState(reducer, initialState): ์ด ํ ์ ๊ตฌ์ฑ ์์๋ฅผ ์ฝ๋๋ค์ดํฐ์ ์ฐ๊ฒฐํฉ๋๋ค. ๋ฆฌ๋์ ํจ์์ ์ด๊ธฐ ์ํ๋ฅผ ์ธ์๋ก ์ฌ์ฉํ๊ณ ํ์ฌ ์ํ์ ๋์คํจ์น ํจ์๋ฅผ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.handleChange(event): ์ด ํจ์๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ ํ๋์ ์ ๋ ฅํ ๋ ํธ์ถ๋ฉ๋๋ค. ์ด๋ฒคํธ ๊ฐ์ฒด์์name๊ณผvalue๋ฅผ ์ถ์ถํ๊ณ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ก์ ์ ๋์คํจ์นํฉ๋๋ค.handleSubmit(event): ์ด ํจ์๋ ์ฌ์ฉ์๊ฐ ํผ์ ์ ์ถํ ๋ ํธ์ถ๋ฉ๋๋ค. ๊ธฐ๋ณธ ํผ ์ ์ถ ๋์์ ๋ฐฉ์งํ๊ณ ,SUBMIT_FORM์ก์ ์ ๋์คํจ์นํ์ฌ ๋ก๋ฉ ์ํ๋ฅผ ์ค์ ํ ๋ค์ ์๋ฒ ์์ฒญ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค. ์์ฒญ์ด ์ฑ๊ณตํ๋ฉดSUBMIT_SUCCESS์ก์ ์ ๋์คํจ์นํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉดSUBMIT_ERROR์ก์ ์ ๋์คํจ์นํฉ๋๋ค.- ์ํ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ: ๊ตฌ์ฑ ์์๋ ํผ ํ๋์ ์ ์ถ ๋ฒํผ์ ๋ ๋๋งํฉ๋๋ค. ๋ํ ํผ์ด ์ ์ถ๋๋ ๋์ ๋ก๋ฉ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ๋ฒ ๋ฐ ๊ณ ๋ ค ์ฌํญ
์์ ์๋ experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธฐ๋ณธ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ๊ณ ๊ธ ์ฌ์ฉ ์๋๋ฆฌ์ค ๋ฐ ๊ณ ๋ ค ์ฌํญ์
๋๋ค.
๋ณต์กํ ์ํ ๊ตฌ์กฐ
๋ ๋ณต์กํ ํผ์ ๊ฒฝ์ฐ ์ค์ฒฉ๋ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ ๋ ์ ๊ตํ ์ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค. reducer ํจ์๋ ์ด๋ฌํ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง ์ํ๋ฅผ ๋ถ๋ณ์ ์ผ๋ก ์
๋ฐ์ดํธํ๋ ๋ฐ ์ฃผ์ํด์ผ ํฉ๋๋ค.
์:
const initialState = {
profile: {
name: '',
email: '',
},
address: {
street: '',
city: '',
},
};
function reducer(state, action) {
switch (action.type) {
case UPDATE_PROFILE_NAME:
return { ...state, profile: { ...state.profile, name: action.payload } };
// ... ๊ธฐํ ์ฌ๋ก
default:
return state;
}
}
๋น๋๊ธฐ ์ ํจ์ฑ ๊ฒ์ฌ
experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ ํจ์ฑ ๊ฒ์ฌ ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ ์ก์
์ ๋์คํจ์นํ๊ณ , ์๋ฒ์ ๋น๋๊ธฐ ์์ฒญ์ ์ํํ ๋ค์, ๋ค๋ฅธ ์ก์
์ ๋์คํจ์นํ์ฌ ์ ํจ์ฑ ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ก ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
๋๊ด์ ์ ๋ฐ์ดํธ
๋๊ด์ ์ ๋ฐ์ดํธ๋ ์๋ฒ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฌ์ฉ์๊ฐ ํผ์ ์ ์ถํ ์งํ UI๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ์ง๋ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ง๋ง ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๊ฑฐ๋ถํ๋ ๊ฒฝ์ฐ ์ ์คํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
์ค๋ฅ ๊ฒฝ๊ณ
์ค๋ฅ ๊ฒฝ๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ํผ ์ ์ถ ๋๋ ์ํ ์ ๋ฐ์ดํธ ์ค์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ถฉ๋ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ ๊ทผ์ฑ ๊ณ ๋ ค ์ฌํญ
ํผ์ด ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ์ก์ธ์คํ ์ ์๋์ง ํ์ธํฉ๋๋ค. ์๋งจํฑ HTML ์์๋ฅผ ์ฌ์ฉํ๊ณ , ๋ชจ๋ ํผ ํ๋์ ๋ช ํํ ๋ ์ด๋ธ์ ์ ๊ณตํ๊ณ , ํฌ์ปค์ค ๊ด๋ฆฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
์ค์ ์์ ๋ฐ ์ฌ๋ก ์ฐ๊ตฌ
experimental_useFormState ์ฝ๋๋ค์ดํฐ๊ฐ ํนํ ์ ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- ์ ์ ์๊ฑฐ๋ ์ฒดํฌ์์ ํ๋ฆ: ๋ฐฐ์ก ์ฃผ์, ์ฒญ๊ตฌ ์ ๋ณด ๋ฐ ๊ฒฐ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ํฌํจํ์ฌ ๋ค๋จ๊ณ ์ฒดํฌ์์ ํ๋ก์ธ์ค์ ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ๋ณต์กํ ๊ตฌ์ฑ ํผ: ์ฌ์ฉ์ ํ๋กํ ์ค์ ๋๋ ์ ํ ๊ตฌ์ฑ ์ต์ ๊ณผ ๊ฐ์ด ์๋ง์ ํ๋์ ์ข ์์ฑ์ด ์๋ ํผ์ ์ํ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ค์๊ฐ ํ์ ๋๊ตฌ: ํ์ ๋ฌธ์ ํธ์ง๊ธฐ ๋๋ ํ๋ก์ ํธ ๊ด๋ฆฌ ๋๊ตฌ์ ๊ฐ์ด ์ฌ๋ฌ ์ฌ์ฉ์์ ํผ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋๊ธฐํํฉ๋๋ค. ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๋์ผํ ํผ์ ํธ์งํ์ฌ ์ถฉ๋ ํด๊ฒฐ ๋ฐ ์ค์๊ฐ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๊ตญ์ ํ(i18n) ํผ: ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ง์ํด์ผ ํ๋ ํผ์ ๋ง๋ค ๋ ์ฝ๋๋ค์ดํฐ๋ ๋ค์ํ ๋ฒ์ญ์ ๊ด๋ฆฌํ๊ณ ๋ก์ผ์ผ ๊ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์กฐ๊ฑด๋ถ ๋ก์ง์ด ์๋ ํผ: ํน์ ํ๋์ ๊ฐ์์ฑ ๋๋ ๋์์ด ๋ค๋ฅธ ํ๋์ ๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ํผ์ ๋๋ค. ์ฝ๋๋ค์ดํฐ๋ ๋ณต์กํ ๋ก์ง์ ๊ด๋ฆฌํ๊ณ ํผ์ด ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ํ๋๋ก ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ๋ฐ๋ผ ํ์ ์ง๋ฌธ์ด ํ์๋๋ ์ค๋ฌธ ์กฐ์ฌ์ ๋๋ค.
์ฌ๋ก ์ฐ๊ตฌ: ๋ณต์กํ ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ ๋จ์ํ
ํ ๊ธ์ต ๊ธฐ๊ด์ ๊ณ์ข ๊ฐ์ค ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณต์กํ ํผ์ผ๋ก ์ด๋ ค์์ ๊ฒช๊ณ ์์์ต๋๋ค. ์ด ํผ์๋ ์ฌ๋ฌ ๋จ๊ณ, ์๋ง์ ํ๋ ๋ฐ ๋ณต์กํ ์ ํจ์ฑ ๊ฒ์ฌ ๊ท์น์ด ํฌํจ๋์์ต๋๋ค. ์ฌ๋ฌ useState ํ
๊ณผ prop ๋๋ฆด๋ง์ ์์กดํ๋ ๊ธฐ์กด ๊ตฌํ์ ์ ์ง ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ ์ ๋ ์ด๋ ค์์ง๊ณ ์์์ต๋๋ค. experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ฅผ ์ฑํํจ์ผ๋ก์จ ํผ ์ํ ๊ด๋ฆฌ๋ฅผ ์ค์ ์ง์คํํ๊ณ , ์ ํจ์ฑ ๊ฒ์ฌ ๋ก์ง์ ๋จ์ํํ๊ณ , ์ ๋ฐ์ ์ธ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๊ฐ์ ํ ์ ์์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋ ๊ฐ๋ ฅํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์ํ์ต๋๋ค.
experimental_useFormState ์ฝ๋๋ค์ดํฐ์ ๋ค๋ฅธ ์ํ ๊ด๋ฆฌ ์๋ฃจ์ ๋น๊ต
experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ ํผ ์ํ ๋๊ธฐํ๋ฅผ ์ํ ๊ธฐ๋ณธ ์ ๊ณต ์๋ฃจ์
์ ์ ๊ณตํ์ง๋ง Redux, Zustand ๋ฐ Jotai์ ๊ฐ์ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๊ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ณ ์ ํ ๊ฐ์ ๊ณผ ์ฝ์ ์ ์ ๊ณตํ๋ฉฐ ์ต์์ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- Redux: ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ์ค์ ์ง์ค์ ์ ์ฅ์๋ฅผ ์ ๊ณตํ๋ ์ฑ์ํ๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Redux๋ ๋ณต์กํ ์ํ ์ข ์์ฑ์ด ์๋ ํฌ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ฐ๋จํ ์ํ ์๊ตฌ ์ฌํญ์ด ์๋ ๋ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๊ณผ์๋ ์ ์์ต๋๋ค.
- Zustand: ๊ฐ๋จํ๊ณ ์ ์ฐํ API๋ฅผ ์ ๊ณตํ๋ ๊ฐ๋ณ๊ณ ์๊ฒฌ์ด ์๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Zustand๋ ๋จ์์ฑ์ด ์ฐ์ ์์์ธ ์ค์ ๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
- Jotai: ๊ฐ๋ณ ์ํ ์กฐ๊ฐ์ ๋ง๋ค๊ณ ๊ด๋ฆฌํ ์ ์๋ ์์์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Jotai๋ ๋ง์ ์์ ๋ ๋ฆฝ์ ์ธ ์ํ ๋ณ์๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
- Context API + useReducer: React์ ๊ธฐ๋ณธ ์ ๊ณต Context API์
useReducerํ ์ ๊ฒฐํฉํ๋ฉด ๊ธฐ๋ณธ์ ์ธ ํํ์ ์ํ ๊ด๋ฆฌ๊ฐ ์ ๊ณต๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋จํ ์ํ ์๊ตฌ ์ฌํญ์ด ์๋ ๋ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ์ถฉ๋ถํ ์ ์์ง๋ง ๋ ํฌ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ฒ๊ฑฐ๋ก์์ง ์ ์์ต๋๋ค.
experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ ๋จ์์ฑ๊ณผ ๊ฐ๋ ฅํจ ์ฌ์ด์ ๊ท ํ์ ์ ์งํ๋ฉฐ ๋ง์ ํผ ๊ด๋ จ ์๋๋ฆฌ์ค์ ์ ํฉํ ๊ธฐ๋ณธ ์ ๊ณต ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค. ํผ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐํ๋๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉด์ ๋ง์ ๊ฒฝ์ฐ ์ธ๋ถ ์ข
์์ฑ์ ํ์์ฑ์ ์์ฑ๋๋ค.
์ ์ฌ์ ์ธ ๋จ์ ๋ฐ ์ ํ ์ฌํญ
experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ ์๋ง์ ์ด์ ์ ์ ๊ณตํ์ง๋ง ์ ์ฌ์ ์ธ ๋จ์ ๊ณผ ์ ํ ์ฌํญ์ ์๊ณ ์์ด์ผ ํฉ๋๋ค.
- ์คํ์ ์ํ: ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ด ๊ธฐ๋ฅ์ ์ฌ์ ํ ์คํ์ ์ ๋๋ค. ์ฆ, API์ ๋์์ด ํฅํ React ๋ฒ์ ์์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ํ์ต ๊ณก์ : ์ฝ๋๋ค์ดํฐ, ์ก์ ๋ฐ ๋ฆฌ๋์์ ๊ฐ๋ ์ ์ดํดํ๋ ค๋ฉด ์ด๋ฌํ ํจํด์ ์ต์ํ์ง ์์ ๊ฐ๋ฐ์์๊ฒ๋ ํ์ต ๊ณก์ ์ด ํ์ํ ์ ์์ต๋๋ค.
- ์ ํ๋ ์ ์ฐ์ฑ: ์ฝ๋๋ค์ดํฐ ์ ๊ทผ ๋ฐฉ์์ ํนํ ๋งค์ฐ ๋์ ์ด๊ฑฐ๋ ๋น์ ํต์ ์ธ ์ํ ๊ด๋ฆฌ ์๊ตฌ ์ฌํญ์ด ์๋ ๋ชจ๋ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค.
- ๊ณผ๋ํ ์์ง๋์ด๋ง ๊ฐ๋ฅ์ฑ: ๋งค์ฐ ๊ฐ๋จํ ํผ์ ๊ฒฝ์ฐ ์ฝ๋๋ค์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณผ์์ด๊ณ ๋ถํ์ํ ๋ณต์ก์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ฅผ ์ฑํํ๊ธฐ ์ ์ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ์๊ตฌ ์ฌํญ์ ์ ์คํ๊ฒ ํ๊ฐํ์ญ์์ค. ์ด์ ๊ณผ ์ ์ฌ์ ์ธ ๋จ์ ์ ๋น๊ตํ๊ณ ๋์ฒด ์ํ ๊ด๋ฆฌ ์๋ฃจ์
์ด ๋ ์ ํฉํ์ง ๊ณ ๋ คํ์ญ์์ค.
experimental_useFormState ์ฝ๋๋ค์ดํฐ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
experimental_useFormState ์ฝ๋๋ค์ดํฐ์ ์ด์ ์ ๊ทน๋ํํ๊ณ ์ ์ฌ์ ์ธ ํจ์ ์ ํผํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
- ๋ฆฌ๋์๋ฅผ ์์ํ๊ฒ ์ ์งํ์ญ์์ค: ๋ฆฌ๋์ ํจ์๊ฐ ์์ํ์ง ํ์ธํ์ญ์์ค. ์ฆ, ๋ถ์์ฉ์ด ์์ด์ผ ํ๋ฉฐ ๋์ผํ ์ ๋ ฅ์ ๋ํด ํญ์ ๋์ผํ ์ถ๋ ฅ์ ๋ฐํํด์ผ ํฉ๋๋ค.
- ์๋ฏธ ์๋ ์ก์ ์ ํ์ ์ฌ์ฉํ์ญ์์ค: ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๋๋ก ๋ช ํํ๊ณ ์ค๋ช ์ ์ธ ์ก์ ์ ํ์ ์ ์ํ์ญ์์ค.
- ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ์ญ์์ค: ํผ ์ ์ถ ๋๋ ์ํ ์ ๋ฐ์ดํธ ์ค์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ญ์์ค.
- ์ฑ๋ฅ์ ์ต์ ํํ์ญ์์ค: ๋ฉ๋ชจ์ด์ ์ด์ ๋ฐ ์ฝ๋ ๋ถํ ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ํผ์ ์ฑ๋ฅ์ ์ต์ ํํ์ญ์์ค.
- ์ฒ ์ ํ๊ฒ ํ ์คํธํ์ญ์์ค: ํผ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ณ ์ํ๊ฐ ์์๋๋ก ๊ด๋ฆฌ๋๋์ง ํ์ธํ๊ธฐ ์ํด ํฌ๊ด์ ์ธ ํ ์คํธ๋ฅผ ์์ฑํ์ญ์์ค.
- ์ฝ๋ ๋ฌธ์ํ: ์ฝ๋๋ค์ดํฐ, ์ก์ ๋ฐ ๋ฆฌ๋์์ ๋ชฉ์ ๊ณผ ๊ธฐ๋ฅ์ ์ค๋ช ํ๊ธฐ ์ํด ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ญ์์ค.
React์์ ํผ ์ํ ๊ด๋ฆฌ์ ๋ฏธ๋
experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ React์์ ํผ ์ํ ๊ด๋ฆฌ์ ์งํ์ ์์ด ์ค์ํ ์ง์ ์ ๋ํ๋
๋๋ค. React๊ฐ ๊ณ์ ์งํํจ์ ๋ฐ๋ผ ์ด ์์ญ์์ ๋ ๋ง์ ํ์ ๊ณผ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ง ๊ฒ์ผ๋ก ์์ํ ์ ์์ต๋๋ค.
๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ๋ฏธ๋ ๋ฐฉํฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํฅ์๋ API:
experimental_useFormState์ฝ๋๋ค์ดํฐ์ API๋ฅผ ๊ฐ์ ํ์ฌ ๋ ์ง๊ด์ ์ด๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. - ๊ธฐ๋ณธ ์ ๊ณต ์ ํจ์ฑ ๊ฒ์ฌ: ํผ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ๊ธฐ๋ณธ ์ ๊ณต ์ ํจ์ฑ ๊ฒ์ฌ ๊ธฐ๋ฅ์ ์ฝ๋๋ค์ดํฐ์ ํตํฉํฉ๋๋ค.
- ์๋ฒ ์ธก ๋ ๋๋ง ์ง์: ๋ ๋น ๋ฅธ ์ด๊ธฐ ํ์ด์ง ๋ก๋๋ฅผ ํ์ฉํ๋๋ก ์๋ฒ ์ธก ๋ ๋๋ง์ ๋ ์ ์ง์ํ๋๋ก ์ฝ๋๋ค์ดํฐ๋ฅผ ํฅ์์ํต๋๋ค.
- ๋ค๋ฅธ React ๊ธฐ๋ฅ๊ณผ์ ํตํฉ: Suspense ๋ฐ Concurrent Mode์ ๊ฐ์ ๋ค๋ฅธ React ๊ธฐ๋ฅ๊ณผ ์ฝ๋๋ค์ดํฐ๋ฅผ ์ํํ๊ฒ ํตํฉํฉ๋๋ค.
React์ ์ต์ ๊ฐ๋ฐ ์ ๋ณด๋ฅผ ํ์
ํ๊ณ experimental_useFormState ์ฝ๋๋ค์ดํฐ์ ๊ฐ์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ทน์ ์ผ๋ก ์คํํจ์ผ๋ก์จ React ๊ฐ๋ฐ์ ์ต์ ์ ์ ์์ ๋ ํจ์จ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ React ์ ํ๋ฆฌ์ผ์ด์
์์ ํผ ์ํ ๋๊ธฐํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ๊ณ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ํ ๊ด๋ฆฌ๋ฅผ ์ค์ ์ง์คํํ๊ณ , ๋น๋๊ธฐ ์
๋ฐ์ดํธ๋ฅผ ๋จ์ํํ๊ณ , ์ฝ๋ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๊ฐ์ ํจ์ผ๋ก์จ ๊ฐ๋ฐ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ๋ ๊ฐ๋ ฅํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ํผ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ฌ์ ํ ์คํ์ ์ธ ๊ธฐ๋ฅ์ด์ง๋ง ํ๋ก์ ํธ์ ์ด๋ค ์ด์ ์ด ์๋์ง ์์๋ณด๊ธฐ ์ํด ํ์ํ๊ณ ์คํํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฝ๋๋ค์ดํฐ๋ฅผ ์ฑํํ๊ธฐ ์ ์ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ์๊ตฌ ์ฌํญ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
React๊ฐ ๊ณ์ ์งํํจ์ ๋ฐ๋ผ experimental_useFormState ์ฝ๋๋ค์ดํฐ๋ ํผ ์ํ ๊ด๋ฆฌ์์ ์ ์ ๋ ์ค์ํ ์ญํ ์ ํ ๊ฒ์
๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ง์คํฐํจ์ผ๋ก์จ ๊ฒฝ์ ์ฐ์๋ฅผ ํ๋ณดํ๊ณ ์ต์ฒจ๋จ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
experimental_useFormState ์ฝ๋๋ค์ดํฐ์ ๋ํ ์ต์ ์ ๋ณด ๋ฐ ์
๋ฐ์ดํธ๋ ๊ณต์ React ์ค๋ช
์ ๋ฐ ์ปค๋ฎค๋ํฐ ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํ์ญ์์ค.