Front-end/Next

[Next] 프로젝트 생성하기

개발중인제이 2024. 4. 25. 17:59

 

NEXT.js 앱 생성하기

📌

 

Getting Started: Installation | Next.js

Create a new Next.js application with `create-next-app`. Set up TypeScript, styles, and configure your `next.config.js` file.

nextjs.org

 

프로젝트 생성

npx create-next-app@latest .

 

프로젝트 설정

프로젝트 설정은 자신의 원하는 형식에 맞춰서 생성해주면 된다. 

 

NEXT.js 기능 살펴보기

경로설정

import { useRouter } from "next/router";

const router = useRouter();
router.push(/경로);
  • 리액트에서 사용하던 useNavigate 대신 사용한다고 생각하면 된다. 

 

이미지 최적화

  • 디바이스의 크기에 맞게 이미지 사이즈 조절
  • 이미지 캐싱을 통한 로딩 속도 증진 → 한번 불러온 이미지는 서버에 저장해서 다음에 빠르게 불러옴
  • 넥스트 앱은 이미지 최적화를 위해 이러한 다양한 기능 next/image 컴포넌트로 제공한다.

💡 넥스트 앱에서 제공하는 이미지 컴포넌트가 어떻게 최적화를 시켜준다는 걸까?

 

기존에 사용하던 이미지 태그를 살펴보자.

<img className={style.flag_img} src={flagImg} />

 

개발자 도구를 통해 해당 태그가 이미지를 불러오는 시간을 확인 할 수 있다. 

보면 알다시피 하나당 작게는 200ms ~ 크게는 1s 이상의 시간이 걸리는 것을 확인할 수 있다. 많은 이미지를 불러와야 하는 사이트의 경우에는 느린 이미지 로딩 속도로 인해 불편함을 겪을 수 있다. 

 

이제 넥스트에서 제공하는 이미지 컴포넌트를 살펴보자.

<Image src={flagImg} width={100} height={100} />

 

다시 개발자 도구를 살펴보면

이처럼 확연히 다른 속도로 이미지 로딩하는 것을 확인할 수 있다. 

 

이렇게 넥스트의 이미지 컴포넌트를 사용하는 것만으로도 이미지 최적화를 할 수 있다. 

 

<Image /> 컴포넌트 특징

  • 넥스트에서 제공해주는 이미지 컴포넌트를 사용하는 경우 외부서버에서 이미지를 받아 온다면 width와 height를 꼭 입력해줘야한다. (fill 입력 시 생략가능)
  • fill은 부모요소에 맞춰 꽉 채워주는 요소 →따라서 부모요소에 꼭 position: relative를 해줘야한다. 

 

💡 이렇게 설정을 해주고 확인하면 오류가 발생한다. 왜일까?

넥스트는 기본적으로 외부에서 받아오는 이미지의 보안 취약점을 방지하기 위해 public에 있는 이미지만 사용할 수 있게 한다. 따라서 외부 api에서 이미지를 받아오지 못하고 오류가 나는 것!

 

어떻게 해결할까?

/** @type {import('next').NextConfig} */
const nextConfig = {
	reactStrictMode: true,
	images: {
		domains: ["외부경로"],
	},
};

export default nextConfig;

next.config.mjs 파일에 외부 경로를 추가해주면 된다.

 

메타태그 설정하기

넥스트앱에서는 리액트앱과 달기 각 페이지 별로 메타태그를 설정할 수 있다. 

import { fetchCountries } from "@/api";
import CountryList from "@/components/CountryList";
import Searchbar from "@/components/Searchbar";
import Head from "next/head";

export default function Home({ countries }) {
	return (
		<>
			<Head>
				<title>NARAS</title>
				<meta property="og:image" content="/thumbnail.png" />
				<meta property="og:title" content="NARAS" />
				<meta property="og:description" content="전 세계 국가들의 정보를 확인해보세요" />
			</Head>
			<Searchbar />
			<CountryList countries={countries} />
		</>
	);
}

이런 식으로 다른페이지에도 Head 컴포넌트를 활용해서 메타 태그를 설정해줄 수 있다. 

 

 

📌

프로젝트로 배우는 React.js & Next.js 마스터리 클래스