๊ฐ์
๋ฏธ์ | ๊ธฐ๊ฐ | Repository | PR & Review | github page | storybook |
---|---|---|---|---|---|
ํ์ด๋จผ์ธ ๋ฏธ์ 1๋จ๊ณ | 23-04-24 - 23-05-01 | Repo | PR & Review | ๐ณ ํ์ด๋จผ์ธ | ๐์คํ ๋ฆฌ๋ถ |
๋ฏธ์ ํ๊ณ
ํ์ด๋จผ์ธ 2๋จ๊ณ ๋ฏธ์ ์ ํ์ ์๊ตฌ์ฌํญ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ์ฃผ์ ์ปดํฌ๋ํธ์ ๋ํ Storybook ์ํธ ์์ฉ ํ ์คํธ
2. Controlled & Uncontrolled Components์ ์ ๊ฐํ์ฌ Form ํธ๋ค๋ง
3. Context API๋ฅผ ํ์ฉํ์ฌ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ฐ ๊ณ์ธต ์ฌ๊ตฌ์ฑ
์ด์ค ๊ฐ์ฅ ๋ถ์กฑํ๋ ๋ถ๋ถ์ Storybook ์ํธ ์์ฉ ํ ์คํธ์ด๋ค. ํ์ฌ ์คํ ๋ฆฌ๋ถ์ ๋ณด๋ฉด ์ปดํฌ๋ํธ๊ฐ ๊ฐ๋ณ์ ์ผ๋ก๋ง ํ ์คํธํ๊ณ ์๋ค. ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ฌถ์ด ์ํธ ์์ฉ ํ ์คํธ๋ ๋ฏธํกํ๋ค๊ณ ํ ์ ์๋ค. ๋ถ์กฑํ ๊ฒ์ ์์์ผ๋ ๋ณด์ํ๊ธฐ ์ํด ๋ฐ๋ก ์๊ฐ์ ๋ด์ด ํฌ์ํด์ผ ํ๋ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋ฏธ๋ฃจ์ง ๋ง๊ณ ๊ผญ ํ์.
2๋จ๊ณ ๋ฏธ์ ์์ ๊ฐ์ฅ ํฐ ์ค์ ์ ๋๊ณ ์๋ ๋ถ๋ถ์ Custom Hook๊ณผ Context API์ด๋ค. ์ถ๊ฐ์ ์ผ๋ก ๋ฆฌ์กํธ ํ ์ผ๋ก ์ต์ ํ๋ ์๋ํด ๋ณด์์ง๋ง ๋์ ๋๋ ์ต์ ํ๊ฐ ์ด๋ฃจ์ด์ง์ง ์์๋ค. ์ด ๋ถ๋ถ์ ์์ผ๋ก ๋ ๋ฒจ 3, ๋ ๋ฒจ 4์์ ๊พธ์คํ ๊ฐ์ ธ๊ฐ์ผ ํ ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ๊ฐ ๋ ๊ฒ์ด๋ค.
๐๏ธ Context API
๋๋ ํ์ Context API๋ '์ ์ญ์ ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ํ์ํ ๊ฒ'์ผ๋ก ์๊ฐํ๊ณ ์๋ค. ํ์ง๋ง ์ด๋ฒ 2๋จ๊ณ ๋ฏธ์ ์ ์งํํ๊ณ ๊ณตํต ํผ๋๋ฐฑ์ ๋ฐ์ผ๋ฉด์ Context API์ ๋ํ ์๊ฐ์ด ๋ฐ๋๊ฒ ๋์๋ค.
์ฐ์ , ๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์์์ Context API์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ๊ณ ์๋ค.
context์ ์ฃผ๋ ์ฉ๋๋ ๋ค์ํ ๋ ๋ฒจ์ ๋ค์คํ ๋ ๋ง์ ์ปดํฌ๋ํธ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. context๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ฏ๋ก ๊ผญ ํ์ํ ๋๋ง ์ฐ์ธ์. ์ฌ๋ฌ ๋ ๋ฒจ์ ๊ฑธ์ณ props ๋๊ธฐ๋ ๊ฑธ ๋์ฒดํ๋ ๋ฐ์ context๋ณด๋ค ์ปดํฌ๋ํธ ํฉ์ฑ์ด ๋ ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ผ ์๋ ์์ต๋๋ค.
๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์์์ ์ ์ญ์ด๋ผ๋ ๋จ์ด๋ ์ฐพ์๋ณผ ์ ์๋ค. ์ฆ, ์ ์ญ์ด ์ค์ํ ๊ฒ์ด ์๋๋ค. ์ค์ํ ๊ฒ์ ๋ฐ์ดํฐ ์ ๋ฌ์ด๋ค. ์ด๋ฅผ ์ ๋ฆฌํ๋ฉด Context API๋ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ ์ ์๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ
๊ทธ๋ฆฌ๊ณ ์ ์ญ์ผ๋ก ์ฌ์ฉํ์ง ์์๋ ๋๋ค. Context API๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ญ์์๋ง ์ฌ์ฉํด์ผ ํ๋ค๋ ์๊ฐ์ ๋ฒ๋ฆฌ๊ณ ์ปดํฌ๋ํธ ๋ฌถ์์์ ํ ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค๊ณ ์๊ฐ์ ํ๋๋ก ํ์.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ 2๋จ๊ณ ๋ฏธ์ ์์๋ ์ด๋ค Context API๋ฅผ ์ฌ์ฉํ๋๋? ๋ ๊ฐ์ง๋ฅผ Context API๋ก ํ์ฉํ์๋ค. ๋ชจ๋ฌ์ ์ํ Context API์ ์นด๋ ๋ฑ๋ก์ ์ํ Context API๊ฐ ๊ทธ๊ฒ์ด๋ค.
1๏ธโฃ ๋ชจ๋ฌ์ ์ํ Context API
๋ชจ๋ฌ์ ํ๋์ ์ฑ์ ํ๋๋ง ์๋ค๋ ์ ์ ํ์ Context API๋ก ๋ง๋ค์๋ค. 3๋จ๊ณ๊ฐ ๋๋ ํ์ฌ ์์ ์์ ๋ง์ ์ค๋ฅ๊ฐ ์๋ ์ฝ๋์ด์ง๋ง ์ด๋ป๊ฒ Context API๋ฅผ ์ฌ์ฉํ๋์ง ์๊ฐํ๋ ค ํ๋ค.
๋จผ์ Provider๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ๋ค์์ ModalProvider์ด๊ณ ์ด๋ ์ต์๋จ ์ปดํฌ๋ํธ์ธ src/index.tsx์์ ์ฌ์ฉ๋๊ณ ์๋ค. ์ต์๋จ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ชจ๋ฌ์ด ํน์ ์ปดํฌ๋ํธ ๋ฌถ์์์๋ง ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ ์ฑ ์ ์ฒด์์ ์ฌ์ฉ๋๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
// ModalProvider
function ModalProvider({ children }: PropsWithChildren) {
const [isModalOpen, setIsModalOpen] = useState(false);
const [animation, setAnimation] = useState<AnimationTypes>(ANIMATION.appear);
const [delayMsTime, setDelayMsTime] = useState(0);
const openModal = () => setIsModalOpen(true);
const closeModal = () => setIsModalOpen(false);
const changeAnimationMode = (mode: AnimationTypes) => {
setAnimation(mode);
};
const changeDelayMsTime = (time: number) => setDelayMsTime(time);
const initValue = {
// ...
};
return <ModalContext.Provider value={initValue}>{children}</ModalContext.Provider>;
}
export default ModalProvider;
// src/index.tsx
import React from 'react';
import { createRoot } from 'react-dom/client';
import { RouterProvider } from 'react-router-dom';
import router from 'router';
import ModalProvider from '@Contexts/Modal/ModalProvider';
const root = createRoot(document.getElementById('root') as HTMLElement);
root.render(
<React.StrictMode>
<ModalProvider>
<RouterProvider router={router} />
</ModalProvider>
</React.StrictMode>,
);
ModalProvider๋ฅผ ๋ฑ๋กํ์ผ๋ ๊ทธ ๋ค์ useContext๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ฌ์ ์ด๊ณ , ๋ซ์์ผ ํ๋ค. ์ง์ ์ปดํฌ๋ํธ์์ useContext๋ฅผ ์ฌ์ฉํด๋ ๋๊ฒ ์ง๋ง useAnimationModal ํ ์ ๋ง๋ค์ด ์ฌ์ฉํ์๋ค. useAnimationModal์ ๋ค์๊ณผ ๊ฐ๋ค.
const useAnimationModal = () => {
const { isModalOpen, animation, delayMsTime, openModal, closeModal, changeAnimationMode, changeDelayMsTime } =
useContext(ModalContext);
const closeModalWithTime = () => {
changeAnimationMode(ANIMATION.disappear);
setTimeout(() => {
closeModal();
changeAnimationMode(ANIMATION.appear);
}, delayMsTime);
};
return { isModalOpen, animation, delayMsTime, openModal, closeModal: closeModalWithTime, changeDelayMsTime };
};
export default useAnimationModal;
์ด๋ ๊ฒ ๋ง๋ useAnimationModal ํ ์ ํ์ํ ๊ณณ์ ์ฌ์ฉํ๋ค. isModalOpen์ ์ด๋ค ์ปดํฌ๋ํธ์์๋ ๊ฐ์ ๊ฐ์ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ ์ฑ์์ ๋จ ํ๋์ ๋ชจ๋ฌ์ ๋ณด์ฅํ ์ ์๋ค.๋ผ๊ณ ๊ทธ๋ ์๊ฐํ๋ค. ๋ ๋๋ง์ด ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ ํน์ ๊ฐ์ ์ปดํฌ๋ํธ ๋ด์์ isModalOpen ๊ฐ์ ๋น๊ตํ์ฌ ๋ ๋ค๋ฅธ ๋ชจ๋ฌ์ ์คํํ๋ค๊ณ ํ์ ๋, 2๊ฐ, 3๊ฐ... ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋ฌ์ด ์ด๋ฆด ์ ์๋ค. ์ด๋ฌํ ์ค๋ฅ๋ 3๋จ๊ณ์์ ํด๊ฒฐํ์๋ค.
2๏ธโฃ ์นด๋ ๋ฑ๋ก์ ์ํ Context API
1๋จ๊ณ์์๋ /register ํ์ด์ง์์๋ง ์นด๋ ๋ฑ๋ก์ ํ์ํ ์ํ๋ฅผ ๊ด๋ฆฌํ์๋ค. ํ์ง๋ง 2๋จ๊ณ ๋ฏธ์ ์์๋ ์นด๋ ๋ณ์นญ๋ ์ถ๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ /register/alias์ด๋ผ๋ ํ์ด์ง๋ฅผ ๋ง๋ค์๋ค. ์ด๋ฐ ์ด์ ๋ก ์ธํด /register ํ์ด์ง์์ ์นด๋ ๋ฒํธ, ์ด๋ฆ, cvc๋ฒํธ, ๋น๋ฐ๋ฒํธ, ์นด๋์ฌ์ ๊ฐ์ ์ ๋ณด๋ฅผ /register/alias ํ์ด์ง์ ๋๊ธด ํ ๋ณ์นญ์ ์ถ๊ฐํ ๋ค ์นด๋๋ฅผ ๋ฑ๋กํด์ผ ํ๋ค. ์ฆ, ์ํ์ ์ด๋์ด ํ์ํ๋ค.
์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง, ๋น์์ ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅด๋ ๊ฒ์ Context API์๋ค. ๋จ ์นด๋ ๋ฑ๋ก์ ํ์ํ ์ํ๋ ๋ค๋ฅธ ํ์ด์ง์์๋ ํ์ ์๋ ์ํ์ด๋ค. ๋๋ฌธ์ Provider๋ฅผ /register, /register/alias ํ์ด์ง์๋ง ๊ฐ์ธ๋ฉด ๋๋ค.
์ฆ, ๋ค์๊ณผ ๊ฐ์ด CreditCardRegisterProvider๋ฅผ ๊ฐ์๋ค.
// src/router.tsx
import App from 'App';
import { createBrowserRouter } from 'react-router-dom';
import CreditCardAlias from '@Pages/CreditCardAlias';
import CreditCardRegister from '@Pages/CreditCardRegister';
import Home from '@Pages/Home';
import CreditCardRegisterProvider from '@Contexts/CreditCardRegister/CreditCardRegisterProvider';
const router = createBrowserRouter(
[
{
path: '/',
element: <App />,
children: [
{
path: '',
element: <Home />,
},
{
path: 'register',
children: [
{
path: '',
element: (
<CreditCardRegisterProvider> // ํด๋น ๋ถ๋ถ๊ณผ
<CreditCardRegister />
</CreditCardRegisterProvider>
),
},
{
path: 'alias',
element: (
<CreditCardRegisterProvider> // ํด๋น ๋ถ๋ถ
<CreditCardAlias />
</CreditCardRegisterProvider>
),
},
],
},
],
},
],
{
basename: '/react-payments',
},
);
export default router;
์ดํ, useContext๋ฅผ ์ฌ์ฉํ์ฌ ์นด๋ ๋ฑ๋ก์ ํ์ํ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๋ง์ง๋ง ์นด๋ ๋ฑ๋ก์ ํ๊ธฐ ์ํด ํ์ํ ์ํ๋ฅผ ๊บผ๋๋ค.
๐ Custom Hook
ํ์ด๋จผ์ธ ๋ฏธ์ ์์์ ์ฃผ๋ ๊ด์ฌ์ฌ ์ค ํ๋๊ฐ ๋ฐ๋ก Custom Hook์ด๋ค. ๋ค์, ์ ์ฌ ๋ญ ๋จน์ง ๋ฏธ์ ์ ์งํํ ๋ ๋ณด๋ค ๊ธฐ์ค์ ์ก์๊ฐ๋ ๋๋์ด ์ข๋ค.
๊ธฐ์กด Custom Hook์ ๋ถ๋ฆฌํ๋ ๊ธฐ์ค์ผ๋ก๋ ๋จ์ํ '๋ฒ์ฉ์ฑ', '์ฌ์ฌ์ฉ์ฑ'์ผ๋ก๋ง ์๊ฐํ๋ค. ํ์ง๋ง ๊ณตํต ํผ๋๋ฐฑ๊ณผ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํตํด ๋ค์ ์ก์ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๊ฐ๋ ์ฑ ํฅ์
2. ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
3. ํ ์คํธ์ ์ฉ์ด์ฑ
4. ์ฌ์ฌ์ฉ์ฑ
์ด๋ฌํ ๊ธฐ์ค์ผ๋ก Custom Hook์ ๋ถ๋ฆฌํ๋ค๋ฉด ์ฝ๋์ ์์ฐ์ฑ์ด ๋์์ง ์ ์๋ค.
1๏ธโฃ ๊ฐ๋ ์ฑ ํฅ์์ ์ํ Custom Hook ๋ถ๋ฆฌ
์ ์ธํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ด ๋ ์ค๋ฅธ๋ค. ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ด์ ์ ๋ฐ๋ก ์ ๋ฆฌ๋ฅผ ํด๋์๋ค. ๋ช ๋ นํ ํ๋ก๊ทธ๋จ๊ณผ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ์ ๋ฆฌ๋ฅผ ํ๋ฉด์๋ ์ธ์ ? ์ด๋ป๊ฒ? ์ฌ์ฉํ๋์ง ๊ฐ์ด ์ ์กํ์ง ์์์ง๋ง ๊ฐ๋ ์ฑ ์ธก๋ฉด์์์ Custom Hook์ ์๊ฐํ๋ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ด ์ด๋ค ๊ฒ์ธ์ง์ ๋ํด ๋๋์ด ์จ๋ค.
์ ์ธํ ํ๋ก๊ทธ๋ญ๋ฐ์ ๊ฐ๋จํ ๋งํ๋ฉด ์ด๋ป๊ฒ ๋ณด๋ค ๋ฌด์์ด๋ผ๋ ๊ฒ์ ์ด์ ์ ๋ ํ๋ก๊ทธ๋๋ฐ์ด๋ค. ์ฆ, ์ฌ์ฉํ๋ ์ ์ฅ์์๋ ์ด๋ป๊ฒ ์ฝ๋๊ฐ ๋์๊ฐ๋์ง๋ ๊ด์ฌ์ด ์๋ค. ๋ค๋ง ๊ฐ์ ธ๊ฐ๋ค ์๋ง ์ฌ์ฉํ๋ฉด ์ฅ๋ก์ด๋ค. ์ ์ ํ ๊ณณ์ ๋ฌด์์ ๊ฐ์ ธ๋ค๊ฐ ์ฌ์ฉํ ์ง๋ง ์ ์ ํ๋ฉด ๋๋ค. ์ด๋ฌํ ์ ์ด Custom Hook๊ณผ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ ๋๊ผ๋ค.
์๋ฅผ ๋ค์ด, useMyPet์ด๋ผ๋ ํ ์ด ์๋ค. ์ด ํ ์ pet, addPet, removePet์ด๋ผ๋ ๊ฐ๊ณผ ํจ์๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ pet์ด๋ผ๋ ๊ฐ์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ก๋์ง ๋ฐ์ง์ง ์๊ณ ํ์ํ ๊ณณ์ ๋ ๋๋ง์ ํ๋ฉด ๋๋ค.(๊ทธ๋๋ string์ธ์ง object์ธ์ง array์ธ์ง๋ ์์์ผ๊ฒ ์ง...) ๋ํ addPet, removePet์ด๋ผ๋ ํจ์์ ๋ด๋ถ ๋์์ ๊ด์ฌ ์๋ค. ๋จ์ง ํ์ํ ๊ณณ์ ํธ์ถํ์ฌ ์ฌ์ฉํ๋ฉด ๋ ๋ฟ์ด๋ค.
๋ค์ ์ ๋ฆฌํ์๋ฉด Custom Hook์ ๋ค์ด๋ฐ ๊ท์น์ธ use ์ ๋์ฌ๋ "๋ฌด์์ ์ฌ์ฉํ๋ค."๋ผ๊ณ ์๊ฐํ๋ฉด ์ด๋ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ด๋ จ์ด ์๋ค. ๋ํ ์ปดํฌ๋ํธ ๋ด๋ถ์์ addPet, removePet๊ณผ ๊ฐ์ ํจ์์ ๋ด๋ถ ๋์์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ๋ถ๋ฌ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์์ด ์ค์ด๋ ๋ค. ์ฐ๋ฆฌ๋ ํ ์์ ๋ถ๋ฌ์จ ํจ์์ ์ด๋ฆ์์ ์ด๋ค ์ญํ ์ ํ๋์ง ์ง์๋ง ํ ๋ฟ์ด๋ค.
2๏ธโฃ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ฅผ ์ํ Custom Hook ๋ถ๋ฆฌ
๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ๊ด์ฌ์ฌ๋ ๋ฌด์์ผ๊น? ์ด๋ฒ ๋ฏธ์ ์ ์์ํ๊ธฐ ์ ์๋ ์ ํ ์๊ฐํ์ง๋ ๋ชปํ๋ ์ ์ด๋ค. ๊ทธ๋์ Custom Hook ๋ถ๋ฆฌ๊ฐ ์ด๋ ต๊ฒ ๋๊ปด์ก๋ ๊ฒ ๊ฐ๋ค.
๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ๊ด์ฌ์ฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. UI
2. ์ด๋ฒคํธ
์ด ์ธ์ ๊ด์ฌ์ฌ์ ๋ํ ๊ฒ๋ค์ Custom Hook์ผ๋ก ๋ถ๋ฆฌํ์. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์์ ๊ฒ์ด๋ค.
- input์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ณ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๋ก์ง
- ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ ๋ฌ(์ ์ฅ)ํ๋ ๋ก์ง
๋ ๋ฒจ1์์๋ ํจ์ ๋ถ๋ฆฌ์ ๋ํด ๋ง์ ๊ณ ๋ฏผ์ ํ์๋ค. ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๊ฐ ์ด์ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ค. ํจ์๋ฅผ ๋ถ๋ฆฌํ๋ ๋ชฉ์ ์ ํจ์๊ฐ ๋จ ํ๊ฐ์ง์ ์ญํ ์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์ ์๋ค. ์ฌ๊ธฐ์ ์ถ๊ฐ์ ์ผ๋ก ํจ์์ ๋ค์ด๋ฐ๊ณผ ํจ์๊ฐ ํ๋ ์ญํ ์ ๋์ผํ๊ฒ ํ๋ ๊ฒ๋ ์๋ค.
UI์ ๋ํด์ ๋จผ์ ์๊ฐํ์๋ฉด ์ปดํฌ๋ํธ์ ๊ฐ์ฅ ํฐ ์ญํ ์ด๋ผ๊ณ ํ ์ ์๋ค. return ์ดํ์ ๋์ค๋ JSX์ด ๊ทธ๊ฒ์ด๋ค. ์ด๊ฑธ Custom Hook์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋ญ๊ฐ ์ด์ํ๋ค. ์ด๋ฒคํธ์ ๋ํด์๋ JSX์์ onClick, onSubmit ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ฉด ๊ทธ๊ฒ์ ๋ฐ๋ ๊ฒ๊น์ง๋ง ํ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ๊ด์ฌ์ฌ(์ญํ )์ด๋ค.
์ด๋ฅผ ์ ์ธํ ๊ด์ฌ์ฌ(์ญํ )์ ํจ์๋ฅผ ๋ถ๋ฆฌํ ๊ฒ์ฒ๋ผ Custom Hook์ผ๋ก ๋ถ๋ฆฌํ ์ ์๋๋ก ๊ณ ๋ฏผํด ๋ณด์.
๋ํ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ๊ฐ๊น์ด ๊ด๊ณ์ธ์ง๋ ํจ๊ป ์๊ฐํด ๋ณด์.
3๏ธโฃ ํ ์คํธ์ ์ฉ์ด์ฑ์ ์ํ Custom Hook ๋ถ๋ฆฌ
์ธ ๋ฒ์งธ ๊ธฐ์ค์ ํ ์คํธ์ ์ฉ์ด์ฑ์ด๋ค. ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ๋ด์ ์๋ ๋ก์ง์ ๋ํด์ ํ ์คํธํ๋ ๊ฒ์ ์ด๋ ค์ธ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด๋ฅผ Custom Hook์ผ๋ก ๋ถ๋ฆฌํ๋ค๋ฉด ๋ถ๋ฆฌํ ๋ ๋ฆฝ์ ์ธ ๋ก์ง์ ๋ํด ํ ์คํธ๋ฅผ ์งํํ๊ธฐ ์ฌ์์ง๊ณ ์ด๋ก์จ ๊ฒ์ฆ๋ ๊ฐ๋ฅํ๋ค.
ํ ์คํธ๊ฐ ์ฌ์์ง๋ค๋ ๊ฒ์ ์ฝ๋์ ๊ด๋ฆฌ๊ฐ ํธํด์ง๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ์ฝ๋์ ์์ฐ์ฑ๋ ํฅ์๋ ์ ์๋ค.
4๏ธโฃ ์ฌ์ฌ์ฉ์ฑ์ ์ํ Custom Hook ๋ถ๋ฆฌ
์์ฃผ ์ฌ์ฉ๋๋ ํจ์๋ฅผ ์ ํธ ํจ์๋ก ์ ํด์ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฌ์ฉํ๋์ง๋ฅผ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฌ์ธ ๊ฒ์ด๋ค. ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์ ๋๊ฐ์ ๋ก์ง์ด ๋ฐ๋ณต๋๋ ๊ฒ์ ๋ถ๋ฆฌํ๊ณ ์์ง ์๋ค๋ฉด ๋ฐ๋ก ๋ถ๋ฆฌํด ๋ณด์.
๋ถ๋ฆฌํ Custom Hook์ด ์ผ๋ง๋ ์ฌ์ฌ์ฉํ ์ง๋ ๋น์ฅ์ ๋ชจ๋ฅผ ์ ์๋ค. ๊ทธ๋๋ ์ผ๋จ ์์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌ๋ฅผ ํด๋๊ณ ๊ฐ๋ฐ์ ํ๋ ๊ณผ์ ์์ ๊ฐ์ ๋ก์ง์ด ์ฌ์ฉ์ด ๋๋ค๋ฉด ์ฌ์ฌ์ฉํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก ํ์. ๋ง์ฝ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ด ํ ์ด๋ผ๋ฉด ๋ฆฌํฉํฐ๋ง์ ํตํด Custom Hook์ด ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํด๋ณด์. ๋ค์, ์ ์ฌ ๋ญ ๋จน์ง์ useListFiltering์ฒ๋ผ...(๋ค์, ์ ์ฌ ๋ญ ๋จน์ง์ useListFiltering)
๐งน ์ต์ ํ์ ๋ํ ๊ณ ๋ฏผ
useMemo, useCallback ํ ์ ์ฌ์ฉํ์ฌ ์ต์ ํ๋ฅผ ์๋ํด ๋ดค์ง๋ง ๋์ ๋๋ ์ฑ๊ณผ๊ฐ ์์ด ๊ฒฐ๊ตญ์ ์ ์ฉํ์ง ์์๋ค. ๋ค๋ฅธ ํฌ๋ฃจ๋ค์ ์ ๊ทน ์ฌ์ฉํ์ฌ ์ต์ ํ๋ฅผ ํ์๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ๋ค์ ๋, ๋ด๊ฐ ์๋ชป ์ฌ์ฉํ๋ ๊ฒ์ธ๊ฐ? ๋ด๊ฐ ๋์น ๊ฒ์ด ์๋ ๊ฒ์ธ๊ฐ?๋ผ๋ ์ด์กฐํจ์ด ์ฐพ์์จ๋ค.
์ด๋ฐ ์ด์ผ๊ธฐ๋ฅผ ๋ฆฌ๋ทฐ์ด์๊ฒ ์ด์ผ๊ธฐํ๋ค. ์ดํ, ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํตํด ๋ด๊ฐ ๋์ณค๋ ๊ฒ์ ์ ์ ์์๋ค. ๋ด๊ฐ ์ง๊ธ๊น์ง ๊ณ์ ๋น๊ตํ๋ ๊ฒ์ useMemo๋ก ๋ฌถ์ ์ํ๊ฐ ๋ณํ ๋๋ง ์ด๋ป๊ฒ ์ฌ๋๋๋ง์ด ๋๋์ง๋ง ํ์ธํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง, ๋ถ๋ชจ์ ์ํ๊ฐ ๋ณํ ๋๋ ์๊ฐ์ ํ์ง ์์๋ค. ์ ์ 2๋จ๊ณ ๋ฏธ์ ์ ์ฝ๋์์ ์ด๋ฅผ ํ์ธํด ๋ดค์ง๋ง,,, ๊ฒฐ๋ก ์ ๋๊ฐ๋ค ๐๐๐๐๐๐๐๐๐๐๐๐๐ ๋๋ค์ ๋๋ ๋ง์ ๋น ์ง๋ค. ๋ด๊ฐ ๋์น ๊ฒ ์๋? ๋ด๊ฐ ์๋ชป ํ ์คํธํ๊ณ ์๋ ๊ฒ์ธ๊ฐ?
๋ง์ง๋ง ๋ฏธ์ ์์๋ ์ฃผ๋ณ ํฌ๋ฃจ๋ค์ ๋์์ ๋ฐ์์๋ผ๋ ์ต์ ํ์ ๋ํ ๊ฐ์ ์ก์ ์ ์๋๋ก ํด๋ณด์. ์์ผ๋ก ์ฐํ ์ฝ ๊ธฐ๊ฐ ๋ด์์ ๋ง์ ๋ฏธ์ ๊ณผ ํ๋ก์ ํธ๋ฅผ ํตํด ์ต์ ํ๋ฅผ ๋ง์ด ๋ค๋ฃฐ ๊ฒ์ด๋ผ ์๊ฐํ๋ค. ๊ทธ๋ฌ๊ธฐ ๋๋ฌธ์ ํ์ฌ๋ ๋ต๋ตํ๊ณ ๋ง์กฑ์ค๋ฝ์ง ์๋๋ผ๋ ๊ธ๊ธํ๊ฒ๋ง ์๊ฐํ๊ณ ํ๋ํ์ง ๋ง์. ์์ผ๋ก๋ ๊ฒ์ผ๋ก๋ .
Custom Hook, Context API๋ ์ฒ์์ ์ ๋ชฐ๋๋๋ฐ, ์ง๊ธ์ ์ฒ์๋ณด๋จ ์ข์์ก๋ ๊ฒ์ฒ๋ผ ์ต์ ํ๋ ๊ฐ๊น์ด ๋ฏธ๋์ ์ง๊ธ์ ๋๋ณด๋จ ๋์ฑ ์ ๋ค๋ฃฐ ๊ฒ์ด๋ผ ๋ฏฟ๋๋ค.
๐ฉ๐ฉ๐ง๐ฆ ์ฌ์ฉ์๊ฐ ๋จผ์ ๋ค
๊ฒฐ๊ตญ ๊ฐ๋ฐ์ ํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น? ๊น๋ํ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ด๋ ๋๊ตฌ์๊ฒ ๋ณด์ฌ์ค๋ ์นญ์ฐฌ์ ๋ฃ๋ ๊ฒ์ผ๊น? ๋ฌผ๋ก ์ด๋ฌํ ๊ฒ๋ ์ค์ํ๋ค. ์ฌ์ค ์ค์ํ ๊ฒ์ ๋์ด์ ๋งค์ฐ ๊ธฐ์ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด๋ณด๋ค ์กฐ๊ธ ๋ ์ค์ํ ๊ฒ์ ๋ด๊ฐ ๊ฐ๋ฐํ ๊ธฐ๋ฅ์ด ์ฌ์ฉ์์๊ฒ ์ข์ ๊ฒฝํ์ ์ฃผ๋ ๊ฒ์ด๋ค. ์ด๋ค ์น์ฌ์ดํธ๋ฅผ ์ด์ฉํ๋ค๊ฑฐ๋ ์ดํ์ ์ด์ฉํ๋ฉด์ ๋ถํธํ๋ ๊ฒฝํ์ด ๋๊ตฐ๊ฐ์๊ฒ๋ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ๋๋ค๋ฉด ๊พธ์คํ ์ด์ฉํ์ง ์๊ณ ์๊ฐ์ด ์ง๋๋ฉด ์ง๋ ์๋ก ๋จธ๋ฆฟ์์์ ์ฌ๋ผ์ง ๊ฒ์ด๋ค. ์ฆ, ์ฌ์ฉ์ ๊ฒฝํ์ด ์ต์ ์ด์๋ค๊ณ ํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ ๊ณ ๋ คํ ๊ฐ๋ฐ์ ๋ฌด์์ผ๊น? ์ด๋ฒ ๋ฏธ์ ์ ์๋ก ๋ค์ด๋ณด์. ๋ด๊ฐ ๋ง๋ ์นด๋ ๋ฑ๋ก์ ์ฌ์ฉ์๊ฐ ์ด์ฉํ์ ๋ ๊ณผ์ฐ ํธํ๊ฒ ๋ฑ๋กํ ์ ์์๊น? ์ฌ์ฉ์๊ฐ ์๋ชป ์ ๋ ฅํ์ ๋ ์ค๋ฅ ๋ฉ์์ง๋ ์ ์ ํ๊ฐ? ๋์์ธ์ ์๋ก ์ ์ด์ธ๋ฆฌ๊ณ ์ฑ์ ์ ์ ํ๊ฐ?๋ฅผ ๊ณ ๋ คํ๋ฉด์ ๋ฏธ์ ์ ์งํํ๋ค๋ฉด ์ฌ์ฉ์๋ฅผ ์ถฉ๋ถํ ๊ณ ๋ คํ๋ค๊ณ ํ ์ ์๋ค.
์ฌ์ฉ์ ๊ฒฝํ์ ์ฆ์ง์ํค๊ธฐ ์ํ ์ฌ๋ฌ ์์๋ค ๊ฐ์ด๋ฐ ํฌ์ ๋๋น ๊ฐ์ฑ๋น๊ฐ ์ข์ ๊ฒ์ด ๊ธ์ด๋ค. ๋ค์ ๋งํด, ์ด๋ค ๊ธฐ๋ฅ์ ์ด์ฉํ๋ ์ฌ์ฉ์์๊ฒ ์ ์ ํ ๋ฉ์์ง๋ UX ๋์์ธ์ด๋ผ๊ณ ํ ์ ์๊ณ ์ด๋ ํน๋ณํ ๋ฅ๋ ฅ์ ์๊ตฌํ์ง ์๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ๋๋ ๊ฐ๊ด์ ์ผ๋ก ์๊ฐํ์ ๋, ๋์์ธ์ ๋ง์ด ๋ชปํ๋ค๊ณ ์๊ฐํ๋ค. ๋ง์ ๋ ํผ๋ฐ์ค๋ฅผ ๋ณด๋ฉฐ ๋์์ธ์ ๋ํ ๊ฐ๊ฐ๋ ํค์ธ ์ ์๋๋ก ํด๋ณด์. ์คํ ๋ฆฌ๋ถ๋ ์ ๊ทน ํ์ฉํด์ ๋ง์ ํผ๋๋ฐฑ์ ๋ฐ์๋ณด์.
๐ ์ํ ์
1. Custom Hook์ ๋ํ ๊ธฐ์ค์ ์ก์๊ฐ๊ณ ์๋ค.
2. ๋ฆฌ๋ทฐ์ด์ ๋ง์ ํํ์ ํ๋ค.
3. ์นด๋์ฌ, ๋ชจ๋ฌ์ CDD๋ฅผ ํตํด ๊ตฌํํ์๋ค.
๐ ์์ฌ์ด ์
1. ์ปดํฌ๋ํธ์ ์ํธ ์์ฉ ํ ์คํธ๋ฅผ ํ์ง ๋ชปํ๋ค.
2. ์ ํจ์ฑ ๊ฒ์ฌ์ ๋ํ ๋ก์ง์ด ์ฒด๊ณ์ ์ด์ง ๋ชปํ๋ค๋ ๊ฒ์ ๋๊ผ๋ค.
3. Custom Hook ํ ์คํธ๋ฅผ ์ ๋๋ก ํ์ง ์์ ๋๋์ด๋ค.
๐ ์์ผ๋ก์ ๊ฐ์ค
1. ์ฌ์ฉ์์ ๊ฒฝํ์ ์๊ฐํ๋ฉฐ ๊ฐ๋ฐ์ ํ์.
2. ์ฝ๋์ ํ์ง์ ๋์ด๋ ๊ฒ์ ๋น์ฐ, ํ ์คํธ๋ ์ ๊ฒฝ ์ฐ์.
'๐ ์ฐ์ํํ ํฌ์ฝ์ค > Level2' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ ๋ฒจ2 ์ฅ๋ฐ๊ตฌ๋ - Step1 (0) | 2023.05.27 |
---|---|
๋ ๋ฒจ2 ํ์ด๋จผ์ธ - Step3 (0) | 2023.05.15 |
๋ ๋ฒจ2 ํ์ด๋จผ์ธ - Step1 (4) | 2023.04.24 |
๋ ๋ฒจ2 ๋ค์, ์ ์ฌ ๋ญ ๋จน์ง - Step 2 (11) | 2023.04.21 |
๋ ๋ฒจ2 ๋ค์, ์ ์ฌ ๋ญ ๋จน์ง - Step 1 (0) | 2023.04.14 |