์ฌํด๋ ์์ข์ข ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ํ๋์ ํ์ด์ง ๋ด์์ ๊ด๋ฆฌ๋๋ state์ ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋๋ prop์ด ๋๋ฌด ๋ง์์ง๋ ๋ฌธ์ ๋ฅผ ๊ฒฝํํ๊ณ , ์ด๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์ ๋ด์ ๊ธ์ ๋๋ค.
์ ๋ ์ฌํด๋ ์์ข์ข ํ๋ก์ ํธ์์ ๊ณํ ์์ฑ ํ์ด์ง์ ๊ตฌํ์ ๋ด๋นํ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ํ์ด์ง์ธ๋ฐ, ํ ๋์ ๋ณด๊ธฐ์๋ ํ์ด์ง ๋ด์์ ๊ด๋ฆฌ๋๋ data๋ค์ด ๋ง์ ๋ณด์ ๋๋ค๐
๊ณํ ์์ฑ ํ์ด์ง์ ์ญํ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ด์ง level์์ ๊ณํ ์์ฑ API๋ฅผ ํธ์ถํ๊ธฐ ์ํด์๋ ๊ฒฐ๊ตญ ๋ชจ๋ data๋ค์ด ํ ๋ฒ์ request body์ ๋ด๊ฒจ์ ธ ์๋ฒ์ ์ ์ก์ด ๋์ด์ผ ํ๋ฏ๋ก, ๊ณํ ์์ฑ์ ํ์ํ ๋ชจ๋ data๋ ํ์ด์ง level์์ ์ ์ํ๊ณ , ํ์ ์ปดํฌ๋ํธ์ prop์ผ๋ก ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
์ด๋ ๊ฒ ๊ฒฐ์ ํ ํ, ํ์ด์ง ๋ด ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋๋ ๋ณด๋ ํ์ด์ง ๋ด ๊ฐ์ฅ ํ์ ์ปดํฌ๋ํธ์ ํด๋นํ๋ RemindInput
์ state๊ฐ ์ ๋ฌ๋๊ธฐ๊น์ง ์ด 4๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ prop drilling ํ์์ด ๋ฐ์ํ์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์์ ํ๋์ ์ง์ฌ๊ฐํ์ผ๋ก ํ์๋ ์ปดํฌ๋ํธ๊ฐ ์ตํ์ ์ปดํฌ๋ํธ์ธ RemindInput
์
๋๋ค.
์ฌ์ค prop์ ์ ๋ฌ์ด 4๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์น๋ ๊ฒ์ด depth๊ฐ ์์ฒญ ๊น์ ํธ์ ์๋๋ผ๊ณ ์๊ฐํ์ง๋ง, ํ์๋ก ์ ๋ฌ๋์ด์ผ ํ๋ ๋ชจ๋ data์ ๋ฉ์๋๋ค์ด CreatePage์์ ๊ด๋ฆฌ๋์๊ธฐ ๋๋ฌธ์ ๊ทธ ์๊ฐ ๋๋ฌด ๋ง์์ต๋๋ค.
export default function CreatePage() {
const router
const [title, setTitle] = useState
const [description, setDescription] = useState('');
const [tags, setTags] = useState<string[]>([]);
const [isPublic, setPublic] = useState(true);
const toggleIsPublic = () => {
setPublic(!isPublic);
};
const [remindOptions, setRemindOptions] = useState<RemindOptionType>({
TotalPeriod: 12,
Term: 1,
Date: 1,
Time: 9,
});
const [remindMessageList, setRemindMessageList] = useState<RemindItemType[]>(
[],
);
const handleChangeRemindOption = () => {};
const handleChangeRemindMessage = () => {};
const fixRemindOptions = () => {};
const makeAllRemindMessageSame = () => {};
์์ฑ ํ์ด์ง์์ ๊ด๋ฆฌ๋์ด์ผ ํ๋ state์ ์ด state๋ฅผ ๋ค๋ฃจ๋ ๋ฉ์๋๋ค์ ๋๋ต ์์ ๊ฐ์์ต๋๋ค. ์ด๋ ๊ฒ ๋ง์ state์ ๋ํ prop drilling์ ํตํด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ค์ด ๋ฐ์ํ์ต๋๋ค.
๊ทธ๋์ ์์ ๊ฐ์ ๋ฌธ์ ์ ๋ค์ ์ธ์งํ ํ, ์ข ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ด์ง ๋ด์ data๋ค์ ๊ด๋ฆฌํ ์ ์์๊น ๊ณ ๋ฏผ์ ์์ํ์ต๋๋ค.
prop์ผ๋ก ์ํ๋ฅผ ํ์์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด, Recoil๊ณผ ContextAPI์ ์ฌ์ฉ์ ๊ณ ๋ คํ๊ฒ ๋์์ต๋๋ค.
์ํ ๊ด๋ฆฌ ๋๊ตฌ์ธ Recoil๊ณผ ContextAPI ๋ชจ๋, state๋ฅผ ํ์ ์ปดํฌ๋ํธ์ prop์ผ๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ด ์๋๋ผ ์ํ๋ ์์น์์ data๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์์์ ์ธ๊ธํ ์ฝ๋์ ๊ฐ๋ ์ฑ ๋ฌธ์ ์ ๋ถํ์ํ ํ๋กํผํฐ ์ ๋ฌ ๋ฌธ์ ๋ชจ๋ ํด๊ฒฐํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค.
๋ํ, Recoil์ ์ฌ์ฉํ์ ๋์๋ ์ฌ์ ํ ๋ฐ์ํ ์ ์๋ ๋ถํ์ํ ๋ ๋๋ง ๋ฌธ์ ๋ฅผ ๋ง๊ธฐ ์ํด atom ๊ฐ์ฒด์ ๊ฐ ์์ฑ์ ๋ํ selector์ get๊ณผ set์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด ํ์๋ถ์๊ฒ ์ด๋ฅผ ์ ์ํ๊ธฐ๋ ํ์ต๋๋ค.
ํ์ง๋ง, prop์ผ๋ก data๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋ฌธ์ ์ ์ ํด๊ฒฐํด์ฃผ๋ Recoil๊ณผ ContextAPI๋ฅผ ์ฌ์ฉํ์ ๋์๋, ์๋ก์ด ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๐ก ์ปดํฌ๋ํธ์์ ์ ์ญ ์ํ๋ฅผ ๊ตฌ๋ ํ๋ ์๊ฐ, ๊ทธ ์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉ์ด ์ด๋ ค์์ง๋ค.
์์ ๊ทธ๋ฆผ์์ ๋ณด๋ฏ์ด ์ผ์ชฝ์ ๊ณํ ์์ฑ ํ์ด์ง์ ์ค๋ฅธ์ชฝ์ ๊ณํ ์์ ํ์ด์ง๋ ํ ๋์ ๋ณด๊ธฐ์๋ ๊ทธ ๊ตฌ์กฐ๊ฐ ์๋นํ ์ ์ฌํฉ๋๋ค. ๊ทธ๋์ ์ด ๋๊ฐ์ ํ์ด์ง์์๋ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ WritableRemind
์ปดํฌ๋ํธ์ WritableRemindItem
์ปดํฌ๋ํธ๊ฐ ์์ต๋๋ค.
ํ์ง๋ง ์์ฑ ํ์ด์ง์ ์์ ํ์ด์ง๋ ์๋ก ์ญํ ์ด ๋ค๋ฅธ ํ์ด์ง์ด๊ณ , ํธ์ถ๋์ด์ผ ํ๋ API๊ฐ ๋ค๋ฆ ๋๋ค. ๋ฐ๋ผ์, ํ์ํ data์ ๊ตฌ์กฐ์ ์ฑ๊ฒฉ์ด ์กฐ๊ธ์ฉ ๋ค๋ฆ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ Recoil์ ์ฌ์ฉํ๋ค๋ฉด, ๊ฐ๊ฐ ์๋ก ๋ค๋ฅธ atom์ ๊ตฌ๋ ํด์ผํ๊ณ ์ด๋ ๊ฒ ๋๋ฉด ๋ ํ์ด์ง์์ ๊ณตํต์ผ๋ก ์ฐ์ด๋ ์ปดํฌ๋ํธ๋ ๊ฐ ํ์ด์ง์์ ์ฌ์ฉ๋๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ atom์ ๊ตฌ๋ ํ๊ณ ์์ด์ผ ํ๋,,? ๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๊ทธ ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฃจ์ด์ผ ํ๋ data์ ์๋ ๋ง์์ง ๊ฒ์ด๊ณ , ์์นซํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํด์ผ ํ ์๋ ์์ต๋๋ค.
prop์ผ๋ก data๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง, ํน์ ์ปดํฌ๋ํธ๊ฐ ์ ์ญ ์ํ๋ฅผ ๊ตฌ๋ ํ๋ ์๊ฐ ๊ทธ ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ฑ์ด ์ค์ด๋๋ ๋ฌธ์ ๊ฐ ์์๋์๊ณ , ์ด๋ ์ ์ ํ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์ ๋์ ํ์ง ์์์ต๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค๋ ์๊ฐํด๋ณด์์ต๋๋ค.
๊ตฌํ ์ค์ด์๋ ๊ณํ ์์ฑ ํ์ด์ง๋ ์ฌ์ค์ ์ฌ์ฉ์๋ก๋ถํฐ data๋ฅผ ์ ๋ ฅ๋ฐ์, ์ด๋ฅผ ์กฐํฉํด ์๋ฒ๋ก ์ ์กํ๋ ํผ์ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ React-hook-form์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ข ๋ ์ฝ๊ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ง ์์๊น๋ผ๋ ์๊ฐ๋ ๋ค์์ต๋๋ค.
๋ํ, ํ๋์ ํ์ด์ง ์์ ์ ์ด๋ถํฐ ๋๋ฌด ๋ง์ data์ ๋ก์ง์ด ๋ด๊ธฐ๋๋ก ์ค๊ณํ ๊ฒ์ ์๋๊ฐ ํ๋ ์๊ฐ๋ ๋ค์ด์ ํ์ด์ง๋ฅผ ๋ถ๋ฆฌํด ๊ณํ ์์ฑ ๋จ๊ณ๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐฉํฅ๋ ์๊ฐํด๋ณด์์ต๋๋ค.
ํ์ง๋ง ๊ฒฐ๋ก ์ ์ผ๋ก๋, ๋ ๋ฐฉ์ ๋ชจ๋ ๋์ ํ์ง ์์์ต๋๋ค.
๊ทธ ์ด์ ๋, ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ "์๊ฐ" ์ด๋ผ๋ ์ถ๊ฐ์ ๋น์ฉ์ด ์๋์ ์ผ๋ก ๋ง์ด ๋ฐ์ํ๋ ๋ฐฉ๋ฒ์ด์๊ณ ํ๋ก์ ํธ ์์ฑ์ด๋ผ๋ ๋ชฉํ๋ฅผ ์๊ฐํ์ ๋, ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ๊ธฐ์ ์ ์ผ๋ก๋ ๋ ๋ฐ์ด๋ ์ ํ์ด์์ ์๋ ์์ง๋ง ๋น์ ์ ๋ ๋ง๊ฐ ๊ธฐ๊ฐ์ด ์ ํด์ ธ ์๋ ํ๋ก์ ํธ๋ฅผ ํ์๋ค๊ณผ ํจ๊ป ์งํ ์ค์ด์๊ณ , ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ต์ฐ์ ๋ชฉํ๋ ๊ธฐ์ ์ ์ผ๋ก ๋ฐ์ด๋ ๊ตฌํ์ด ์๋๋ผ, ๋ง๊ฐ ๊ธฐ๊ฐ ๋ด์ ํ๋ก์ ํธ ์์ฑ์ด์์ต๋๋ค.
๊ทธ๋์ ๊ฒฐ๊ตญ ์ ๋ ๊ธฐ์กด์ฒ๋ผ prop์ผ๋ก data๋ฅผ ํ์๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก state๋ฅผ ๊ด๋ฆฌํ๋, ๋ถํ์ํ ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋๋ก ๋ฆฌ์กํธ ํ ์ต์ ํ๋ฅผ ์งํํ๊ณ ํ๋ก์ ํธ ์์ฑ ์ดํ ํ์ด์ง๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋ฆฌ์กํธ ํ ์ ์ต์ ํํ๋ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const filteredTermOptions = useMemo(() => {
return TERM_OPTIONS.filter(
(option) => option.value <= remindOptions.TotalPeriod,
);
}, [remindOptions.TotalPeriod]);
const isRemindMessageEmpty = useMemo(() => {
return remindMessage.length === 0;
}, [remindMessage]);
๋ค์๊ณผ ๊ฐ์ด ๋ ๋๋ง ์๋ง๋ค ์ฌ์ ์ธ ๋ ํ์๊ฐ ์๋ ๋ณ์๋ ํน์ data๊ฐ ๋ณํ ๋๋ง ์ฌ์ ์ธ ๋ ์ ์๋๋ก ํด์ฃผ์์ต๋๋ค.
export default React.memo(function WritableRemindItem({
remindMonth,
remindDay,
remindMessage,
handleChangeRemindMessage,
makeAllRemindMessageSame,
classNameList = [],
}: WritableRemindItemProps) {
// ์ดํ ์๋ต
์์ฑ ํ์ด์ง์์๋ prop์ผ๋ก data๊ฐ ์ ๋ฌ๋๋ depth๊ฐ ์ต๋ 4๋ฒ๊น์ง ์์๊ธฐ์, ์์ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง ๋ ์ ์๋ ์ํฉ์ด ์์์ต๋๋ค.
๊ทธ๋์ ์์ฑ ํ์ด์ง ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ด ๋ฆฌ๋ ๋๋ง ๋ ๋, ํ์ ์ปดํฌ๋ํธ์ ์ํ๋ prop์ด ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด ํ์ ์ปดํฌ๋ํธ๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋์ง ์๋๋ก React.memo()
๋ฅผ ์ฌ์ฉํด์ฃผ์์ต๋๋ค.
const handleChangeRemindOption = useCallback(
(optionKey: string, newOptionValue: number) => {
setRemindOptions
...remindOptions,
[optionKey]: newOptionValue,
});
},
[remindOptions, setRemindOptions],
);
๋ฆฌ์กํธ์์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋, ์ปดํฌ๋ํธ ๋ด ์ ์๋ ํจ์๋ ์ฌ์ ์๋๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ์ด ํจ์๊ฐ ์์ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌ๋๋ค๋ฉด ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋๋ prop์ด ๋ณํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง ๋ ๊ฒ์ ๋๋ค.
์์ handleChangeRemindOption
๋ฉ์๋๋ ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋๋ ํจ์์๊ธฐ์, ๋ ๋๋ง ๋ ๋๋ง๋ค ํ์ ์ปดํฌ๋ํธ๊ฐ ๊ณ์ ๋ฆฌ๋ ๋๋ง ๋ ๊ฒ์
๋๋ค.
๊ทธ๋์ useCallback
์ ์ฌ์ฉํด ์ฐ๊ด๋ data๊ฐ ๋ณํ์ง ์๋๋ค๋ฉด ํจ์๋ฅผ ์ฌ์ ์ํ์ง ์๋๋ก ํด์ฃผ์ด ํ์ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ์ต๋๋ค.
์์ ๊ธ์ ์ ๋ฆฌํด๋ณด์๋ฉด, ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ผ๋ก๋ ๊ฐ๋ฐ์ ํ๋ฉฐ ํฌ๊ณ ์์ ๋ค์ํ ๋ฌธ์ ๋ค์ ๋ง๋ ํ ๋ฐ, ๊ทธ ๋๋ง๋ค ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ๋ค์ ์ฅ์ ๊ณผ ๋น์ฉ์ ๊ณ์ฐํด๋ณด๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก ๊ทผ๊ฑฐ ์๊ณ ํฉ๋ฆฌ์ ์ธ ์ ํ์ ํ๋ ๊ฐ๋ฐ์๊ฐ ๋๋ ค๊ณ ํฉ๋๋ค!