๊ด€๋ฆฌ ๋ฉ”๋‰ด

Hi-๋žŒ๐Ÿ‘‹ High-๋žŒโ˜€๏ธ

[React] API ์„ค์ • ๊ณตํ†ตํ™” - ํ™˜๊ฒฝ๋ณ€์ˆ˜, axios ์ธ์Šคํ„ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ ๋ณธ๋ฌธ

React

[React] API ์„ค์ • ๊ณตํ†ตํ™” - ํ™˜๊ฒฝ๋ณ€์ˆ˜, axios ์ธ์Šคํ„ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ

ํ•˜์ด๋žŒ 2023. 5. 8. 21:25

๊ธฐ์กด์—๋Š” API ์—ฐ๊ฒฐ์„ ์œ„ํ•ด์„œ proxy์„ค์ •์„ ํ•˜๊ณ  ํ˜ธ์ถœํ•  ๋•Œ endpoint ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ CORS์„ค์ •์ด ์™„๋ฃŒ๋˜๊ณ  ๋” ์ด์ƒ proxy๊ฐ€ ํ•„์š” ์—†๊ฒŒ ๋˜์–ด ์‚ญ์ œํ–ˆ๋”๋‹ˆ ๋งค ํ˜ธ์ถœ๋งˆ๋‹ค ์ „์ฒด ์ฃผ์†Œ๋ฅผ ์ ์–ด์•ผ ํ–ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ™˜๊ฒฝ๋ณ€์ˆ˜์™€ axios ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„๋“ค์„ ๊ด€๋ฆฌํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

 

1. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

๋จผ์ € ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ธํŒ…ํ•ด์คฌ๋‹ค. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง€๊ธˆ์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ’๋“ค์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ๊ณ , ์ด ์™ธ์—๋„ ์—ฌ๋Ÿฌ ์žฅ์ ์ด ์žˆ๋‹ค. ์˜คํ”ˆ ์†Œ์Šค์— ์˜ฌ๋ฆฌ๋ฉด ์•ˆ ๋˜๋Š” ๊ฐ’๋“ค์„ .envํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ณด์•ˆ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๊ณ , ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์‹ค์ œ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์„ค์ •๋„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ž‘์„ฑ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋จผ์ € ํ”„๋กœ์ ํŠธ์˜ ์ตœ์ƒ์œ„ ๋ฃจํŠธ์— .envํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.

 

.envํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

.env ํŒŒ์ผ ์•ˆ์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋ณ€์ˆ˜ ์ด๋ฆ„์€ REACT_APP_์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

REACT_APP_API_ORIGIN=https://mynote01.tistory.com
REACT_APP_API_DEFAULT_PREFIX=/api

๋‚˜์˜ ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ๋‹ค. REACT_APP_API_ORIGIN์— ์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ์„œ๋ฒ„์— ํ•ญ์ƒ /api๋ฅผ ์จ์„œ ์š”์ฒญํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— PREFIX๋„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

 

+) .gitignore์— .envํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ์•ผ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋Š”๋‹ค!

 

2. axios ์ธ์Šคํ„ด์Šค ๋งŒ๋“ค๊ธฐ

api ๊ณตํ†ตํ™”

API๋“ค์˜ ๊ณตํ†ต ์„ค์ •์„ ๋„ฃ๊ธฐ ์œ„ํ•ด axios ์ธ์Šคํ„ด์Šค๋ฅผ ์œ„์™€ ๊ฐ™์€ ์œ„์น˜์— ๋งŒ๋“ค์—ˆ๋‹ค.

 

serverapi.js

import axios from "axios";

const baseURL = process.env.REACT_APP_API_ORIGIN + process.env.REACT_APP_API_DEFAULT_PREFIX
const serverapi = axios.create();

serverapi.defaults.baseURL = baseURL

export default serverapi;

 

๋จผ์ € axios๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด import ํ•ด์ฃผ์—ˆ๋‹ค. (axios๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค! ์ด์ „ ํฌ์ŠคํŒ… ์ฐธ๊ณ )

 

baseURL์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•ด ๋‘” ์ฃผ์†Œ์— ์ง€์ •๋œ prefix๊ฐ€ ํ•ญ์ƒ ๋ถ™์„ ์ˆ˜ ์žˆ๋„๋ก ์ง€์ •ํ•ด ์ฃผ์—ˆ๊ณ  axios.create();๋ฅผ ์ด์šฉํ•ด์„œ axios ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด serverapi์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ์Šคํ„ด์Šค์˜ baseURL์„ ๋‚ด๊ฐ€ ๋งŒ๋“  baseURL๋กœ ์ง€์ •ํ•˜์˜€๋‹ค.

 

 

3. ์‚ฌ์šฉํ•˜๊ธฐ

Signup.js

  const isIdDuplicated = async () => {
    const api = `/dup_check/${uid}`;
    try {
      const res = await serverapi.get(api);
      if (res.status === 200) {
        return res.data.dup;
      }
    } catch (e) {
      console.log(e.response);
    }
  };

๋‹ฌ๋ผ์ง„ ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// api ๊ณตํ†ตํ™” ์ „
const api = `https://mynote01.tistory.com/api/dup_check/${uid}`;
axios.get(api);

// api ๊ณตํ†ตํ™” ํ›„
const api = `/dup_check/${uid}`;
sereverapi.get(api);