๐Proxy ๋ฅผ ์ฐ๋ ์ด์
๋ฆฌ์กํธ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์ด์ด์ ์ฝ๋์ ์์ ์ฌํญ์ ๊ฐ์งํ๊ณ ๋ฐ๋ก๋ฐ๋ก ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋งํด์ค๋ค.
์ด๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์๋ฒ์ ๋ฐฑ์๋ ์๋ฒ์ ์ถ์ฒ(origin)์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ CORS์ ์ฑ ์ ์๋ฐฐ๋์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค์ง ๋ชปํ๊ฒ๋๋ค.
CORS: ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing, CORS)๋ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์
๋ฐฑ์๋ ๊ฐ๋ฐ์์๊ฒ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์๋ฒ์ ๋๋ฉ์ธ์ ํ์ฉํด๋ฌ๋ผ๊ณ ์์ฒญํ๊ณ ๋ฐฑ์๋์์ CORS ์ค์ ์ ํด์ฃผ์ด ์๋ตํค๋๋ฅผ ์ ๋ฌ ๋ฐ๋ ๊ฒ์ด ์ ์์ ์ธ ํด๊ฒฐ๋ฐฉ๋ฒ์ด์ง๋ง Proxy๋ฅผ ์ค์ ํ๋ฉด CORS ์ ์ฑ ์ ์ฐํํด์ ํต์ ์ ํ ์๊ฐ ์๋ค.
๐Proxy
Proxy๋ฅผ ์ค์ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ React ์ฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ , ํด๋น ์์ฒญ์ ์ง์ ๋ฐฑ์๋๋ก ์ ๋ฌํ๊ฒ ๋๋ค. ์ฌ๊ธฐ์ React ์ฑ์ด ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ฐ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ CORS ์ ์ฑ ์ ์๋ฐํ์ง ๋ชจ๋ฅธ๋ค. ๋ธ๋ผ์ฐ์ ๋ฅผ proxy ๊ธฐ๋ฅ์ ํตํด ์์ด๋ ๊ฒ์ด๋ค.
๐Proxy๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
React ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํน์ Webpack Dev Server์์ ์ ๊ณตํ๋ proxy ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
webpack dev server proxy
์นํฉ ๊ฐ๋ฐ์๋ฒ์ proxy ์ค์ ์ ์๋ ์นํฉ ์ค์ ์ ํตํด์ ์ ์ฉ์ ํ์ง๋ง, CRA ๋ฅผ ํตํด ๋ง๋ ๋ฆฌ์กํธ ํ๋ก์ ํธ์์๋ ๊ฐ๋จํ package.json ์์ "proxy" ๊ฐ์ ์ค์ ํ์ฌ ์ ์ฉํ ์ ์๋๋ก ๊ตฌ์ฑ์ด ๋์ด ์๋ค.
...
"proxy" : "์ฐํํ API ์ฃผ์"
}
๊ธฐ์กด์ fetch ํตํด ์์ฒญํ๋ ๋ถ๋ถ์์ ๋๋ฉ์ธ ๋ถ๋ถ์ ์ ๊ฑฐํ๋ค.
export async function getAllfetch() {
const response = await fetch('์ฐํํ api์ฃผ์/params');
.then(() => {
...
})
}
export async function getAllfetch() {
const response = await fetch('/params');
.then(() => {
...
})
}
React ๋ผ์ด๋ธ๋ฌ๋ฆฌ
webpack dev server ์์ ์ ๊ณตํ๋ proxy๋ ์ ์ญ์ ์ธ ์ค์ ์ด๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ๋๋ฉ์ธ์์ ์๋ต์ ๋ฐ์์์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ถฉ๋ถํ์ง ์๋ค. ์ด๋๋ http-proxy-middleware ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
npm install http-proxy-middleware --save
React App์ src ํ์ผ ์์์ setupProxy.js ํ์ผ์ ์์ฑ
const { createProxyMiddleware } = require("http-proxy-middleware");
module.exports = function (app) {
app.use(
createProxyMiddleware("/api", { //proxy๊ฐ ํ์ํ path prameter๋ฅผ ์
๋ ฅ
target: "http://localhost:3080", //ํ๊ฒ์ด ๋๋ api url๋ฅผ ์
๋ ฅ
changeOrigin: true, //๋์ ์๋ฒ ๊ตฌ์ฑ์ ๋ฐ๋ผ ํธ์คํธ ํค๋๊ฐ ๋ณ๊ฒฝ๋๋๋ก ์ค์ ํ๋ ๋ถ๋ถ
})
);
app.use(
createProxyMiddleware("/api2", {
target: "http://localhost:3070",
changeOrigin: true,
})
);
};
fetch ์์ฒญ ์ฝ๋๋ webpack dev server proxy์ ๋์ผํ๋ค.