npx create-next-app@latest
Typescript를 사용할 경우: npx create-next-app@latest --typescript
개발용 서버 실행: npm run dev
anchor 태그를 이용한 페이지 이동
export default function NavBar() { return ( <nav> <a href="/">Home</a> <a href="/intro">Intro</a> </nav> ) }
Link를 이용한 페이지 이동
import Link from "next/link"; export default function NavBar() { return ( <nav> <Link href="/"> <a>Home</a> </Link> <Link href="/intro"> <a>Intro</a> </Link> </nav> ) }
import Link from "next/link";
import { useRouter } from "next/router";
import styles from "./NavBar.module.css";
export default function NavBar() {
const router = useRouter();
// useRouter를 변수로 선언
return (
<nav>
<Link href="/">
<a className={router.pathname === "/" ? styles.link : ""}>Home</a>
{/* router.pathname은 url을 의미, 또한 a태그에 스타일 적용 */}
</Link>
<Link href="/intro">
<a className={router.pathname === "/intro" ? styles.link : ""}>Intro</a>
</Link>
</nav>
)
}
해당 컴포넌트에만 style을 적용하고 싶을 때 편리하다.
import Link from "next/link";
import { useRouter } from "next/router";
export default function NavBar() {
const router = useRouter();
// useRouter를 변수로 선언
return (
<nav>
<Link href="/">
<a className="aa">Home</a>
{/* router.pathname은 url을 의미, 또한 a태그에 스타일 적용 */}
</Link>
<Link href="/intro">
<a className="aa">Intro</a>
</Link>
<style jsx>{`
nav {
background-color: blue;
}
a {
text-decoration: none;
}
.aa {
color: orange;
}
`}</style>
</nav>
)
}
_app.js에 global 스타일을 적용하면 하위 컴포넌트들에 모두 적용된다. 여기서 _app.js는 앱이 실행될 때, 가장 먼저 실행되는 상위 파일로 하위 컴포넌트를 관리하는 총괄 파일이다. 또한 _app.js에선 module.css가 아닌 .css파일을 import해서 사용 가능하다.
import NavBar from "../components/NavBar";
export default function MyApp({ Component, pageProps }) {
return (
<div>
<NavBar />
<Component {...pageProps} />
<style jsx global>{`
a {
text-decoration: none;
}
.aa {
color: orange;
}
`}</style>
</div>
)
}
퍼블리싱 혹은 git hub 업로드 과정에서 개인이 부여받은 api key를 숨기지 않는다면 타인에게 남용될 가능성이 있기에 이를 숨기는 방법 또한 존재한다.
Redirects: /contact/1004 로 접속 -> /new-contact/1004 로 자동 이동
Rewrites: Redirects와 Rewrites의 차이점: Redirect는 유저가 변경되는 url을 육안으로 확인 가능하지만, Rewrite의 경우 변경된 url을 숨긴다. (next.js가 request를 masking 해줌)
API key를 보안화하는 방법으로 .env 파일을 생성하여 해당 파일에 api key를 따로 저장하고 .gitignore에 .env 파일을 등록하여 업로드 시 제외되도록 한다.
또 다른 방법으로는, getSeverSideProps 함수를 이용하는 것으로, 이 함수는 클라이언트가 아닌 서버쪽에서만 동작하기에, 이를 통해 백엔드 쪽에 API Key를 숨기는 것도 가능하다.
// next.config.js 파일
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
}
const API_KEY = process.env.API_KEY;
// API key를 .env 파일에 담아 저장해놓고 불러온다.
// 또한 .env 파일은 .gitignore 파일에 업로드 제외 파일로 등록하여 해당 파일의 정보를 개발자만 확인할 수 있도록 보안화한다.
module.exports = {
nextConfig,
async redirects() {
return [
{
source: "/contact/:path*",
destination: "/new-contact/:path*",
permanent: false,
},
];
},
// <Redirects> source: 유저가 접속하는 url, destination: source의 url로 접속하면 destination의 url로 자동 이동됨
// destination은 외부 url 어느 곳으로든 redirect 시켜줌
// url 끝에 ":path*"를 붙이면 path도 알아서 matching 시켜준다.
// *를 붙이면 url끝에 추가적으로 뭐가 붙든 매칭시켜준다.
async rewrites() {
return [
{
source: "/api/movies",
destination: `https://api.themoviedb.org/3/movie/popular?api_key=${API_KEY}&language=en-US&page=1`
}
];
}
};
// <Rewrites> 유저가 source url로 접속하면 destination url으로 자동 이동되지만, 유저는 destination의 url을 볼 수 없다. 유저에겐 source url만 보임