refactor client eject, refactor client apis - boostcampwm-2022/web33-Mildo GitHub Wiki
โ๏ธ ๋ถ๋ฐฐ๋ ์ด์
- eject ๋๋๋ฆฌ๊ธฐ
- apis ๊ฐ์ (axios ํ์ , ์ธ์คํด์ค)
- ๋ก๋ฉ jotai suspense
๐ฉ ๊ตฌํ ๋ชฉํ
- eject ๋๋๋ฆฌ๊ธฐ
- ๋ก๋ฉ jotai suspense๋ก ๋ณ๊ฒฝ
- apis ๋ชจ๋ ๊ฐ์
๐ ์ธ๋ถ ๋ชฉํ
- eject ๋๋๋ฆฌ๊ธฐ
- jotai suspense ํ์ต ๋ฐ ๋ก๋ฉ ๊ตฌํ
- apis ๋ชจ๋ ๊ฐ์
- axios interceptor ์ ์ฉ
- axios response ํ์ ์ ์ฉ
๐ฅ๏ธ ๊ตฌํ ๋ด์ฉ
Axios interceptor ์ ์ฉ
-
ํ์ฌ ์ฝ๋
// apis.ts import axios from 'axios'; const request = async ( path: string, method: 'get' | 'post' | 'delete', data?: Record<string, unknown> | undefined ) => { const apiServerURL = process.env.REACT_APP_CLIENT_ENV === 'development' ? process.env.REACT_APP_API_SERVER_URL_DEVELOPMENT : process.env.REACT_APP_API_SERVER_URL_PRODUCTION; try { const response = await axios({ url: `${apiServerURL}${path}`, method, withCredentials: true, data }); ... } catch (error) { console.warn(error); } return { ok: false }; }; export default { getAllArea: () => { return request('/seoul', 'get'); }, ... addBookmark: (areaName: string, userId: string) => { return request(`/auth/${userId}/bookmark/${areaName}`, 'post'); }, deleteBookmark: (areaName: string, userId: string) => { return request(`/auth/${userId}/bookmark/${areaName}`, 'delete'); } };
- ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ผ๋ fetch ๋ชจ๋์ ์กฐ๊ธ ๋ณ๊ฒฝํด์ ๊ทธ๋๋ก ์ ์ฉํ๋ค.
-
๋ณ๊ฒฝ ์ฝ๋
const apiServerURL = process.env.REACT_APP_CLIENT_ENV === 'development' ? process.env.REACT_APP_API_SERVER_URL_DEVELOPMENT : process.env.REACT_APP_API_SERVER_URL_PRODUCTION; const axiosInstance = axios.create({ baseURL: `${apiServerURL}`, withCredentials: true }); const request = async ( path: string, method: 'get' | 'post' | 'delete', data?: Record<string, unknown> | undefined ) => { axiosInstance.interceptors.request.use( config => { config.method = method; if (data) { config.data = data; } return config; }, error => { console.log(error); return Promise.reject(error); } ); try { const response = await axiosInstance(path); return response.data; } catch (error) { console.warn(error); } axiosInstance.interceptors.response.use( response => { return response.data; }, error => { console.log(error); } ); return { ok: false }; };
๐ ํ์ต ๋ด์ฉ
eject ๋๋๋ฆฌ๊ธฐ
eject ์ ํ๋๊ฐ?
-
CRA์ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ถ๊ธํด์ ๋ฏ์ด๋ดค๋ค.
- ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ ๊ฒฐ๊ณผ๋ฌผ์ด ์ด๋์ ์์ฑ๋๋๊ฐ?
- ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๊ณผ ๋ฒ๋ค๋ง ์์๋ ์ด๋ป๊ฒ ๋๋๊ฐ?
bundle.js
๋ ์ด๋์ ์๋๊ฐ?
์ ๋๋๋ฆฌ๋๊ฐ?
- ๊ถ๊ธํ ์ ์ด ์ด๋์ ๋ ํด์๋์๊ณ ๋์ด์ eject๋ ํ์ผ๋ค์ ๊ฑด๋๋ฆด ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋๋ฆฌ๋ ค ํ๋ค.
- eject๋ฅผ ์ฐ๋ฉด ์ ๋๋ ์ด์ ์ ๋ํด ํ์ต
- Webpack, Babel ๋ฑ CRA์ ๋ชจ๋ ์ค์ ์ ์ง์ ์ ์ง๋ณด์ ํด์ผ ํ๋ค.
- CRA์ ์ฅ์ ์ธ One Build Dependency๋ฅผ ์๊ฒ ๋๋ค. ํจํค์ง๋ฅผ ์ค์นํ ๋ ๋ค๋ฅธ ํจํค์ง๋ค๊ณผ์ ์์กด์ฑ์ ์ ๊ฒฝ์จ์ผ ํ๋ค.
๋๋๋ฆฌ๋ ๋ฐฉ๋ฒ
- ์๋ค. ๋์ ์ผ์ผ์ด ์ญ์ /์ค์น๋ฅผ ํตํด ๋ณต๊ตฌ
srcipts
,config
,node_modules
๋๋ ํ ๋ฆฌ ์ญ์ react-scripts
๋ชจ๋ ์ค์นpackage.json
์์scripts
์์ฑ ์์ -
์์ ์ ์ฝ๋
"scripts": { "start": "cross-env REACT_APP_CLIENT_ENV=development node scripts/start.js", "build": "cross-env REACT_APP_CLIENT_ENV=production node scripts/build.js", "test": "node scripts/test.js" },
-
์์ ํ ์ฝ๋
"scripts": { "start": "cross-env REACT_APP_CLIENT_ENV=development react-scripts start", "build": "cross-env REACT_APP_CLIENT_ENV=production react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" },
-