-
๐ฆ ์์ด๋น์๋น ํ๋ก์ ํธ ๋ง์ง๋ง ์ฃผ์ฐจ!
์ด์ฉ๋ค ๋ณด๋ ํ์ฃผ์ฉ ๋ฐ๋ ค์ ์ฐ๊ณ ์๋ ๊ฒ ๊ฐ์๋ฐ ์ผ์ฃผ์ผ ์ง๋์ ์ฐ๋ ค๊ณ ํ๋๊น ์ ๊ธฐ์ต์ด ์ ๋๋ค ( ๏ฝฅแด๏ฝฅฬฅฬฅฬฅ )
๋ค์ ํ๊ณ ๋ถํด ๋ฐ๋ฆฌ์ง ๋ง๊ณ ์จ์ผ์ง ใ ใ
๐ ๊ณ ์ฐจ ์ปดํฌ๋ํธ ์ ์ฉ
const SearchBar = ({ size = SEARCH_BAR_SIZE.LARGE }: SearchBarPropsTypes) => { ... return ( <S.Container {...{ size }} onClick={toggleIsActive}> <PeriodProvider> <PeriodArea {...{ size }} /> </PeriodProvider> <PriceProvider> <PriceArea {...{ size }} /> </PriceProvider> <PersonnelProvider> <PersonnelArea {...{ size }} /> </PersonnelProvider> </S.Container> ); };
๊ฒ์๋ฐ์ ์๊ธ ์์ญ ๋ถ๋ถ์ ๊ตฌํํ๋ฉด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด Context API๋ฅผ ์ฌ์ฉํ๋ค. ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ฒ์๋ฐ ์ปดํฌ๋ํธ์์ ํด๋น ์์ญ์ Provider๋ก ๊ฐ์ธ์ผํ๋๋ฐ, ๋ง์ฝ์ ๊ฐ ์์ญ๋ง๋ค Provider๊ฐ ํ๋์ฉ ์๋ค๊ณ ํ๋ฉด ์ ๋ ๊ฒ ๋ค์ด๊ฐ์ผ ํ๋ ๊ฑด๊ฐ ์ถ์ด์ ์ด ๋ถ๋ถ์ด ์ข ๋ง์ ๋ค์ง ์์๋ค.. ์ด ๋ถ๋ถ์ ์จ๊ธธ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น ํ๋ค๊ฐ ๊ณ ์ฐจ ์ปดํฌ๋ํธ๊ฐ ์๊ฐ๋์ ์ ์ฉํด๋ณด์๋ค.
interface WithProviderPropsType<T> { Component: FC<T>; Provider: FC<ProviderTypes>; } interface ProviderType { children: JSX.Element; } const WithProvider = <T,>({ Component, Provider }: WithProviderPropsTypes<T>) => { return (props: T) => { return ( <Provider> <Component {...props} /> </Provider> ); }; };
๊ฒฐ๋ก ์ ์ผ๋ก ์์ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๋ค. ์ปดํฌ๋ํธ์ Provider๋ฅผ ๋ฐ์์ Provider๋ก ๊ฐ์ผ ์ปดํฌ๋ํธ๋ฅผ ๋ด๋ณด๋ธ๋ค๋ ๊ฒ๊น์ง ์๊ฐํ๋ ๊ฑด ์ด๋ ต์ง ์์๋๋ฐ, ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฉํ๋ ๋ถ๋ถ์ด ์ข ์ด๋ ค์ ๋ค. ์ด ๋ถ๋ถ์ ๊ตฌํํ ๋๋ ์ ๋ค๋ฆญ์ ๋ํด์ ์ ๋๋ก ๊ณต๋ถํ์ง ์์ ์ํ์์ด์ ํ์ ์ ์ด๋ป๊ฒ ์ง์ ํด์ค์ผ ํ ์ง ๊ฐ์ด ์ ์ ์๋ ๊ฒ ๊ฐ๋ค. Provider๋ ๊ณ ์ ์ ์ผ๋ก children์ ๋ฐ๋ ์ปดํฌ๋ํธ๋ ๊ทธ๋ ๊ฒ ํ์ ์ ์ง์ ํด์คฌ๋๋ฐ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ๋ง๋ค ๋ฐ๊ฒ ๋๋ props๊ฐ ์ฒ์ฐจ๋ง๋ณ์ด๋ผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๋ ค๋ฉด ํ์ ์ ์ง์ ์ง์ ํด์ค ์๊ฐ ์์๋ค. ๊ทธ๋์ ์ฒ์์๋ Provider๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ค์ Propsํ์ ์ ๊ฐ์ ธ์ ์ ๋์ธ ํ์ ์ผ๋ก ๋ง๋ค์ด์ ์ปดํฌ๋ํธ์ ๋ฃ์ด์ค ๋ดค๋๋ฐ, ์๊ฐํ๋ ๋๋ก ์ ์๋ํ์ง ์์๋ค. ๊ทธ๋์ ์ ๋ค๋ฆญ์ ๋ํด ์ข ์ฐพ์๋ณด๊ณ ์ ์ฉํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์์๋ค. ์ด์ ์ ๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ค๊ฐ ์ ์๋ํ์ง ์์์ ์คํจํ๋ ์ ์ ๋ ์๊ณ , ๊ฑฐ๊ธฐ๋ค๊ฐ ํ์ ์คํฌ๋ฆฝํธ๊น์ง ์ ์ฉํ ์ํ๋ก ํ๋ ค๋ ์ฒ์์ ์ ๋๋ก ๋ง๋ค ์ ์์๊น ์ถ์๋๋ฐ ์ด๋ฒ์ ์ ์ ์ฉํ ์ ์์ด์ ๋คํ์ด์๋ค!
๐ useContext ์ปค์คํ ํ
// 1. export const PriceContext = createContext<PriceContextType>({} as PriceContextType); // 2. export const PriceContext = createContext<PriceContextType | null>(null);
๊ธฐ์กด์๋ createContext๋ฅผ ํ๋ฉด์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ฌด๊ฒ๋ ๋ฃ์ด์ฃผ์ง ์์ ์ํ๋ก ์ฌ์ฉํ๋๋ฐ, ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฉํ๋ ์ปจํ ์คํธ์ ํ์ ์ ์ง์ ํด์ฃผ๊ณ ๊ฐ์ ๋ฃ์ด์ฃผ์ง ์์ผ๋ฉด ํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ฐพ์๋ณด๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์๋ ๊ฒ ๊ฐ์๋ฐ, ์ฒซ ๋ฒ์งธ๋ ์์ฒ๋ผ ๋น ๊ฐ์ฒด๋ฅผ ๋ฃ๊ณ ํด๋น ์ปจํ ์คํธ์ ํ์ ์ผ๋ก ํ๋ณํ์์ผ์ฃผ๋ ๋ฐฉ๋ฒ์ด์๋ค. ๋ ๋ฒ์งธ๋ null๋ ๋ฐ์ ์ ์๋๋ก ์ง์ ํด์ฃผ๊ณ , ๊ธฐ๋ณธ๊ฐ์ผ๋ก null์ ๋ฃ์ด์ค ๋ค ์ฌ์ฉํ ๋ null์ธ์ง ์ฌ๋ถ๋ฅผ ์ฒดํฌํ ํ ์ฌ์ฉํ๋ ๋ฐฉ์์ด์๋ค.
์ง๋์ฃผ์ ํ์ ์คํฌ๋ฆฝํธ ์คํฐ๋์์ ํ๋ณํ์ ๋ํด ๊ณต๋ถํ์ง ์์์ผ๋ฉด ์ฒซ ๋ฒ์งธ ๋ฐฉ์์ด ๋ ๊ฐํธํ๋ค๊ณ ์๊ฐํด์ ์ฌ์ฉํ์ ๊ฒ ๊ฐ์๋ฐ, ํ๋ณํ์ ํ์ ์ ๋ณํํ๋ ์ฉ๋๋ผ๊ธฐ๋ณด๋ค๋ ํด๋น ํ์ ์ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ ํํ ์์ง ๋ชปํ ๋ ์๋ ค์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ๊ฑฐ๋ผ๊ณ ํ๋ ๊ฒ ๊ฐ์์ ๋น ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ํ๋ณํํ๋ ๊ฒ ์ข ์ฐ์ฐํ๊ฒ ๋๊ปด์ก๋ค.
export const usePersonnelState = ( type?: string, ): PersonnelStateWithType | PersonnelContextTypes => { const personnelState = useContext<PersonnelContextTypes | null>(PersonnelContext); if (!personnelState) throw new Error('PersonnelProvider is not found'); const { numberOfAdults, setNumberOfAdults, numberOfChildren, setNumberOfChildren, numberOfBabies, setNumberOfBabies, } = personnelState; switch (type) { case PERSONNEL_TYPE.ADULT: return [numberOfAdults, setNumberOfAdults]; case PERSONNEL_TYPE.CHILD: return [numberOfChildren, setNumberOfChildren]; case PERSONNEL_TYPE.BABY: return [numberOfBabies, setNumberOfBabies]; default: return personnelState; } };
๊ทธ๋์ ๋๋ฒ์งธ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ก ํ๊ณ , null์ ์ฒดํฌํ๋ ๋ถ๋ถ์ ์ปค์คํ ํ ์ผ๋ก ๋ง๋ค์ด์ ๋ถ๋ฆฌํด์ฃผ์๋ค. ์ด๋ ๊ฒ ํ๋ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ ๋ useContext๋ฅผ ์ปดํฌ๋ํธ์์ ๋ฐ๋ก ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ์ธ ์ ์์ด์ ์ข์๊ณ , ๋ props๋ก ํ์ ์ ๋ฐ์ ํด๋น ํ์ ์ ํด๋นํ๋ ์ํ๋ง ๋ฐํํด์ ์ธ ์ ์๋๋ก ํ๋ค๋์ง ํ๋ ๋ก์ง๋ ํ ์์์ ์์ฑํ๋ ์ปดํฌ๋ํธ์์ ํ์ํ ์ํ๋ง ๊ฐ์ ธ๋ค ์ธ ์ ์์ด์ ํธ๋ฆฌํ๋ค๊ณ ๋๊ปด์ก๋ค.
๐ฅ ๋ชจ๋ฌ์ฐฝ ๊ตฌ์กฐ ๋ณ๊ฒฝํ๊ธฐ
์ง๋์ฃผ์ ๋ชจ๋ฌ ๊ตฌํ ๊ด๋ จํด์ ๋ฆฌ๋ทฐ์ด๋๊ป ์ง๋ฌธ์ ๋๋ ธ์๋๋ฐ, ์ด๋ ๊ฒ ๋ต๋ณ์ ์ฃผ์ จ๋ค. ์๊ฐํด๋ณด๋ฉด ๋์ผํ๊ฒ ์ฐ์ด๋ ๋ชจ๋ฌ์ ๊ตฌ์กฐ๋ ์ฌ์ฌ์ฉํ๋๋ผ๋ createPortal์ ์ฌ์ฉํด์ ๋ ๋๋งํ๋ ๋ถ๋ถ๊น์ง ๋ชจ๋ ํต์ผํ ํ์๋ ์๋ ๊ฑด๋ฐ ๋ฐ๋์ createPortal์ ์ฌ์ฉํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๊ณ ์์๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ createPortal์ ์ฌ์ฉํ๋ Portal ์ปดํฌ๋ํธ๋ ํ์ํ ๋๋ง ์ฐ๋ ๊ฒ์ผ๋ก ํ๊ณ , DOM์ ์ํ๋ก ๋ค๋ฃจ๋ ๊ฒ ๋ํ ๋ ๋๋ง์ ์ํฅ์ ์ฃผ๋ ๊ทธ๋ฌ์ง ์๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค๋ ํผ๋๋ฐฑ์ ์ฃผ์ ์ ํด๋น ๋ก์ง์ useModal ํ ์์ ์ญ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ฌ์ ์ด๋ฆผ/๋ซํ ์ฌ๋ถ๋ฅผ ์ํ๋ก ๋๊ณ ๋ชจ๋ฌ ์์ญ ๋ฐ์ ํด๋ฆญํ์ ๋ ๋ชจ๋ฌ์ฐฝ์ ๋ซ๋ ๋ก์ง์ ํ ์ ์ถ๊ฐํ๋ค.
const handleModalClick = (event: MouseEvent) => { for (const element of event.composedPath()) { if (element === modalRef.current) return; } setIsModalOpen(false); }; useEffect(() => { window.addEventListener('click', handleModalClick, true); return () => { window.removeEventListener('click', handleModalClick, true); }; }, [modalRef]);
์ด์ ์ ๋ชจ๋ฌ์ ๊ตฌํํ ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋์ ํ๋ฉด ์ ์ฒด ํฌ๊ธฐ์ ๋์ผํ div๋ฅผ ๋์ด์ ํด๋น div๊ฐ ํด๋ฆญ๋์์ ๋ ๋ชจ๋ฌ์ด ๋ซํ๋๋ก ๊ตฌํํ์๋ค. ํ์ง๋ง ์ด๋ฒ์๋ ๊ฒ์๋ฐ์ ๋ค๋ฅธ ์์ญ์ ํด๋ฆญํ์ ๋ ์ด๋ ค์๋ ๋ชจ๋ฌ์ฐฝ์ด ๋ซํ๋ฉฐ ๋ฐ๋ก ๋ค๋ฅธ ์์ญ์ ๋ชจ๋ฌ์ฐฝ์ ๋์์ฃผ์ด์ผ ํ๋๋ฐ, ์ด์ ์ฒ๋ผ ๊ตฌํํ๋ฉด ์ด ๋ถ๋ถ์ ๊ตฌํํ ์๊ฐ ์์๋ค. ๊ทธ๋์ ํด๋ฆญํ ์์ญ์ด ๋ชจ๋ฌ ์์ญ ์์ ์๋์ง ์ฌ๋ถ๋ฅผ ์ด๋ป๊ฒ ํ์ธํ ์ ์์๊น ํ๋ค๊ฐ ์ด๋ฒคํธ ๊ฐ์ฒด์์ path๋ผ๋ ์์ฑ์ ๋ฐ๊ฒฌํ๋ค.
path์๋ ํด๋น ์์์์๋ถํฐ ์ต์์ ์์์ธ window ๊ฐ์ฒด๊น์ง๊ฐ ๋ฐฐ์ด๋ก ๋ด๊ฒจ์์๋ค. ์ด ์์ฑ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ composedPath()๋ก ๊ฐ์ ธ๋ค ์ธ ์ ์์๋๋ฐ, ์ด ๋ฐฐ์ด์ ๋๋ฉด์ ๋ชจ๋ฌ ์์ญ์ ref ๊ฐ์ฒด์ ์ผ์นํ๋ ์์๊ฐ ์๋์ง๋ฅผ ํ์ธํ์ฌ ๋ชจ๋ฌ ๋ฐ์์ ํด๋ฆญ์ด ๋ฐ์ํ ๊ฒฝ์ฐ์ ์ฐฝ์ ๋ซ์์ฃผ๋๋ก ํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํ๋ ๊ฒ์๋ฐ ์์ญ์ ์๋ฌด๋ฆฌ ํด๋ฆญํด๋ ๋ชจ๋ฌ์ฐฝ์ด ์ด๋ฆฌ์ง ์์๋ค. ๋ชจ๋ฌ์ ์ด๊ธฐ ์ํด ๊ฐ ์์ญ์ ๋ฑ๋กํด๋ ํด๋ฆญ ์ด๋ฒคํธ์ useModal ํ ์์ ๋ฑ๋กํด๋ ๋ชจ๋ฌ์ ๋ซ๊ธฐ ์ํ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๊ฐ์ด ๋ฐ์ํด์ ๊ทธ๋ฐ ๊ฒ ์๋๊น ์ถ์๋ค. ๊ทธ๋์ window์ ๊ฑด ์ด๋ฒคํธ ๋ฆฌ์ค๋์ useCapture ์ต์ ์ true๋ก ์ง์ ํด์ฃผ๋ ๋ชจ๋ฌ์ด ์ ์๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
๐ ๊ทธ ์ธ ์์ํ ๊ณ ๋ฏผ๋ค
์๊ธ ์ฌ๋ผ์ด๋ ๊ฐ์ ๊ฒฝ์ฐ ์ปจํ ์คํธ ๋ด์์ ์ฐ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๋ฐ์์์ ์ฐ๊ณ ์์๋๋ฐ, ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ก์ง์ Provider ์์ ๋ ๊ฒ์ธ์ง ์ปดํฌ๋ํธ ๋ด์์ ํ ํ set ํจ์๋ฅผ ํตํด ์ํ์ ๋ฃ์ด์ค ๊ฒ์ธ์ง ๊ณ ๋ฏผ์ด ๋์๋ค. ์๊ฐํด๋ดค์ ๋๋ ์ด๋์ ๋๋๋ง ๋ค๋ฅผ ๋ฟ ํฐ ์ฐจ์ด์ ์ ์์ง ์์๊น ์ถ์๊ณ ๋ ์ค ๋ ๋ง์ด ์ฐ์ด๋ ๋ฐฉ์์ด ์๋์ง ๊ถ๊ธํ๋๋ฐ, ์นธ์ด ๋ณดํต ์ฌ์ด๋ ์ดํํธ์ฌ์ ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ ์ํ๋ฅผ ์ ๋ฐ์ดํธ์์ผ์ฃผ๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ๋ง์ํด์ฃผ์ ๋ฆฌ๋ทฐ๋ฅผ ๊ณต์ ํด์คฌ๋ค. ๊ทธ๋ฐ๊ฐ ์ถ๊ธฐ๋ ํ๋๋ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ฃ์ด์ฃผ๋ ๊ฒ๋ ์ด๋ป๊ฒ ๋ณด๋ฉด ํด๋น ์ํ์ ๊ด๋ จ๋ ๋ก์ง ์ค ํ๋๋๊น ๊ฐ์ด ๋ฌ๋ ๊ด์ฐฎ์ง ์๋ ์ถ์ ์๊ฐ์ด ๋ค๊ธฐ๋ ํ๋ค. ๊ทผ๋ฐ ๋ง์คํฐ ํผ๋๋ฐฑ ์๊ฐ์ ํฌ๋กฑ๋ ํด๋น ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ fetch๋ฅผ ํ๋ ๊ฒ ๋ง๋ค๊ณ ๋ง์ํ์๋ ๊ฒ ๊ฐ์์ ์์ผ๋ก๋ ๊ทธ๋ ๊ฒ ํด๋ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
const useCanvas = ({ canvasWidth, canvasHeight, animate }: useCanvasTypes) => { const canvasRef = useRef<HTMLCanvasElement>(null); useEffect(() => { const canvas = canvasRef.current; const ctx = canvas?.getContext('2d'); const setCanvas = () => { const devicePixelRatio = window.devicePixelRatio ?? 1; if (canvas && ctx) { canvas.style.width = `${canvasWidth}px`; canvas.style.height = `${canvasHeight}px`; canvas.width = canvasWidth * devicePixelRatio; canvas.height = canvasHeight * devicePixelRatio; ctx.scale(devicePixelRatio, devicePixelRatio); } }; setCanvas(); ctx && animate(ctx); }); return canvasRef; };
๋ ์บ๋ฒ์ค๋ฅผ ์ฌ์ฉํ ๋ ์บ๋ฒ์ค์ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๊ณ , ์บ๋ฒ์ค๋ฅผ ๊ทธ๋ฆฌ๋ ํจ์๋ฅผ ๋ฐ์ ์คํ์์ผ์ฃผ๋ useCanvas ํ ์ ์ฌ์ฉํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๋ผ์ด๋์์ ์ง์ ํ ๊ฐ์ ๋ฒ์์ ๋ฐ๋ผ ์ฐจํธ์์ ํด๋น ์์ญ์ ๊ฐ์กฐํด์ ๊ทธ๋ ค์ฃผ๋ ๋ถ๋ถ์ ๊ตฌํํ๊ธฐ ์ํด์๋ ์บ๋ฒ์ค๋ฅผ ๊ทธ๋ฆฌ๋ animate ํจ์๋ฅผ ์ฌ๋ผ์ด๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ์์ผ์ฃผ์ด์ผ ํ๋๋ฐ, useEffect ๋ด์์ ์บ๋ฒ์ค๋ฅผ ์ธํ ํ๊ณ ref ๊ฐ์ฒด๋ง ๋ฐํํ๊ณ ์๋ ํ ์ ๊ตฌ์กฐ์ animate ๋ถ๋ถ๋ง ํธ์ถํ ์๊ฐ ์์๋ค. ๊ทธ๋์ ์ฐ์ฐํ์ง๋ง ์ผ๋จ์ useEffect์ ์์กด์ฑ ๋ฐฐ์ด์ ์ญ์ ํ๋๋ฐ, ๋ฆฌ๋ทฐ์์ '๋งค๋ฒ ๋ฆฌ๋ ๋๋ง ๋๋ ๊ฒ์ ์์ํ๊ณ ๋ง๋์ ๊ฑฐ์ฃ ?' ๋ผ๊ณ ๋ฑ ์ด ๋ถ๋ถ์ ์ธ๊ธํด์ฃผ์ จ๋ค..ใ ใ ์ด๋ ๊ฒ ํ๋ฉด ์บ๋ฒ์ค๋ฅผ ๊ฐ์ ธ์์ ์ปจํ ์คํธ๋ฅผ ๋ง๋ค๊ณ ํฌ๊ธฐ๋ฅผ ์ธํ ํด์ฃผ๋ ๋ถ๋ถ๊น์ง ๋ถํ์ํ๊ฒ ๋งค๋ฒ ์คํ๋๋๋ฐ, ์ด๋ป๊ฒ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ์ง ์ ์๊ฐ์ด ๋์ง ์์์ ์์ง ๊ฐ์ ํ์ง ๋ชปํ๋ค. ์ข ๋ ๊ณ ๋ฏผ์ด ํ์ํ ๊ฒ ๊ฐ๋ค. ๐ฅฒ
๐จ ์์ด๋น์๋น ํ๋ก์ ํธ ๋!
3์ฃผ๊ฐ ์ ๋ง ํธ๋ก๋ก ์ง๋๊ฐ๋ฒ๋ ธ๋ค..ใ ์ด๋ฒ ํ๋ก์ ํธ๋ ์์ฌ์์ด ๋ง์ด ๋จ๋ ๊ฒ ๊ฐ๋ค. ๊ฐ์ด ํ์ด ๋์๋ ์ง๋๋ ํค์ดํธ์๋ ๋๋ฌด ์ข์๊ณ ์ฌ๋ผ์ด๋๋ ์ง๋ API ์ฌ์ฉ ๋ฑ ์๋กญ๊ฒ ๋์ ํ ์ ์๋ ๊ฑฐ๋ฆฌ๋ ๋ง์์ง๋ง ๊ธฐ๋ฅ ๊ตฌํ ์ฌ๋ถ๋ฅผ ๋ ๋ ๋ด๊ฐ ๊ทธ๋งํผ ์ด์ฌํ ์ํ์ง ๋ชปํ ๊ฒ ๊ฐ์์ ์ฃ์กํ ๋ง์์ด๋ค.. ๋ฉํ ๊ด๋ฆฌ ์ปจ๋์ ๊ด๋ฆฌ ์ํด์ ๋ง์ง๋ง ํ๋ก์ ํธ๋ ์์ฐจ๊ฒ ๋ณด๋ผ ์ ์๋๋ก ๋ ธ๋ ฅํด์ผ๊ฒ ๋ค.
๊ทธ๋๋ ์ด๋ฒ ํ๋ก์ ํธ๋ ๋ฆฌ๋ทฐ ๋ฐ์ ๋ด์ฉ์ด ์์ฐจ์ ์ข์๋ค! ๋นฐ๋นฐ์ด ์ง๋ฌธํ ๋ถ๋ถ๋ฟ๋ง ์๋๋ผ ์ฝ๋๊น์ง ๊ผผ๊ผผํ๊ฒ ๋ณด๊ณ ํผ๋๋ฐฑ์ฃผ์ ์ ์ํ ๋ถ๋ถ์ ์ด๋์ง, ๊ฐ์ ํด์ผ ํ ๋ถ๋ถ์ ๋ ์ด๋์ง ์ ์ ์์ด์ ์ข์๊ณ ๋๋ ๊ฐ์ฌํ๋ค. ใ ใ ๋๋ถ์ ํ๋ก์ ํธ๋ฅผ ํ๋ ๋์ ์ ์ด๋ฐ ์ฝ๋๋ฅผ ์์ฑํ๋์ง์ ๋ํด ์ข ๋ ์๊ฐํด๋ณผ ์ ์์๊ณ , ์์ผ๋ก ํ๋ก์ ํธ๋ฅผ ํ ๋๋ ์ข ๋ ์์์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ฒ ๋ ๊ฒ ๊ฐ๋ค. ๋ (์ข ๋ฐ๋ฆฌ๊ธด ํ์ง๋ง) 3์ฃผ ๋์ ์ฃผ๊ฐ ํ๊ณ ์ ๋นผ๋จน๊ณ ์์ฑํ ๊ฑด ์ํ ๊ฒ ๊ฐ๋ค. ํ์ผ ๋์ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ด๋ ์ด๋ ค์ ๋ ๋ถ๋ถ์ ๊ฐ๋ตํ๊ฒ๋๋ง ์ ๋ฆฌํด๋๊ณ ๊ธ๋ก ํ์ด์ ์ ๋ฆฌํ๋๊น ๊ธฐ์ตํ๊ธฐ๋ ํจ์ฌ ์ข์ ๊ฒ ๊ฐ๋ค. ์ข ๊ตฌ๊ตฌ์ ์ ์ ์ ๊ฐ์ด ์์ง ์์ ์๋๋ฐ ๊ทธ๋๋ ์ด๋ ๊ฒ ์ ์ด๋ฌ์ผ ๋์ค์ ๋ดค์ ๋๋ ์ดํดํ ์ ์์ ๊ฒ ๊ฐ์์ ๊ทธ๋ฅ ํธํ๊ฒ ์ ์๋ค..ใ ใ ์์ผ๋ก๋ ๊พธ์คํ ์์ฑํ ์ ์๋๋ก ํด์ผ๊ฒ ๋ค!
'ํ๊ณ > Codesquad' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[6/13 ~ 6/19] ์ฝ๋์ค์ฟผ๋ ๋ง์คํฐ์ฆ 23์ฃผ์ฐจ ํ๊ณ (0) 2022.06.26 [5/30 ~ 6/5] ์ฝ๋์ค์ฟผ๋ ๋ง์คํฐ์ฆ 21์ฃผ์ฐจ ํ๊ณ (0) 2022.06.12 [5/23 ~ 5/29] ์ฝ๋์ค์ฟผ๋ ๋ง์คํฐ์ฆ 20์ฃผ์ฐจ ํ๊ณ (0) 2022.06.05 ์ฝ๋์ค์ฟผ๋ ๋ง์คํฐ์ฆ ์ธ๋ฒ์งธ ํ๋ก์ ํธ ํ๊ณ (0) 2022.05.25 ๋๊ธ