"꾸준하고 완벽한 한 걸음"

Frontend/Next.js

[Official Learn Next.js] Learn ‘App Router’ - Chapter 3. Optimizing Fonts and Images

kimyoungrok 2025. 3. 16. 02:06
728x90

App Router: Optimizing Fonts and Images


글꼴을 최적화 해야하는 이유

프로젝트에서 사용자 지정 글꼴을 사용하면 글꼴파일 로드시 성능에 영향을 미칠 수 있다.

ex) 시스템 글꼴로 랜더링 후 사용자 글꼴로 텍스트가 렌더링 됨에 따라 텍스트 크기, 간격 등이 변경되어 주변 요소에 영향을 미친다.

NextJs는 빌드시 글꼴 파일을 다운로드해 다른 정적 자산과 함께 호스팅한다.

즉 next/font/폰트명 으로 폰트를 다운받고, 정적 자산으로 번들링 된다.

따라서 사용자가 애플리케이션에 방문 시 성능에 영향을 줄 수 있는 네트워크 요청이 없다.


기본 글꼴 추가

/app/ui 폴더에 fonts.ts 를 만듭니다.

import { Inter } from 'next/font/google';
 
export const inter = Inter({ subsets: ['latin'] });

/app의 layout.tsx에 새로 다운받은 폰트를 적용합니다.

import '@/app/ui/global.css';
import { inter } from '@/app/ui/fonts';
 
export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body className={`${inter.className} antialiased`}>{children}</body>
    </html>
  );
}

왜 이미지를 최적화해야 하나요?

Nest.js는 최상위 폴더 아래 /public 으로 정적 자산을 사용할 수 있습니다.

일반적인 img태그는 개발자가 직접 해야하는 여러 이미지 최적화 작업을 해야하지만, Next.js는 이를 자동으로 처리해줍니다.


Imaeg 컴포넌트

Image 컴포넌트는 img태그의 확장으로 자동으로 이미지 최적화 기능을 제공합니다.

  • 이미지 로드시 레이아웃 이동 방지
  • 뷰포트 크기에 맞게 이미지를 리사이징하여 불필요하게 큰 이미지 전송 방지
  • 기본적으로 지연 로딩을 지원해 뷰포트로 접근 시 이미지를 로드
  • WebP나 AVIF와 같은 최신 이미지 포맷 제공

이미지 추가 실습

/app/page.tsx에 두 이미지를 추가해보겠습니다.

import AcmeLogo from '@/app/ui/acme-logo';
import { ArrowRightIcon } from '@heroicons/react/24/outline';
import Link from 'next/link';
import { lusitana } from '@/app/ui/fonts';
import Image from 'next/image';
 
export default function Page() {
  return (
    // ...
    <div className="flex items-center justify-center p-6 md:w-3/5 md:px-28 md:py-12">
      {/* Add Hero Images Here */}
      <Image
        src="/hero-desktop.png"
        width={1000}
        height={760}
        className="hidden md:block"
        alt="Screenshots of the dashboard project showing desktop version"
      />
      <Image
        src="/hero-mobile.png"
        width={560}
        height={620}
        className="block md:hidden"
        alt="Screenshot of the dashboard project showing mobile version"
      />
    </div>
    //...
  );
}

이미지를 랜더링되기 전에 width와 height는 레이아웃 이동 방지를 위해 영역을 예약합니다.

또한 클레스네임을 hidden md:block 또는 md:block hidden으로 지정해 평소에는 숨기다가 사이즈가 md(미디엄) 이상일때 보여줍니다.

728x90