Next.js 리소스를 최적화

1 min read

🚀 1. Image 컴포넌트로 이미지 최적화하기

Next.js는 내장된 이미지 최적화 기능을 제공합니다.

✅ 적용 방법

import Image from 'next/image'

export default function Home() {
  return (
    <div>
      <Image
        src="/images/photo.jpg"
        alt="최적화된 이미지"
        width={800}
        height={600}
        priority={true} // 로딩 우선순위 설정
      />
    </div>
  )
}

⚙️ 주요 기능

  • 자동 최적화: 이미지 압축 및 리사이징(WebP, AVIF 등 지원)
  • Lazy-loading: 화면 진입 시점에 맞춰 로딩 (기본 설정)
  • CDN 캐싱 활용: Production 환경에서 자동 CDN 연동 가능

🚀 2. 폰트(Font) 최적화

Next.js 13+ 부터 내장된 폰트 최적화 기능을 제공합니다.

✅ 적용 방법

import { Inter } from 'next/font/google'

const inter = Inter({ subsets: ['latin'] })

export default function Home() {
  return (
    <main className={inter.className}>
      <h1>폰트 최적화 적용 예시</h1>
    </main>
  )
}

⚙️ 장점

  • 자동으로 최적화된 폰트를 CDN으로 배포
  • 페이지 로딩 속도 개선 및 CLS(레이아웃 이동) 최소화

🚀 3. Dynamic Import(지연 로딩)를 통한 리소스 최적화

JavaScript 파일의 크기를 줄이고 초기 페이지 로딩 속도를 높입니다.

✅ 적용 방법

import dynamic from 'next/dynamic'

// 동적으로 컴포넌트 불러오기 (서버 사이드 렌더링 비활성화 가능)
const HeavyComponent = dynamic(() => import('../components/HeavyComponent'), {
  ssr: false,
  loading: () => <p>로딩 중...</p>,
})

export default function Page() {
  return (
    <div>
      <HeavyComponent />
    </div>
  )
}

⚙️ 장점

  • 초기 로딩 시 JS 파일 크기 최소화
  • 성능 및 TTI(Time to Interactive) 향상

🚀 4. Bundle Analyzer로 리소스 점검하기

리소스 사용 현황을 시각적으로 분석하여 불필요한 모듈을 제거하거나 최적화할 수 있습니다.

✅ 적용 방법

npm install @next/bundle-analyzer --save-dev

next.config.js 설정:

const withBundleAnalyzer = require('@next/bundle-analyzer')({
  enabled: process.env.ANALYZE === 'true',
})

module.exports = withBundleAnalyzer({
  // 기존 next.js 설정
})

실행 방법:

ANALYZE=true npm run build

⚙️ 장점

  • 번들 크기와 구성요소를 쉽게 파악하여 최적화 가능
  • 용량이 큰 불필요한 라이브러리 찾기 쉬움

🚀 5. 컴포넌트 및 페이지 캐싱 전략 적용하기

Next.js에서는 아래 방식으로 캐싱을 관리할 수 있습니다.

  • 정적 페이지 생성(Static Site Generation, SSG):
    정적 콘텐츠를 미리 빌드하고 CDN에 캐시하여 빠르게 로딩합니다.
export async function getStaticProps() {
  // 데이터 fetching 및 빌드 시 정적 페이지 생성
  return { props: { data } }
}
  • ISR(Incremental Static Regeneration):
    정적 콘텐츠에 동적 데이터를 주기적으로 재검증하여 캐시를 최적화합니다.
export async function getStaticProps() {
  return { 
    props: { data },
    revalidate: 60, // 60초마다 캐시 재검증
  }
}
  • 캐싱 헤더 설정(커스텀):
    API Route 등에서 HTTP 헤더를 통해 캐싱 전략 설정 가능
export default function handler(req, res) {
  res.setHeader('Cache-Control', 'public, max-age=600')
  res.status(200).json({ data: 'cached data' })
}

🚀 6. CDN 활용 및 커스텀 Cache-Control

Vercel 등 클라우드 배포 시 CDN과 캐싱 설정을 통해 추가 최적화가 가능합니다.

✅ 적용 예시

  • 이미지와 정적 파일에 적절한 캐싱 헤더 설정:
// next.config.js
module.exports = {
  async headers() {
    return [
      {
        source: '/(.*).(png|jpg|jpeg|gif|svg)',
        headers: [{ key: 'Cache-Control', value: 'public, max-age=31536000, immutable' }],
      },
    ]
  },
}

🚀 7. 코드 스플리팅 및 불필요한 JS 최소화

Next.js는 기본적으로 코드 스플리팅을 제공합니다.
추가적으로:

  • 불필요한 JS 제거
  • Tree-shaking 효과를 극대화하기 위해 ES modules 사용
  • Polyfill 등 레거시 코드 제거

✅ Tree-shaking 예시

// 사용하지 않는 코드는 빌드 시 자동 제거됨
import { usedMethod } from 'library' 

🚀 리소스 최적화 요약

방법 설명

Image 컴포넌트 활용이미지 압축, CDN 배포
폰트 최적화내장 폰트 최적화로 로딩 속도 개선
Dynamic ImportJS 크기 최소화, 로딩 속도 향상
Bundle Analyzer불필요한 리소스 분석 및 제거
SSG & ISR 캐싱 전략페이지 로딩 속도 극대화
CDN & Cache-Control캐싱 헤더를 통한 로딩 속도 향상

루아 Lua 프로그래밍 : 모듈과 패키지 가이드

지금까지 우리는 함수로 코드를 묶고, 테이블로 데이터를 구조화하는 방법을 익혔습니다. 하지만 프로젝트의 규모가 커지기 시작하면, 모든 코드를 단 하나의 파일에 담는 것은 금세 한계에...
eve
53 sec read

루아 (Lua) 프로그래밍: 테이블과 메타테이블의 모든 것

Lua 프로그래밍의 여정에서 가장 중요하고 흥미로운 지점에 도달했습니다. 바로 Lua 언어의 심장이자 가장 중심적인 기능인 테이블(Table)입니다. Lua에는 배열, 딕셔너리, 리스트, 객체 등을 위한 별도의...
eve
1 min read

루아(Lua) 프로그래밍: 제어 구조 조건과 반복

지금까지 우리는 변수에 데이터를 저장하고, 연산자로 이 데이터들을 계산하고 비교하는 방법을 배웠습니다. 하지만 프로그램이 단순히 위에서 아래로 순서대로만 실행된다면, 매우 단순한 작업밖에 할 수...
eve
1 min read