- axios
- ์ fetch๊ฐ ์๋ axios๋ฅผ ์ฌ์ฉํ๋๊ฐ? ์ฌ์ค ์๋ฐ์คํฌ๋ฆฝํธ์๋ fetch api๊ฐ ์กด์ฌํ์ง๋ง, ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ง์ํ๊ธฐ์ ๊ฐ๋ฐ์๋ค์ ์๋ฒ ํต์ ์ ๋ณด๋ค ํธ๋ฆฌํ axios๋ฅผ ์ ํธํ๋ค๊ณ ..!
Axios | Fetch |
---|---|
์ค์น ํ์ O | ์ค์น ํ์ X |
CSRF ๋ณดํธ ๊ธฐ๋ฅ์ด ์๋ค | ๋ณ๋ ๊ธฐ๋ฅ์ด ์๋ค |
์๋์ผ๋ก JSON ๋ฐ์ดํฐ ํ์์ผ๋ก ๋ณํํด์ค๋ค | json() ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ฌ์ฉํด์ JSON ํํ๋ก ๋ฐ๊ฟ ์ฃผ์ด์ผ ํ๋ค |
์์ฒญ ์ทจ์ ๋ฐ ํ์์์์ ๊ฑธ ์ ์๋ค. | - |
HTTP ์์ฒญ์ ๊ฐ๋ก์ฑ ์ ์๋ค. | - |
์ํ์ฝ๋๊ฐ ์๋ฌ ์ฝ๋๋ฅผ ๋ด๋ฑ์ผ๋ฉด reject ํ๋ค. | ์๋ฌ ์๋ต์ ๋ฐ๋๋ผ๋ resolve ํ๊ณ ๋คํธ์ํฌ ์ฅ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ง ๊ฑฐ๋ถํ๋ค. (์๋ฌ ๋ฑ์ด์ฃผ์ง X) |
- async/await
-
์ promise๊ฐ ์๋ async, await๋ฅผ ์ฌ์ฉํ๋๊ฐ?
โ ๏ธ Promise & then ์ ๋ฌธ์ ์ - ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ณ , ๋๋ฒ๊น ์ด ๋ถํธํ๋ค (๊ธธ์ด์ง๋ ์ฒด์ด๋)
- ์์ธ์ฒ๋ฆฌ (tryโฆcatch ์ .then / .catch์ ํผ์ฉ์ด ํท๊ฐ๋ฆผ)
๐ ๊ทธ๋์ ๋ฑ์ฅํ async/await
async function ํจ์๋ช
( ){
await ๋น๋๊ธฐํจ์();
}
- customAxios
- axios๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค baseURL์ ์์ฑํ๋ ๋ฑ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ธฐ ์ํด์ ์ปค์คํฐ๋ง์ด์งํ ์ธ์คํด์ค๋ฅผ ๋ชจ๋ํํ์ฌ ์ฌ์ฉ
import axios from "axios";
export const customAxios = axios.create({
baseURL: `${import.meta.env.VITE_APP_BASE_URL}`,
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
},
});
- ์ธํฐ์ ํฐ
- ๋ก๊ทธ์ธ์ํ๋ฉด ํค๋์ ํ ํฐ์ ๋ฃ์ด์ฃผ๋ ์์
๐ authorization header
- access ํ ํฐ์ ๋ฐ๋ผ ์ฌ์ฉ์๋ฅผ ์๋ณํด์ผํ๊ธฐ ๋๋ฌธ์ ํ ํฐ์ ํ์ธํ๋ ์ ์ฐจ๊ฐ ํ์์์ต๋๋ค. ๋ฐ๋ผ์ ์์ฒญ์ ์ธํฐ์ ํธํด์ access token์ ์ ๋ณด๋ฅผ ํค๋์ ๋ฃ์ด์ฃผ๋๋ก ํ์ต๋๋ค.
- ํ ํฐ์ Cookie์ ๋ฃ์ด์ ๊ด๋ฆฌํ๊ณ access token์ด ์์ผ๋ฉด ํค๋์ Authorization์ Bearer ${token} ํํ๋ก ํ ํฐ ๊ฐ์ ๋ฃ์ด์ ์์ฒญํฉ๋๋ค.
- useLayoutEffect ํ ์ ์ด์ฉํด์ ๋ ๋๋ง ์ ์ ํ ์คํ
const useSetInterceptors = () => {
useLayoutEffect(() => {
api.interceptors.request.use((config) => {
const accessToken = getToken();
if (accessToken) {
config.headers["Authorization"] = `Bearer ${accessToken}`;
}
return config;
});
});
};
export default useSetInterceptors;
- react-query์ custom-hook
๐ป GET - useQuery ์ฌ์ฉ
์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก unique key๋ฅผ ํฌํจํ ๋ฐฐ์ด์ด ๋ค์ด๊ฐ๋ค. ์ดํ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ฌ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋ค์ด๊ฐ๋ ๋ฐฐ์ด์ ์ฒซ ์์๋ unique key๋ก ์ฌ์ฉ๋๊ณ , ๋ ๋ฒ์งธ ์์๋ถํฐ๋ query ํจ์ ๋ด๋ถ์ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ๋ค์ด ์ ๋ฌ๋๋ค. ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์ค์ ํธ์ถํ๊ณ ์ ํ๋ ๋น๋๊ธฐ ํจ์๊ฐ ๋ค์ด๊ฐ๋ค. ์ด๋ ํจ์๋ Promise๋ฅผ ๋ฐํํ๋ ํํ์ฌ์ผ ํ๋ค. ์ต์ข ๋ฐํ ๊ฐ์ API์ ์ฑ๊ณต, ์คํจ ์ฌ๋ถ, ๋ฐํ๊ฐ์ ํฌํจํ ๊ฐ์ฒด์ด๋ค.
export function useGetAll() {
const { data, error, refetch } = useQuery("getAll", getAll, {
refetchInterval: 3000, // 3์ด๋ง๋ค ๋ฐ์ดํฐ๋ฅผ refetch
onError: () => {
console.log("๋ฌผํ ๋ฆฌ์คํธ ์กฐํ ์๋ฌ", error);
},
});
return { data, error, refetch };
}
๐ป POST - useMutation ์ฌ์ฉ
๋ฐํ๊ฐ์ useQuery์ ๋์ผํ์ง๋ง, ์ฒ์ ์ฌ์ฉ ์์ post ๋น๋๊ธฐ ํจ์๋ฅผ ๋ฃ์ด์ค๋ค. ์ด๋ useMutation์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋น๋๊ธฐ ํจ์๊ฐ ๋ค์ด๊ฐ๊ณ , ๋ ๋ฒ์งธ ์ธ์๋ก ์ํฉ ๋ณ ๋ถ๊ธฐ ์ค์ ์ด ๋ค์ด๊ฐ๋ค๋ ์ ์ด ์ฐจ์ด์ด๋ค.
์ค์ ์ฌ์ฉ ์์๋ mutation.mutate ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ , ์ฒซ ๋ฒ์งธ ์ธ์๋ก API ํธ์ถ ์์ ์ ๋ฌํด์ฃผ์ด์ผํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค const { mutate: postVoteMutate } = usePostVote();
export function usePostImage() {
return useMutation(postImage, {
onSuccess: (data) => {
console.log("์ด๋ฏธ์ง ์
๋ก๋ ์ฑ๊ณต", data);
},
onError: (error) => {
console.log("์ด๋ฏธ์ง ์
๋ก๋ ์คํจ", error);
},
});
}
๐ ์ React Query๋ฅผ ์ฌ์ฉํ๋๊ฐ?
- React Query๋ React Application์์ ์๋ฒ ์ํ๋ฅผ ๋ถ๋ฌ์ค๊ณ , ์บ์ฑํ๋ฉฐ, ์ง์์ ์ผ๋ก ๋๊ธฐํํ๊ณ ์ ๋ฐ์ดํธํ๋ ์์ ์ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- ๋ณต์กํ๊ณ ์ฅํฉํ ์ฝ๋๊ฐ ํ์ํ ๋ค๋ฅธ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ React Component ๋ด๋ถ์์ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ผ๋ก API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ ๋์๊ฐ React Query์์ ์ ๊ณตํ๋ ์บ์ฑ, Window Focus Refetching ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ API ์์ฒญ๊ณผ ๊ด๋ จ๋ ๋ฒ์กํ ์์ ์์ด โํต์ฌ ๋ก์งโ์ ์ง์คํ ์ ์์ต๋๋ค.
- React-Query๋ ์บ์ฑ์ ํตํด ๋์ผํ ๋ฐ์ดํฐ์ ๋ํ ๋ฐ๋ณต์ ์ธ ๋น๋๊ธฐ ๋ฐ์ดํฐ ํธ์ถ์ ๋ฐฉ์งํ๊ณ , ์ด๋ ๋ถํ์ํ API ์ฝ์ ์ค์ฌ ์๋ฒ์ ๋ํ ๋ถํ๋ฅผ ์ค์ด๋ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- ์ปดํฌ๋ํธ ๋ด๋ถ์์ Server ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์๋๋ฐ, ์ด๋ onSuccess์ onError ํจ์๋ฅผ ํตํด fetch ์ฑ๊ณต๊ณผ ์คํจ์ ๋ํ ๋ถ๊ธฐ๋ฅผ ์์ฃผ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ด์ ์ด๋ Server ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ณผ์ ์์ ๊ตฌํํด์ผํ ์ถ๊ฐ์ ์ธ ์ค์ ๋ค์ ์งํํ ํ์๊ฐ ์์ต๋๋ค.
- ๐ ์ฆ, Client ๋ฐ์ดํฐ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ด๋ฆฌํ๊ณ , Server ๋ฐ์ดํฐ๋ React-Query๊ฐ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๊ณ ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋ Client ๋ฐ์ดํฐ์ Server ๋ฐ์ดํฐ๋ฅผ ์จ์ ํ๊ฒ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
์ฅ์ | |
---|---|
์ฌ์ฌ์ฉ์ฑ | API ํธ์ถ๊ณผ ์ฒ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ |
์๋ฌ ํธ๋ค๋ง | useMutation์ onError ์ฝ๋ฐฑ์ ์ฌ์ฉํ์ฌ ์๋ฌ๋ฅผ ์ฒ๋ฆฌ |
์ฑ๊ณต ์ฒ๋ฆฌ | onSuccess ์ฝ๋ฐฑ์ ์ฌ์ฉํด ์ฑ๊ณต ์ ํ์ํ ํ์ ์์ (์: ํ์ด์ง ์ด๋)์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ |
์ํ ๊ด๋ฆฌ | React Query๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉด, ์ํ๋ฅผ ์ง์ ๊ด๋ฆฌํ ํ์ ์์ด ์๋์ผ๋ก ์ ๋ฐ์ดํธ |
- ๋ฆฌ์กํธ์ฟผ๋ฆฌ๋ฅผ ์ ์ฉํ ๋ฐฉ๋ฒ
- api ํด๋์ ์๋ ํจ์๋ API ํธ์ถ์ ์ํํฉ๋๋ค.
- customAxios๋ฅผ ์ฌ์ฉํด API ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ก๋ถํฐ์ ์๋ต์ ๋ฐํํฉ๋๋ค.
- hooks ํด๋์ ์๋ ํจ์๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ญํ
- ์๋ฅผ ๋ค์ด, ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์ฟ ํค์ ํ ํฐ์ ์ ์ฅํ๊ณ , ์คํจ ์ ์๋ฌ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๋ฑ ์ปค์คํ ํ ์ ์์ต๋๋ค.
- ์ปดํฌ๋ํธ์์ hooks๋ค์ ํธ์ถํ์ฌ ๋ค์ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค
git clone ์ ์ฅ์_์ฃผ์.git
cd ํด๋_์ด๋ฆ
์ญํ | ์ข ๋ฅ |
---|---|
Library | |
Programming Language | |
Styling | |
Data Fetching | |
Formatting | |
Package Manager | |
Version Control | |
Deploy |
[Issue ๋จผ์ ์์ฑํ๊ณ ํด๋น ์ด์ ๋ฒํธ ๋ธ๋์น ์์ฑ]
main
: ์ต์ข Merge๋ฅผ ํ๋ ๊ณณ (๋ฐฐํฌ ๋ธ๋์น)develop
: ๊ฐ๋ฐํ ๋ Mergeํ๋ ๊ณณํ์ด์ง๋ช
: ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ฉด์ ๊ฐ์ ํ์ด์ง๋ณ๋ก ์ฌ์ฉํ ๋ธ๋์น
์ด์๋ฒํธ/ํ์ด์ง/๊ธฐ๋ฅ์ค๋ช
signup
ใด 46/signup/resize-padding