Proxy

1. CORS ์ •์ฑ…์ด ํ•„์š”ํ•œ ์ด์œ 

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ API๋ฅผ ์š”์ฒญํ•  ๋•Œ์—, ๋ธŒ๋ผ์šฐ์ €์˜ ํ˜„์žฌ ์ฃผ์†Œ์™€ API์˜ ์ฃผ์†Œ์˜ ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•ด์•ผ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์žˆ์Œ

  • ๊ตฌ์ถ•ํ•œ ํด๋ผ์ด์–ธํŠธ ๋’ค์˜ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋œ DB์—๋Š” live data๋Š” ๋ฏผ๊ฐ์„ฑ์ด ๋†’์€ ๋ฐ์ดํ„ฐ๋“ค์ด ์œ„์ฃผ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์ด ๋ฌด์—‡๋ณด๋‹ค ์ค‘์š”

  • ๋งŒ์•ฝ ์„œ๋น„์Šค๊ฐ€ ๋ชจ๋“  ์ถœ์ฒ˜์˜ ์ ‘๊ทผ์„ ํ—ˆ๋ฝํ•œ๋‹ค๋ฉด ํ•ดํ‚น์˜ ์œ„ํ—˜์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๊ธฐ์— ๋ชจ๋“  ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๊ณ , ํŠน์ • ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•จ.

  • ๋”ฐ๋ผ์„œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญ์„ ํ•ด์•ผ ํ•˜๊ณ ,

  • ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋Š” ์‘๋‹ต ํ—ค๋”์— ํ•„์š”ํ•œ ๊ฐ’๋“ค์„ ๋‹ด์•„์„œ ์ „๋‹ฌ์„ ํ•ด์ค˜์•ผ ํ•จ.

  • ์„œ๋ฒ„์—์„œ ์ ์ ˆํ•œ ์‘๋‹ต ํ—ค๋”๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ

2. Proxy

  • ์œ„์˜ ์ •์„์ ์ธ ๊ณผ์ • ์—†์ด React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ˜น์€ Webpack Dev Server์—์„œ ์ œ๊ณตํ•˜๋Š” proxy ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด CORS ์ •์ฑ… ์šฐํšŒ ๊ฐ€๋Šฅ

  • ์ฆ‰, ๋ณ„๋„์˜ ์‘๋‹ต ํ—ค๋”๋ฅผ ๋ฐ›์„ ํ•„์š” ์—†์ด ๋ธŒ๋ผ์šฐ์ €๋Š” React ์•ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ , ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐฑ์—”๋“œ๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ.

  • ์—ฌ๊ธฐ์„œ React ์•ฑ์ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „๋‹ฌํ•˜๊ธฐ์—, ๋ธŒ๋ผ์šฐ์ €๋Š” CORS ์ •์ฑ…์„ ์œ„๋ฐ˜ํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒŒ ๋จ.

  • ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €๋ฅผ proxy ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์†์ด๋Š” ๊ฒƒ.

3. Proxy ์ž‘๋™ ํ๋ฆ„

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

  1. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๊ฐœ๋ฐœํ•œ React ์•ฑ์—์„œ ๋ธŒ๋ผ์šฐ์ € ์ชฝ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ„

  2. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐฑ์—”๋“œ, ์ฆ‰ ์„œ๋ฒ„ ์ชฝ์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•จ. ์ด๋•Œ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€, ์ฆ‰ ์ถœ์ฒ˜๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•˜๋Š”๋ฐ ์ด๋•Œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ์ •์ƒ์ ์œผ๋กœ 200 OK ์‘๋‹ต์„ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ณด๋ƒ„.

  3. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐ›์€ ๋ฆฌ์†Œ์Šค ๋ฐ ์‘๋‹ต๊ณผ ํ•จ๊ป˜ ์ถœ์ฒ˜๊ฐ€ ๊ฐ™์€์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ์‘๋‹ต์„ ํŒŒ๊ธฐ(CORS Error) ํ•˜๊ณ , ์ถœ์ฒ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์‘๋‹ต์„ ํŒŒ๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋‹ค์‹œ ํ”„๋ก ํŠธ์—”๋“œ ์ชฝ์œผ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ์ž„.

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

  1. React ์•ฑ์—์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด API๋ฅผ ์š”์ฒญํ•  ๋•Œ, proxy๋ฅผ ํ†ตํ•ด ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์šฐํšŒํ•˜์—ฌ ๋ณด๋ƒ„

  2. ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ์‘๋‹ต์„ React ์•ฑ์œผ๋กœ ๋ณด๋‚ด๊ณ , React ์•ฑ์€ ๋ฐ›์€ ์‘๋‹ต์„ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๋Œ€์‹  ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ „๋‹ฌํ•จ.

  3. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ถœ์ฒ˜๊ฐ€ ๊ฐ™์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ์‚ฌ์‹ค์„ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•˜๊ณ  ํ—ˆ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

4. Proxy ์‚ฌ์šฉ๋ฒ•

webpack dev server proxy

  1. ์›นํŒฉ ๊ฐœ๋ฐœ์„œ๋ฒ„์˜ proxy ์„ค์ •์€ ์›๋ž˜ ์›นํŒฉ ์„ค์ •์„ ํ†ตํ•ด์„œ ์ ์šฉํ•˜์ง€๋งŒ, CRA๋ฅผ ํ†ตํ•ด ๋งŒ๋“  ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” package.json ์—์„œ "proxy" ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋จ

  ...
  "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๋Š” ๋ณดํ†ต ๋งจ ๋ฐ‘์— ์ž‘์„ฑํ•ด ๊ธˆ๋ฐฉ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•จ
  }
  1. ๊ธฐ์กด์˜ fetch, ํ˜น์€ axios๋ฅผ ํ†ตํ•ด ์š”์ฒญํ•˜๋˜ ๋ถ€๋ถ„์—์„œ ๋„๋ฉ”์ธ ๋ถ€๋ถ„์„ ์ œ๊ฑฐ

  export async function getAllfetch() {

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

  export async function getAllfetch() {

      const response = await fetch('/params');
      .then(() => {
              ...
          })
  }

React Proxy ์‚ฌ์šฉ๋ฒ•

  • webpack dev server์—์„œ ์ œ๊ณตํ•˜๋Š” proxy๋Š” ์ „์—ญ์ ์ธ ์„ค์ •์ด๊ธฐ์—, ์ข…์ข… ํ•ด๋‹น ๋ฐฉ๋ฒ•์ด ์ถฉ๋ถ„ํžˆ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ธฐ๋„ ํ•จ.

  • ๊ทธ๋ž˜์„œ ์ˆ˜๋™์œผ๋กœ proxy๋ฅผ ์ ์šฉํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋•Œ๋Š” http-proxy-middleware ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ

  1. http-proxy-middleware ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

     npm install http-proxy-middleware --save
  2. React App์˜ src ํŒŒ์ผ ์•ˆ์—์„œ setupProxy.js ํŒŒ์ผ ์ƒ์„ฑ ํ›„, ์•ˆ์—์„œ ์„ค์น˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜จ ๋‹ค์Œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑ

     const { createProxyMiddleware } = require('http-proxy-middleware');
    
     module.exports = function(app) {
     app.use(
         '/api', // proxy๊ฐ€ ํ•„์š”ํ•œ path prameter๋ฅผ ์ž…๋ ฅ
         createProxyMiddleware({
         target: 'http://localhost:5000', // ํƒ€๊ฒŸ์ด ๋˜๋Š” api url๋ฅผ ์ž…๋ ฅ
         changeOrigin: true, // ๋Œ€์ƒ ์„œ๋ฒ„ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ํ˜ธ์ŠคํŠธ ํ—ค๋”๊ฐ€ ๋ณ€๊ฒฝ๋˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„
         })
     );
     };
  3. ๊ธฐ์กด์˜ fetch, ํ˜น์€ axios๋ฅผ ํ†ตํ•ด ์š”์ฒญํ•˜๋˜ ๋ถ€๋ถ„์—์„œ ๋„๋ฉ”์ธ ๋ถ€๋ถ„์„ ์ œ๊ฑฐ

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

Last updated