최근에 프로젝트를 하면서 "이런 게 있구나" 수준으로 알고만 있던 Next.js의 rewrite와 redirect 중에 rewrite 기능을 실제로 프로젝트에 적용시켜 보았는데, 이 참에 확실하게 정리도 해보면 좋을 것 같다는 생각이 들어서 이렇게 블로그로 작성해보았다.
각각에 대한 사용법을 알아보기 전에, 간단하게 공통점과 차이점부터 알아보자.
공통점은 정말 단순하다. rewrite, redirect 두 가지 기능 모두 유저가 특정 path로 이동했을 때 정해진 화면이 보이도록 해준다. 한마디로 둘 다 경로에 따라 어떤 페이지를 보여줄지 제어할 수 있다는 점에서 공통점을 가진다.
두 기능의 차이점으로는,
rewrite는 유저가 특정 path에 접근하면 url은 그대로 유지되지만, 실제로는 다른 path의 내용을 불러와서 보여주는 기능이고,
redirect는 유저가 특정 path에 접근했을 때 url 자체를 아예 다른 path로 변경시켜버리는 기능이다.
한마디로 정리하면, rewrite는 겉모습만 그대로고 속은 다른 페이지, redirect는 겉모습도 속도 다른 페이지라고 보면 된다.
rewrite, redirect 두 기능 다 Next.js 설정 파일인 next.config.ts에 설정을 추가해서 사용할 수 있다.
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
async rewrites() {
return [
{
source: "/rewrite", // 유저가 접속한 path
destination: "/", // 유저에게 실제로 보이는 path
},
];
},
};
export default nextConfig;
이런 식으로 설정을 하면, 유저가 브라우저에서 /rewrite로 접속했을 때 url은 /rewrite 그대로 유지되지만, 실제로 보여지는 것은 /의 내용이 되는 것이다.
:를 사용해 다양한 path 값을 받아와 사용할 수 있다.
source: "/old-page/:path", // 유저가 접속한 path
destination: "/new-page/:path", // 유저에게 실제로 보이는 path
이런 식으로 설정을 하면, 유저가 /old-page/profile로 접속 시 /new-page/profile이 표시되게 된다.
하지만 /old-page/profile/edit과 같은 url로 접속하면, 일치하는 경로가 없기 때문에 접속한 url 그대로가 표시된다.
하지만 : 옆에 *을 붙여 쓰게 되면, 경로의 길이에 상관없이 사용할 수 있게 된다.
source: "/old-page/:path*", // 유저가 접속한 path
destination: "/new-page/:path*", // 유저에게 실제로 보이는 path
이런 식으로 설정을 하면, 유저가 /old-page/profile/edit으로 접속 시 /new-page/profile/edit이 표시되게 된다.
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
async redirects() {
return [
{
source: "/redirect", // 유저가 접속한 path
destination: "/", // 이동할 경로
permanent: true,
},
];
},
};
export default nextConfig;
이런 식으로 설정을 하면, 유저가 브라우저에서 /redirect로 접속했을 때 경로가 /로 이동하면서 해당 페이지가 표시된다.
permanent 옵션은 오늘 블로그에선 그렇게까지 중요한 내용은 아니라서 따로 설명하지 않겠다.
궁금하다면 공식 문서를 한 번 찾아보면 좋을 것 같다.
오늘은 이렇게, 알고만 있던 Next.js의 rewrite, redirect 기능을 직접 사용해본 후 정리해보았다. url의 일관성을 유지하거나, 유저에게 실제 url을 숨겨야 하는 경우에 유용하게 사용할 수 있을 것 같다!