[React] API ์ฐ๋ํ๊ธฐ with axios
ํ๋ก์ ํธ๋ฅผ ํ๋ค ๋ณด๋ฉด ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ณ , ๋ณด๋ด์ผ ํ๋ ์ํฉ์ด ์๊ธด๋ค.
์์๋ฅผ ํตํด axios๋ฅผ ์ด์ฉํ์ฌ API๋ฅผ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์!
1. axios ์ค์นํ๊ธฐ
API๋ฅผ ํธ์ถํ๊ธฐ ์ํด์ axios๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผ ํ๋ค.
// 1. npm์ ์ด์ฉํ์ฌ ์ค์นํ๋ ๊ฒฝ์ฐ
npm install axios
// 2. yarn์ ์ด์ฉํ์ฌ ์ค์นํ๋ ๊ฒฝ์ฐ
yarn add axios
์ค์นํ๋ค๋ฉด ์ฌ์ฉํ๊ณ ์ ํ๋ ํ๋ก์ ํธ์์ import๋ฅผ ํด์ผ ํ๋ค.
import axios from "axios";
์ด๋ ๊ฒ API๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ ์ํ๊ฐ ๋์๋ค. ์ฐ๋ฆฌ๋ API๋ฅผ ์ฌ์ฉํด์ ์๋์ ๊ฐ์ ๋์์ ํ ์ ์๋ค.
- Create : ๋ฐ์ดํฐ ์์ฑ(POST)
- Read : ๋ฐ์ดํฐ ์กฐํ (GET)
- Update : ๋ฐ์ดํฐ ์์ (PUT)
- Delete : ๋ฐ์ดํฐ ์ญ์ (DELETE)
์ด ์ค์์ ๋๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ GET์ ์ฌ์ฉํด๋ณด๋ ค๊ณ ํ๋ค.
2. proxy ์ค์ ํ๊ธฐ
GET์ ์ฌ์ฉํ๊ธฐ ์ด์ ์ proxy ์๋ฒ๋ฅผ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค. ์๋ฒ์์ CORS์ ๋ํ ์ค์ ์ ๋ฐ๋ก ํด์ฃผ์ง ์์๋ค๋ฉด, api๋ฅผ ์ฌ์ฉํ ๋ ์๋ฌ๋ฅผ ๋ง์ฃผํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ํ๋ก ํธ ์ธก์์ ๊ฐ๋ฐํ ๋ CORS์๋ฌ๋ฅผ ๋ง์ฃผํ์ง ์๊ณ ์ถ๋ค๋ฉด ์ฐํํ ์ ์๋๋ก proxy ์๋ฒ๋ฅผ ์ค์ ํ์ฌ์ผ ํ๋ค. ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ package.json์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์๋ค.
"proxy" : "http://12.34.56.789"
http://12.34.56.789
๋ผ๊ณ ์ฐ์ฌ์๋ ๋ถ๋ถ์ ์๋ฒ ์ฃผ์๋ฅผ ๋ฃ์ผ๋ฉด ๋๋ค.
๊ฐ๋จํ ์ค๋ช ํ์๋ฉด CORS๋ ํ์ฉ๋ ์ถ์ฒ๋ง ์ ๊ทผํ ์ ์๋ ๊ถํ์ ์ฃผ๋ ๊ฒ์ธ๋ฐ, ํ๋ก ํธ ์๋ฒ๊ฐ ํ์ฉ๋์ง ์์๊ธฐ์ proxy ์๋ฒ๋ฅผ ํตํด ์๋ฒ์ ์๋ฒ ๊ฐ ํต์ ์ผ๋ก ๋ง๋ค์ด ํต์ ์ด ๊ฐ๋ฅํ ๋ก ํ๋ ๊ฒ์ด๋ค.
3. ์ฝ๋ ์์ฑํ๊ธฐ
๋๋ ์์ด๋๊ฐ ์ค๋ณต๋์๋์ง๋ฅผ ํ์ธํ๋ api๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค. ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
const isIdDuplicated = async () => {
const api = `/api/dup_check/${uid}`;
try {
const res = await axios.get(api);
if (res.status === 200) {
return res.data.dup;
}
} catch (e) {
console.log(e.response);
}
};
์ ์ฒด์ ์ธ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
isIdDuplicated
์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์๋ค. ์ด ํจ์๋ ๋ด๊ฐ ๋ณด๋ธ id์ ํด๋นํ๋ id๊ฐ ์ด๋ฏธ ์๋์ง, ์ฆ ์ค๋ณต๊ฒ์ฌ๋ฅผ ํด์ ์ด๋ฏธ ์๋ค๋ฉด true, ์๋ค๋ฉด false๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค. ๋จผ์ api์ ๋ด๊ฐ ๋ณด๋ด์ผ ํ๋ ์ฃผ์๋ฅผ ์ ์ด์ฃผ๋๋ฐ, uid๋ฅผ ํจ๊ป ๋ณด๋ด์ผ ํด์ ${uid}๋ผ๊ณ ์ฝ๋๋ฅผ ์์ฑํ์๋ค. ๊ทธ๋ค์ axios.get(api);
๋ฅผ ํตํด ํด๋น api์ฃผ์๋ก get์์ฒญ์ ๋ณด๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์๋ต์ res๋ผ๋ ์์์ ๋ฃ์ด๋์๋ค. ๋ง์ฝ ๊ทธ ํต์ ์ด ์ฑ๊ณต์ ์ด๋ผ๋ฉด(res.status๊ฐ 200์ด๋ผ๋ฉด) res.data.dup
, ์ฆ ์๋ต์ผ๋ก ์ค๋ true/false ๊ฐ์ ๊ทธ๋๋ก ๋ฐํํ๋๋ก ํด์คฌ๋ค. ํต์ ์ ์ฑ๊ณตํ์ง ๋ชปํ๋ค๋ฉด catch(e)
๋ถ๋ถ์ผ๋ก ๋ค์ด๊ฐ๋๋ฐ, ์ด๋๋ console์ ์๋ฌ ๋ด์ฉ์ ์ถ๋ ฅํ๋๋ก ํด์คฌ๋ค.
async/await
์ด๋ ํจ์์ async/await
์ด๋ผ๋ ํค์๋๊ฐ ์ถ๊ฐ๋์๋ค. async
๋ ํจ์ ์ ์ธ๋ถ ๊ดํธ ์์ ์์นํ๊ณ , await
๋ axios ํธ์ถ๋ถ ์์ ์์นํ๊ฒ ๋๋๋ฐ, ์ด ํค์๋๋ค์ ๋น๋๊ธฐ ํต์ ์ ์ํด ์ฌ์ฉ๋๋ค. ์๋ฒ์ ์์ฒญ์ ํ๋ ๋์ ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ์ง ์๊ณ ๋ค๋ฅธ ์์
์ด ์ํํ๋๋ก ํ๊ธฐ ์ํด ์ด๋ฌํ ๋น๋๊ธฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
4. ์ฌ์ฉํ๊ธฐ
Signup.js
const idChangeHandler = async (e) => {
setUserInfo({ ...userInfo, id: e.target.value });
if (!idCheck(e.target.value)) {
setInvalidIdInfo("6-15์์ ์๋ฌธ ์๋ฌธ์, ์ซ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ");
return;
}
if (await isIdDuplicated(e.target.value)) {
setInvalidIdInfo("์์ด๋๊ฐ ์ค๋ณต๋์์ต๋๋ค.");
return;
}
setInvalidIdInfo("");
};
ํ์๊ฐ์
์์ api๋ฅผ ํธ์ถํ isIdDuplicated
ํจ์๋ฅผ ์ฌ์ฉํด์, ๋ง์ฝ ์ค๋ณต๋์๋ค๋ฉด ์ค๋ช
ํ๋ ๋ถ๋ถ์ "์์ด๋๊ฐ ์ค๋ณต๋์์ต๋๋ค."๊ฐ ๋ฐ ์ ์๋๋ก ํ์๋ค. ๊ฐ๋จํ์ง๋ง, ์ฌ์ฉํ ๋์๋ await ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌํด์ฃผ์ด์ผ ํ๋ ์ ์ ๊ผญ ์ ์ํด์ผ ํ๋คโ๏ธ