← 전체 글로 돌아가기

Next.js

Next.js 페이지 속도가 갑자기 느려졌을 때

Next.js 프로젝트에서 페이지 로딩 속도가 저하되었을 때 원인을 빠르게 찾는 체크리스트.

Next.js 페이지가 평소처럼 빠르다가 어느 날 갑자기 느려지면 뭔가 바뀐 게 있을 것이다. 체계적으로 접근하면 원인을 찾을 수 있다.

빌드 크기 확인

가장 먼저 빌드 최적화 요약을 본다:

npm run build
# "Page  Size   First Load JS" 테이블 확인

Next.js 빌드 후 출력되는 테이블에서 어떤 페이지의 크기가 급증했는지 본다. 500KB 이상이면 너무 크다.

특히 "First Load JS" 부분에서 공유 JavaScript 크기가 늘었다면 의존성을 의심한다.

의존성 추가 확인

최근에 npm에 뭔가 설치했나?

# 최근 변경 사항 확인
git diff HEAD~1 package.json

# 또는 전체 의존성 크기 분석
npx webpack-bundle-analyzer dist/static/chunks/main.js

새로 추가한 라이브러리가 500KB 크기라면 분명 페이지가 느려진다.

이미지 최적화

Next.js Image 컴포넌트를 사용했는가?

// 최적화됨
import Image from 'next/image';
<Image src="..." width={800} height={600} />

// 최적화 안 됨
<img src="..." />

큰 이미지를 <img>로 넣으면 최적화 없이 그대로 로드된다. 모든 이미지를 Next.js Image로 바꾸는 것만으로도 크기가 줄어든다.

동적 import 활용

페이지에서 사용하지 않는 코드도 번들에 들어가면 안 된다. 동적 import를 쓴다:

// 처음부터 로드 (비효율)
import HeavyComponent from './heavy';

// 필요할 때만 로드 (효율적)
const HeavyComponent = dynamic(() => import('./heavy'));

특히 모달이나 팝업 같은 조건부 컴포넌트는 동적 import로 처리한다.

데이터 페칭 최적화

getStaticProps나 getServerSideProps에서 뭔가 오래 걸리나?

export async function getStaticProps() {
  // 이 부분에서 시간 지연이 있나?
  const data = await fetchDataFromDB();  // 5초 걸린다면?

  return { props: { data }, revalidate: 60 };
}

데이터 페칭이 느리면 전체 페이지 빌드가 느려진다. ISR (Incremental Static Regeneration) revalidate 시간을 줄이거나, 필요한 데이터만 가져온다.

API 응답 시간

SSR 페이지에서 API를 호출한다면, 그 API 응답 시간이 페이지 로드 시간을 결정한다:

# API 응답 시간 측정
time curl https://api.example.com/endpoint

1초 이상이면 지연이 눈에 띤다. API를 캐시하거나 응답을 최소화한다.

데이터베이스 쿼리

SSR에서 데이터베이스에 직접 접근한다면, 쿼리가 느렸을 수도 있다:

// 모든 필드를 가져오면 느림
const users = await db.users.findMany();

// 필요한 필드만 가져오기
const users = await db.users.findMany({
  select: { id: true, name: true }
});

특히 관계 데이터를 모두 로드한다면 N+1 문제가 생길 수 있다.

캐시 전략 검토

Cache-Control 헤더가 제대로 설정되어 있나?

curl -i https://example.com/ | grep -i cache-control

정적 페이지라면 Cache-Control: public, max-age=3600 정도를 설정해서 브라우저 캐시를 활용한다.

Lighthouse로 측정

Chrome DevTools의 Lighthouse 탭에서 실제 성능을 측정한다. 어디서 시간이 가장 많이 나가는지 명확히 보인다.

로컬에서는 빠르더라도 실제 네트워크 환경에서는 느릴 수 있으니, Lighthouse의 "Throttle" 설정으로 느린 네트워크를 시뮬레이션한다.