- 먼저 api/driving.ts 파일을 만들어 API를 분리한다.
(참고: start와 goal parameter를 입력값으로 하면, 네이버 길찾기 API를 이용하여 출발지와 목적지에 대한 paths(좌표들의 배열)를 return 하는 로직이다.)
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from 'next';
import { Coordinates } from '../../types/map';
type Data = {
paths: Coordinates[];
};
export default async function handler(req: NextApiRequest, res: NextApiResponse<Data>) {
const { start, goal } = req.query;
let paths = [];
try {
const response = await fetch(
`https://naveropenapi.apigw.ntruss.com/map-direction/v1/driving?start=${start}&goal=${goal}`,
{
headers: {
'X-NCP-APIGW-API-KEY-ID': process.env.NEXT_NCP_CLIENT_ID,
'X-NCP-APIGW-API-KEY': process.env.NEXT_NCP_CLIENT_SECRET,
},
},
);
paths = (await response.json()).route.traoptimal[0].path.map((path: Coordinates) => path.reverse());
} catch (e) {
paths = [];
}
res.status(200).json({ paths });
}
위의 로직을 next.js client code에서 호출하는 코드는 아래와 같을 것이다.
(driving.ts 파일이 api 폴더 아래에 있으므로 '/api/driving'이 end point가 된다.
const response = await fetch(`/api/driving?start=${start}&goal=${goal}`);
- 하지만 클라이언트 코드를 실행해보면, CORS 에러가 발생하며 응답값이 제대로 내려오지 않는 것을 확인할 수 있다.
이 에러를 피하기 위해 naver api URL에 직접 요청을 날리지 않고, next에서 지원해주는 proxy를 이용하여 우회해야한다.
next.config.js에서 'rewrites'를 이용하여 api 요청을 우회한다.
/** @type {import('next').NextConfig} */
module.exports = {
...
async rewrites() {
return [
{
destination: 'https://naveropenapi.apigw.ntruss.com/:path*',
source: '/example/:path*',
},
];
},
};
- api/driving.ts의 fetch url을 proxy 주소로 변경한다.
const response = await fetch(
`${process.env.NEXT_PUBLIC_URL}/example/map-direction/v1/driving?start=${start}&goal=${goal}`,
{
headers: {
'X-NCP-APIGW-API-KEY-ID': process.env.NEXT_NCP_CLIENT_ID,
'X-NCP-APIGW-API-KEY': process.env.NEXT_NCP_CLIENT_SECRET,
},
},
위 코드의 'NEXT_PUBLIC_URL' 환경 변수 값에는 사이트의 URL을 적으면 된다.
- 이제 클라이언트 코드를 실행해도 CORS 에러가 발생하지 않는다!