[React] ๐ŸนProxy ์‚ฌ์šฉ๋ฒ•

TATAยท2023๋…„ 4์›” 4์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
23/32

CORS : Cross-Origin Resource Sharing
๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ๋Š” ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•œ ์ถœ์ฒ˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์„ ํƒํ•œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ๋ธŒ๋ผ์šฐ์ €์— ์•Œ๋ ค์ฃผ๋Š” ์ฒด์ œ์ด๋‹ค.

โ–ท Proxy

์ •์„์ ์ธ ๊ณผ์ • ์—†์ด React๋‚˜ Webpack Dev Server์˜ proxy ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด CORS ์ •์ฑ…์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณ„๋„์˜ ์‘๋‹ต ํ—ค๋”๋ฅผ ๋ฐ›์„ ํ•„์š” ์—†์ด ๋ธŒ๋ผ์šฐ์ €๋Š” React ์•ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ , ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐฑ์—”๋“œ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์ง์ ‘ ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ , ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์—
ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์˜ ์ง์ ‘์ ์ธ ์—ฐ๊ฒฐ์„ ๋ง‰์•„ ๋ณด์•ˆ์ƒ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

proxy ์ ์šฉ ์ „ ํ๋ฆ„

proxy ์ ์šฉ ํ›„ ํ๋ฆ„

React ์•ฑ์—์„œ API๋ฅผ ์š”์ฒญํ•  ๋•Œ, proxy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ๋ฐ›์€ ์‘๋‹ต์„ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๋Œ€์‹  ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ถœ์ฒ˜๊ฐ€ ๊ฐ™์•„์ ธ์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ์‚ฌ์‹ค์„ ๋ชจ๋ฅด๊ณ  CORS ์ •์ฑ…์„ ์šฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.


โ–ท Proxy ์‚ฌ์šฉ๋ฒ•

๐Ÿน webpack dev server proxy ์‚ฌ์šฉ๋ฒ•

webpack dev server์—์„œ ์ œ๊ณตํ•˜๋Š” proxy ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์ฒญํ•˜๋Š” API ์š”์ฒญ์„ webpack dev server๊ฐ€ ๋ฐ›์•„ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๊ณ , ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ ์‘๋‹ตํ•œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ API ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๊ณ  webpack dev server๊ฐ€ ๋Œ€์‹  ์š”์ฒญ์„ ๋ณด๋‚ด์–ด, CORS ์ •์ฑ…์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

โ’ˆ CRA๋กœ ๋งŒ๋“  React๋Š” package.json์—์„œ "proxy"๊ฐ’์„ ์‰ฝ๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

/* package.json */
"browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
	"proxy" : "์šฐํšŒํ•  API ์ฃผ์†Œ" // proxy๋Š” ๋งจ ๋ฐ‘์— ์ž‘์„ฑ์„ ํ•ด ๊ธˆ๋ฐฉ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ
}

โ’‰ fetch๋‚˜ axios๋ฅผ ํ†ตํ•ด ์š”์ฒญํ•˜๋˜ ๋ถ€๋ถ„์—์„œ ๋„๋ฉ”์ธ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•œ๋‹ค.

/*
* export async function getAllfetch() {
*   const response = await fetch('์šฐํšŒํ•  api์ฃผ์†Œ/params');
*     .then(() => {
*   	 ...
* 	  })
* }
*/

/* fetch๋‚˜ axios๋ฅผ ํ†ตํ•ด ์š”์ฒญํ•˜๋˜ ๋ถ€๋ถ„์—์„œ ๋„๋ฉ”์ธ ๋ถ€๋ถ„์„ ์ œ๊ฑฐ */
export async function getAllfetch() {
  
  const response = await fetch('/params');
    .then(() => {
			...
    })
}

๐Ÿน React Proxy ์‚ฌ์šฉ๋ฒ•

webpack dev server์—์„œ ์ œ๊ณตํ•˜๋Š” proxy๋Š” ์ „์—ญ ์„ค์ •์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ธฐ๋„ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ˆ˜๋™์œผ๋กœ proxy๋ฅผ ์ ์šฉํ•ด ์ค˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” http-proxy-middleware ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

โ’ˆ ์„ค์น˜

// http-proxy-middleware ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
npm install http-proxy-middleware --save

โ’‰ createProxyMiddleware

/* setupProxy.js */
// createProxyMiddleware ๊ฐ€์ ธ์˜ค๊ธฐ
const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(
    "/api", // proxy๊ฐ€ ํ•„์š”ํ•œ path prameter๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
    createProxyMiddleware({
      target: "http://localhost:3080", // ํƒ€๊ฒŸ์ด ๋˜๋Š” api url๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
      changeOrigin: true, // ๋Œ€์ƒ ์„œ๋ฒ„ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ํ˜ธ์ŠคํŠธ ํ—ค๋”๊ฐ€ ๋ณ€๊ฒฝ๋˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
    })
  );
  app.use(
    "/api2",
    createProxyMiddleware({
      target: "http://localhost:3070",
      changeOrigin: true,
    })
  );
  
  /*
  * ์ด๋ ‡๊ฒŒ ํ•œ ๋ฒˆ์— ๋ฌถ์–ด์„œ ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅ
  * app.use(
  *   ["/api", "/api2"],
  *   createProxyMiddleware({
  *     target: "http://localhost:3080",
  *     changeOrigin: true,
  *     router: {
  *       "/api2": "http://localhost:3070",
  *     },
  *   })
  * );
  */
};

โ’Š fetch๋‚˜ axios๋ฅผ ํ†ตํ•ด ์š”์ฒญํ•˜๋˜ ๋ถ€๋ถ„์—์„œ ๋„๋ฉ”์ธ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•œ๋‹ค.

export async function getAllBook() {
  
    const response = await fetch('/api/book');
      .then(() => {
			...
	})
}
            
export async function getAllTodos() {
  
    const response = await fetch('/api2/todos');
      .then(() => {
			...
	})
}
profile
๐Ÿพ

0๊ฐœ์˜ ๋Œ“๊ธ€