๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก API๋ฅผ ์์ฒญ ํ ๋, ๋ธ๋ผ์ฐ์ ์ ํ์ฌ ์ฃผ์์ API ์ ์ฃผ์์ ๋๋ฉ์ธ์ด ์ผ์นํด์ผ๋ง ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผ ํ ์ ์๋ค.
๋ง์ฝ ๋ค๋ฅธ ๋๋ฉ์ธ์์ API๋ฅผ ์์ฒญํด์ ์ฌ์ฉ ํ ์ ์๊ฒ ํด์ฃผ๋ ค๋ฉด CORS ์ค์ ์ด ํ์ํ๋ค.
โญ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing, CORS)
์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ ์ด๋ค.
์ถ์ฒ๋ ํ๋กํ ์ฝ, ํธ์คํธ(๋๋ฉ์ธ), ํฌํธ๋ฒํธ๋ก ์ ์๋๋ฉฐ, ๋ชจ๋ ์ผ์น ํ๋ ๊ฒฝ์ฐ ๋์ผํ ์ถ์ฒ๋ฅผ ๊ฐ์ก๋ค๊ณ ๋งํ๋ค.
๋ผ์ด๋ธ ๋ฐ์ดํฐ(์ค์ ์๋น์ค ๋๊ณ ์๋ ์ฑ์ DB์ ์ ์ฌ๋๊ณ ์๋ ๋ฐ์ดํฐ)์ ๊ฐ์ด ๋ฏผ๊ฐ์ฑ์ด ๋์ ๋ฐ์ดํฐ๋ค์ ๋ณด์์ด ๋งค์ฐ ์ค์ํ๋ฐ, ์๋น์ค๊ฐ ๋ชจ๋ ์ถ์ฒ์ ์ ๊ทผ์ ํ๋ฝํ๋ค๋ฉด ๋ณด์์ฑ์ ๋ฎ์์ง๊ณ , ํดํน ์ํ์ฑ์ด ๋์์ง๋ค.
๋ฐ๋ผ์, ํน์ ๋๋ฉ์ธ์ ํ์ฉํ๋๋ก ๊ตฌํํด์ผํ๋ค.
์ด๋, ์ ์์ ์ผ๋ก CORS ์ ์ฑ ์๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ์์ฒญ์ ๋ํด ์ ์ ํ ์๋ต ํค๋๋ฅผ ์ ๋ฌํด์ผํ๋ค.
์ฆ, ์๋ฒ์์ ์ ์ ํ ์๋ต ํค๋๋ฅผ ๋ฐ์ง ๋ชปํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.(CORS Error)
์์ ๊ฐ์ ์ ์์ ์ธ ๋ฐฉ๋ฒ์ด ์๋, React ๋ผ์ด๋ธ๋ฌ๋ฆฌ or Webpack Dev Server์์ ์ ๊ณตํ๋ proxy ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ CORS ์ ์ฑ ์ ์ฐํํ ์ ์๋ค.
๋ณ๋์ ์๋ต ํค๋๋ฅผ ๋ฐ์ ํ์์์ด ๋ธ๋ผ์ฐ์ ๊ฐ React ์ฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ , React ์ฑ์์ proxy๋ฅผ ํตํด ํด๋น ์์ฒญ์ ๋ฐฑ์๋๋ก ์ ๋ฌ(์ฐํ ์์ฒญ)ํ๋ฉด ์๋ฒ๋ ์๋ต์ proxy๋ฅผ ํตํด React ์ฑ์ผ๋ก ์ ๋ฌํ๋ค.(์ฐํ ์๋ต)
์ด ํ, React ์ฑ์ด ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์๋ฒ ๋์ ๋ธ๋ผ์ฐ์ ๋ก ์ฌ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ถ์ฒ๊ฐ ๊ฐ์์ง๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ๋ cors ์ ์ฑ
์ ์๋ฐํ์ง ๋ชจ๋ฅด๊ฒ ๋๋ค.(๋ธ๋ผ์ฐ์ ๋ฅผ proxy ๊ธฐ๋ฅ์ ํตํด ์์ด๋ ๊ฒ)
Webpack dev server์ proxy ์ฌ์ฉ ์, ๋ธ๋ผ์ฐ์ API๋ฅผ ์์ฒญํ ๋ ๋ฐฑ์๋ ์๋ฒ์ ์ง์ ์ ์ผ๋ก ์์ฒญ์ ํ์ง ์๊ณ , ํ์ฌ ๊ฐ๋ฐ์๋ฒ์ ์ฃผ์๋ก ์ฐํ ์์ฒญํ๋ค.
์ดํ, Webpack dev server์์ ํด๋น ์์ฒญ์ ๋ฐ์ ๋ฐฑ์๋ ์๋ฒ๋ก ์ ๋ฌ ํ๊ณ , ๋ฐฑ์๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ๋ธ๋ผ์ฐ์ ๋ก ๋ฐํํ๋ค.
Create React App์ ํตํด ์์ฑํ React ํ๋ก์ ํธ์์ Webpack dev server์ proxy๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด, 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 ์ฃผ์" // ๋ณดํต ๋งจ ๋ฐ์ ์์ฑํ์ฌ ๊ธ๋ฐฉ ์ฐพ์ ์ ์๋๋ก ํ๋ค.
}
์ดํ, ์๋์ ๊ฐ์ด ๊ธฐ์กด์ fetch ๋๋ axios๋ฅผ ํตํด ์์ฒญํ๋ ์ฝ๋์์ ๋๋ฉ์ธ ๋ถ๋ถ์ ์ ๊ฑฐํ๋ค.
// ์ ๊ฑฐ ์
export async function getAllfetch() {
const response = await fetch('์ฐํํ api์ฃผ์/params');
.then(() => {
...
})
}
// ์ ๊ฑฐ ํ
export async function getAllfetch() {
const response = await fetch('/params');
.then(() => {
...
})
}
Webpack dev server proxy๊ฐ ์ถฉ๋ถํ ์ ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ, http-proxy-middleware ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์๋์ ์ผ๋ก proxy๋ฅผ ์ ์ฉํ๋ค.
npm install http-proxy-middleware --save
๋ช
๋ น์ด๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ณ ,
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, //๋์ ์๋ฒ ๊ตฌ์ฑ์ ๋ฐ๋ผ ํธ์คํธ ํค๋๊ฐ ๋ณ๊ฒฝ๋๋๋ก ์ค์ ํ๋ ๋ถ๋ถ
})
);
};
์ดํ, webpack dev server proxy ์ฌ์ฉํ ๋์ ๋ง์ฐฌ ๊ฐ์ง๋ก, ๊ธฐ์กด์ fetch ๋๋ axios๋ฅผ ํตํด ์์ฒญํ๋ ์ฝ๋์์ ๋๋ฉ์ธ ๋ถ๋ถ์ ์ ๊ฑฐํ๋ค.
Reference: ์ฝ๋์คํ ์ด์ธ