React

[React] API ์—ฐ๋™ํ•˜๊ธฐ with axios

ํ•˜์ด๋žŒ 2023. 5. 8. 18:15

ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ณ , ๋ณด๋‚ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค.

์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด 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 ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ์ ์€ ๊ผญ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹คโ—๏ธ