← 전체 글로 돌아가기

웹 개발

배포 후 페이지 캐시 문제 해결하기

배포했는데 사용자가 계속 이전 버전을 보거나 페이지가 느려질 때 캐시 문제를 진단하는 방법.

캐시가 만드는 문제들

배포 후 사용자들이 "이전 페이지가 계속 보여요"라고 신고하면 캐시 문제일 가능성이 높다. Nginx, CDN, 브라우저 캐시 등 여러 계층에서 캐싱이 일어나는데, 각 계층을 제대로 이해하지 못하면 배포해도 변경사항이 반영되지 않는다.

또한 프로덕션 빌드가 너무 크거나 정적 파일이 많으면 페이지 로드 속도가 느려질 수 있다.

Nginx 캐시 확인

Nginx에서 정적 파일 캐시 헤더를 설정했다면, 이게 너무 길지 않은지 확인해야 한다.

curl -I https://example.com/static/app.js | grep -i cache

출력 예:

Cache-Control: public, max-age=31536000
ETag: "abc123"

max-age=31536000은 1년인데, 이 정도면 적절하다. 하지만 HTML 파일은 캐시하면 안 된다.

# Nginx 설정 (nginx.conf)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
  expires 1y;
  add_header Cache-Control "public, immutable";
}

location ~ \.html$ {
  add_header Cache-Control "no-cache, no-store, must-revalidate";
}

브라우저 캐시 무효화

파일 이름에 해시를 붙여서 브라우저가 새 파일인 줄 알도록 한다. 보통 번들러가 자동으로 해준다.

<!-- 이전 (캐시됨) -->
<script src="/app.js"></script>

<!-- 배포 후 (새 파일로 인식) -->
<script src="/app.a1b2c3d4.js"></script>

Next.js나 Webpack을 쓰면 기본적으로 해시 기반 파일명을 생성한다.

빌드 크기 확인

배포한 파일이 너무 크면 다운로드 시간이 길어진다.

npm run build
ls -lh out/  # 또는 .next/

# 또는 번들 분석 도구 사용
npm run analyze  # webpack-bundle-analyzer 설치 필요

큰 라이브러리를 찾아서 제거하거나, 동적 import로 분할한다.

// 동적 import로 분할
const HeavyComponent = dynamic(
  () => import('./HeavyComponent'),
  { loading: () => <div>로딩중...</div> }
);

CDN 캐시 초기화

Cloudflare 같은 CDN을 쓴다면 배포 후 캐시를 초기화해야 한다.

# Cloudflare API로 캐시 초기화
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache"   -H "Authorization: Bearer {token}"   -H "Content-Type: application/json"   --data '{"files": ["https://example.com/index.html"]}'

또는 대시보드에서 "Purge Cache" → "Purge Everything"을 클릭한다.

배포 전 체크리스트

  • 정적 파일(js, css)에 적절한 캐시 헤더를 설정했는가?
  • HTML은 캐시하지 않도록 설정했는가?
  • 번들 크기를 확인했는가? (통상 메인 번들 < 200KB)
  • 큰 라이브러리는 동적 import로 분할했는가?
  • CDN을 쓰는 경우 배포 후 캐시 초기화를 할 계획이 있는가?
  • 개발자 도구에서 캐시를 비웠을 때와 비우지 않았을 때 모두 테스트했는가?

이 항목들을 확인하면 배포 후 캐시 관련 문제를 대부분 방지할 수 있다.