처음부터 부딪힌 CORS 에러
버스노선정보나, 실시간 위치나 모든 데이터를 리액트쿼리로 관리하려고 한다.
그래서 아래와 같이 코드를 작성하고 일단 버스노선정보부터 API호출을 해봤다.
import { useQuery } from '@tanstack/react-query';
import axios from 'axios';
export const useGetBusInfo = () => {
const { data, isLoading, error, refetch } = useQuery(
['businfo'],
async () => {
return await axios
.get(
`https://cors-anywhere.herokuapp.com/http://apis.data.go.kr/6410000/busrouteservice/getBusRouteList?serviceKey=${process.env.BUS_DATA_API_KEY}&keyword=6004&origin=http://localhost:3000`,
)
.then((res) => {
return res.data;
})
.catch((error) => {
console.error(error);
});
},
{
staleTime: Infinity,
// refetchInterval: 60 * 1000,
},
);
return { data, isLoading, error, refetch };
};
하지만 포스트맨에서 호출했던 것과는 달리 CORS에러가 발생했다.
서버리스 상태로 프론트에서만 서비스를 만들려다보니 도메인이 맞지 않기 때문에 발생한 것 같다.
CORS에 대한 내용은 아래 포스팅을 참조하자.
CORS는 왜 이렇게 우리를 힘들게 하는걸까?
이번 포스팅에서는 웹 개발자라면 한번쯤은 얻어맞아 봤을 법한 정책에 대한 이야기를 해보려고 한다. 사실 웹 개발을 하다보면 CORS 정책 위반으로 인해 에러가 발생하는 상황은 굉장히 흔해서
evan-moon.github.io
해결할 수 있는 법은 여러가지가 있었지만, 나는 백엔드 서버를 구축해서 시간표도 DB에 저장할 예정이라 백엔드에서 API호출을 통해 CORS에러를 해결하는 법을 택했다.
Express 서버 구축
[Node] 🍃 MongoDB와 Express를 이용한 간단한 서버 오픈
MongoDB 설정 회원가입 후 새로운 프로젝트 생성 New Project를 클릭 프로젝트명을 입력 후 Next를 클릭 Create Project 클릭하여 프로젝트 생성 클러스터 생성 Build a Database 클릭 DB의 무료요금제(M0)선택 후
kyledev.tistory.com
Node환경에서 Express와 MongoDB를 통해 간단한 서버를 구축하고 보안과는 크게 관련 없는 서비스라 origin을 모두 열어놨다.
app.use(
cors({
origin: true,
credentials: true,
}),
);
그 후, 서버에서 다시 axios를 사용해 공공데이터 API를 호출해봤다.
axios
.get(
`http://apis.data.go.kr/6410000/busrouteservice/getBusRouteList?serviceKey=${process.env.BUS_DATA_API_KEY}&keyword=6004`,
)
.then((res) => {
console.log(res.data);
})
.catch((error) => {
console.error(error);
});
문제 없이 잘 호출 됐다!
서비스 개발하면서 사용 가능한 일일 트래픽이 정해져있니 신경 써서 개발해야겠다.