ํ๋ก์ ํธ์์ ๋ ์จ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ ํ์ํด์ฃผ๊ธฐ ์ํด openWeathermap์ api๋ฅผ ์ฌ์ฉํ์๋ค.
๋ฐ์ดํฐ๊ฐ ์ ๋ถ๋ฌ์์ง๊ธธ ๋ฐ๋ผ๋ฉฐ Run ํด๋ณด์์ง๋ง.. CORS ์๋ฌ๊ฐ ๋ฑ์ฅ๐
์ผ๋จ CORS๊ฐ ๋ญ์ง๋ฅผ ์์์ผ ํด๊ฒฐํ ์ ์์๊ฑฐ ๊ฐ์ ์ฐพ์๋ณด์๋ค.
CORS๋ Cross Origin Resource Sharing์ ์ฝ์์ธ๋ฐ ํ๊ตญ์ด๋ก ๋ฐ๊ฟ ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ์ ์ฑ
์ด๋ค. ์ฆ, ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ๊ฐ์ ์์์ ๊ณต์ ๋ฅผ ์๋ฏธํ๋ค.
์น ์ดํ๋ฆฌ์ผ์ด์
์์ ๋ค๋ฅธ ๋๋ฉ์ธ์ ๋ฆฌ์์ค์ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ ๋ณด์ ์ด์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ์ค ๋ฐฉ๋ฒ์ด๊ณ ๋ณด์์ ์ธ ๋ฌธ์ ๋ก ๊ฐ์ ์ถ์ฒ(์ฃผ์)๋ฅผ ๊ฐ์ง ์ ๋ค๋ผ๋ฆฌ๋ง ๋ฆฌ์์ค๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ SOP(Same Origin Policy / ๋์ผ ์ถ์ฒ ์ ์ฑ
)๋ผ๋ ์ ์ฑ
์ ์ฐํํ๊ธฐ ์ํ ์ ์ฑ
์ด๋ผ๊ณ ํ ์ ์๋ค.
๋์ผ ์ถ์ฒ ์ ์ฑ
์ ๋ง ๊ทธ๋๋ก ๋์ผํ ์ถ์ฒ์ ๋ฆฌ์์ค์๋ง ์ ๊ทผํ๋๋ก ์ ํํ๋ ์ ์ฑ
์ ๋งํ๋ค.
์ฌ๊ธฐ์ ๋งํ๋ ์ถ์ฒ๋ผ๋๊ฒ์ ํ๋กํ ์ฝ, ํธ์คํธ๋ช
, ํฌํธ๊ฐ ๊ฐ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋์ผ ์ถ์ฒ ์ ์ฑ
์ ๊ฒฝ์ฐ์ ๋ธ๋ผ์ฐ์ ์์ ์๋์ผ๋ก ์ฟ ํค๊ฐ ์ฒจ๋ถ๋๋ค๋ ํน์ง์์ ํด๋น ๋ถ๋ถ์ด ๋ณด์์์ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์๊ฒ ๋ค๋ ์ด์๋ก ์๊ฒจ๋๊ฒ ๋์๊ณ ์ด๋ ๊ฒ ๋ฑ์ฅํ๊ฒ ๋ ๋์ผ ์ถ์ฒ ์ ์ฑ
์ผ๋ก ์ธํด CORS๊ฐ ๋ฐ์ํ๊ฒ ๋ ๊ฒ์ด๋ค.
CORS ์๋ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ํด๋ผ์ด์ธํธ์์ ํด๊ฒฐ, ์๋ฒ์์ ํด๊ฒฐ์ด ์์ง๋ง ์ด๋ฒ ํ๋ก์ ํธ ๋์ ์๋ฒ์์ ํด๊ฒฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊ธฐ์ ๋จผ์ ํด๋ผ์ด์ธํธ ์ธก์์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ ์ด๋ณด๊ณ ์ ํ๋ค.
1. ์ค์น
npm install http-proxy-middleware --save
2. setupProxy.js ์ธํ
// src/setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function (app) {
app.use(
createProxyMiddleware('/api', {
target: 'https://api.openweathermap.org',
changeOrigin: true,
})
);
};
3. App.js์์ api ํธ์ถ
// src/App.js
useEffect(() => {
async function fetchdata() {
const { data } = await axios.get('/api');
console.log(data);
}
fetchdata();
}, []);
4. package.json์ ํ๋ก์ ์ถ๊ฐํด์ฃผ๊ธฐ
package.json ํ์ผ์
"proxy": "https://api.openweathermap.org"
์ด ํ์ค์ ์ถ๊ฐํ๋๋ ๋ก์ปฌ์์๋ ์ ์์๋ํ๋ ๊ฒ์ ํ์ธํ๋ค.
ํ์ง๋ง ๋ฐฐํฌ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๊ธฐ์ ๋ก์ปฌ์์์ CORS ์ฐํ๋ง์ผ๋ก๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค๊ณ ๋ณผ ์ ์์๋ค.
๊ฒฐ๊ตญ ๋ฐฐํฌ๋ ์ฌ์ดํธ์ CORS ์ฐํ ๋ฐฉ๋ฒ๋ ์ถ๊ฐ๋ก ์์์ผ ํ๋ค. ๊ทธ ๋ด์ฉ์ ์๋์ ๊ฐ๋ค.
ํ๋ก์ ํธ ๋ฐฐํฌ๋ฅผ Netlify๋ฅผ ํตํด ๋ฐฐํฌํ๊ธฐ ๋๋ฌธ์, Netlify ํ๋ก์ ์๋ฒ ์ธํ ๋ฐฉ๋ฒ์ ์๋ํด๋ณด์๋ค.
1. ๋ฃจํธ์ netlify.toml ํ์ผ ์์ฑ
netlify.toml์ ํ๋ง๋๋ก netlify ์ค์ ํ์ผ์ด๋ค. ์ฌ๊ธฐ์ ๋ฆฌ๋ค์ด๋ ํธ ์ค์ ์ ํด์ฃผ์.
[[redirects]]
from = "/api/*"
to = "https://api.openweathermap.org/:splat"
status = 200
force = true
headers = {X-From = "Netlify"}
2. api ์ค์
const PROXY = window.location.hostname === 'localhost' ? '' : '/api';
export const getWeatherData = async (lat, lon) => {
try {
const response = await fetch(
`${PROXY}/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${process.env.REACT_APP_WEATHER_API_KEY}&units=metric`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
},
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const weatherData = await response.json();
return weatherData;
} catch (error) {
return `Error: ${error.message}`;
}
};
๋ก์ปฌ์์๋ localhost๊ฐ ๋ถ๊ณ , ๋ฐฐํฌ๋ ์ฌ์ดํธ์์๋ ๋ฆฌ๋ค์ด๋ ํธ๋๊ฒ ์ค์ ์ ํด์ฃผ์์ง๋ง ์ ๋์ง ์์๋ค..
lat, lon, api key๋ชจ๋ ์ ์์ ์ผ๋ก url์ ์ถ๊ฐ๋๋ ๊ฒ๋ ํ์ธํ๋๋ฐ ๋ญ๊ฐ ๋ฌธ์ ์์๊น..?
์ด๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ธ์ง ๊ณ ๋ฏผํด๋ณด์์ง๋ง ํ๋ก์ ํธ ๋ง๊ฐ ๊ธฐํ์ด ๋ค๊ฐ์์ ์ผ๋จ ๋ค์ ๋ฐฉ๋ฒ์ผ๋ก ๋์ด๊ฐ๋ค. ๋ฌธ์ ์ ์ด ๋ญ์ง ๋ฆฌํฉํ ๋ง ์ ์ฐพ์๋ณด๊ณ ์ ๋ฆฌํด์ผ๊ฒ ๋ค.
์์ฒญํด์ผ ํ๋ URL ์์ ํ๋ก์ ์๋ฒ URL ์ ๋ถ์ฌ ์์ฒญํ๊ฒ ๋๋ฉด ํด๊ฒฐํ ์ ์๋ค.
๊ตฌ๊ธ์ ๊ฒ์ํด๋ณด๋ฉด ๋์ค๋ ํ๋ก์ ์๋ฒ๋ ๋ช๊ฐ์ง๊ฐ ์๋ค.
์ด ์๋ฒ๋ฅผ API ์์ฒญ์ ์์ ๋๋ฉด CORS ๋ฌธ์ ๋ฅผ ์ฐํํ ์ ์๋ค. ์ฌ์ฉ๋ฒ์ ๊ต์ฅํ ๊ฐ๋จํ๋ค.
API ์์ฒญ ์ฃผ์ ์์ ํด๋นํ๋ ์๋ฒ ์ฃผ์๋ฅผ ๋ถ์ด๋ฉด ๋๋ค.
export const getWeatherData = async (lat, lon) => {
try {
const response = await fetch(
'https://corsproxy.io/?' + // ์ด๋ ๊ฒ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
encodeURIComponent(
`https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${process.env.REACT_APP_WEATHER_API_KEY}&units=metric`,
),
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
},
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const weatherData = await response.json();
return weatherData;
} catch (error) {
return `Error: ${error.message}`;
}
};
์ด๋ฐ์์ผ๋ก ์์ฑํด์ฃผ๋ฉด ์ ์๋ํ๋ค!!
์ผ๋จ ์ด ๋ฐฉ๋ฒ์ผ๋ก ์์๋ก ํด๊ฒฐํ์์ง๋ง, ์ ๋ฐฉ๋ฒ๋ค์ ์ฐพ์๋ณด๊ณ ๋ ์ ์ฉํ์ง ๋ชปํด ๋ค์ ์ ๋ฆฌํด๋ณด๋ ์๊ฐ์ด ํ์ํ ๋ฏ ํ๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ง์ง๋ง ๊ทธ ๋ฐฉ๋ฒ๋๋ก ์ ์ฉํด๋ณด์๋ ์๋๊ธฐ๋ ํด์ ๋งค์ฐ ๋นํฉ์ค๋ฌ์ ๋ CORS ์๋ค..
์ด์ ์ ๋ฉํ ๋์ด ์ค๋ช
ํด์ฃผ์ ์ ์ด ์์ง๋ง, ์์งํ ๋ง๋ก๋ง ๋ค์ด์๋ ์ ์ฒด๊ฐ๋ ์ดํด๋ ์๋์๋ค.
๊ทผ๋ฐ ์ด๋ ๊ฒ ์ง์ ๋ถ๋ชํ๋ณด๋ ์ด๋์ด ์ ๊ฐ๋ฐ์๋ค์ ๋จธ๋ฆฌ๋ฅผ ๋ถ์ฌ์ก๊ฒ ๋ง๋๋ ์๋ฌ์ธ์ง ์ ๊ฒ ๊ฐ์๋ค.๐
ํ์ง๋ง ์ด ๊ธฐํ์ CORS๋ ์ข ๊ฐ๊น์์ง ๊ฒ ๊ฐ์ผ๋ ์์ผ๋ก๋ ๊ฐ์ ์ํฉ์์ ํด๊ฒฐ๋ฐฉ๋ฒ๋ค์ ์ถ๋ ค๋ด๋ฉฐ ๋์ํ ์ ์์ ๊ฒ์ด๋ค.