본문 바로가기
프론트엔드/Next.JS

최적화 - 구글 폰트 적용 / Image 컴포넌트 / Head 컴포넌트

by 학습하는 청년 2023. 7. 24.

최종 수정 : 2024-05-31

구글 폰트 적용

Next.js에서는 구글 폰트를 위한 기능도 제공한다. 편하게 쓰는 것뿐만 아니라 여러 가지 최적화도 함께 제공한다.

import { Noto_Sans_KR } from '@next/font/google';

const notoSansKR = Noto_Sans_KR({
 weight: ['400', '700'],
 subsets: [],
});

weight 프로퍼티에는 사용할 폰트 굵기에 400, 700을 갖는 폰트를 쓸 거라고 명시한다. 여기서 주의할 점은 숫자(400, 700 같은 형태)가 아니라 문자열('400', '700' 같은 형태)라는 것이다.

subset은 폰트에서 영문, 한글 이런 식으로 사용할 글자들만 골라 사용할 때 작성한다. 빈 배열로 작성하면, 일단 전부 다 사용하는 것을 의미한다. 만약 영문만 사용하길 원한다면 ['latin']과 같이 작성해주면 된다.

 

 

폰트를 적용하려면

1) notoSansKR 객체의 className 프로퍼티를 사용할 수 있다. 이 클래스가 적용된 요소 안에서는 폰트를 적용하게 된다.

<main className={notoSnasKR.className}>
 ...
</main>

 

2) 아니면 Next.js에서 제공하는 Head 컴포넌트를 활용해서 전역 스타일로 적용할 수도 있다.

<Head>
 <style>{`
  html {
   font-family: ${notoSnasKR.style.fontFamily}, sans-serif;
  }
 `}</style>
</Head>

 

이와 같이, 작성하면 구글 폰트일지라도 우리 사이트에서 폰트 파일을 받아 오게 된다. 그로 인해, 초기 로딩 속도가 훨씬 빨라져 최적화가 이루어진다.


Image 컴포넌트

Next.js에서는 이미지를 사용할 때 Next.js 서버를 한 번 거쳐서 이미지 최적화를 한 다음 사용할 수 있다. 그래서 되도록이면 <img> 태그보다는 <Image> 컴포넌트를 사용하는 걸 권장한다. <Image> 컴포넌트는 next/image에서 불러와서 사용한다. 이때 반드시 크기가 있어야 하는데, widthheight 값을 지정하거나 또는 fill이라는 Prop을 사용할 수 있다.

# 1) width와 height를 사용하는 경우

import Image from 'next/image';

export default function Page() {
 return (
  <>
   <Image
    src="/images/product.jpeg"
    width={300}
    height={300}
    alt="상품 이미지"
   />
  </>
 );
}

# 2) fill을 사용하는 경우

이미지 크기를 유연하게 지정해야 할 때 사용한다. 이때 부모 요소에서 position: relative와 같이 포지셔닝해야 한다. fill을 사용할 경우, absolute 포지션으로 배치되기 때문에 '가장 가까운 포지셔닝이 된' 조상 요소에 꽉 차도록 이미지가 배치된다. 만약 이미지의 비율이 깨지는 것을 막고 싶다면 object-fit: cover 속성으로 이미지를 크롭하면 된다.

import Image from 'next/image';

export default function Page() {
 return (
  <>
   <div
    style={{
     position: 'relative',
     width: '100%',
     height: '300px',
    }}
   >
    <Image
     src="images/product.jpeg'
     fill
     alt="상품 이미지"
     style={{
      objectFit: 'cover',
     }}
    />
   </div>
  </>
 );
}

Head 컴포넌트

다음과 같이 작성하면 된다.

import Head from 'next/head';

export default function Page() {
  return (
    <>
      <Head>
        <title>페이지 제목</title>
        <link rel="icon" href="/favicon.ico" />
      </Head>
      ...
    </>
  );
}

 

만약 사이트 전체에 공통으로 적용하고 싶다면 /pages/_app.js 파일에서 <Head> 컴포넌트를 활용하면 된다.

import Head from 'next/head';

export default function App() {
  return (
    <>
      <Head>
        <title>사이트 기본 제목</title>
        <link rel="icon" href="/favicon.ico" />
      </Head>
      <Component {...pageProps} />
    </>
  );
}

댓글