이번 편의 결과물: 콘텐츠를 수정해 재배포한 직후, 새 값이 보이기까지 걸리는 시간과 순서를 헤더로 추적합니다. · 다루는 개념: 재배포 시 CloudFront 자동 무효화, 무효화가 전파되는 순서(빌드 → 배포 → CloudFront invalidation → 컴퓨트 캐시 초기화), 커스텀 헤더가 무효화 체감 시간에 주는 영향
09편에서 인스턴스마다 메모리가 격리된다는 것을, 10편에서 온디맨드 재검증이 Amplify에서 막혀 있다는 것을 확인했습니다. 두 편 모두 “이미 떠 있는 인스턴스”를 대상으로 한 실습이었습니다. 이번 편은 다른 축입니다. 재배포 자체가 캐시에 어떤 영향을 주는지 시간 순서대로 추적합니다.
이 편에서 만드는 파일
notice-board/
├── data/
│ └── notices.seed.json (~, 공지 1건 추가)
└── scripts/
└── track-invalidation.sh (+)개념 정리
재배포는 캐시를 지운다(공식 문서 기준)
AWS 공식 문서(Managing the cache configuration for an app)는 캐싱 동작을 정리한 표에서 다음 항목을 지원 여부와 함께 명시합니다.
“Each new CI/CD app deployment clears the cache.” — Yes(과거)/Yes(현재 모두 지원)
즉 Amplify Hosting은 Git 연동 배포로 새 빌드가 올라갈 때마다 CDN 캐시를 지우는 것을 표준 동작으로 보장합니다. 수동으로 무효화 요청을 보낼 필요가 없습니다.
무효화가 전파되는 순서
재배포 버튼을 누른 시점과 브라우저에 새 콘텐츠가 보이는 시점 사이에는 네 단계가 순서대로 일어납니다.
| 순서 | 단계 | 이 단계에서 일어나는 일 |
|---|---|---|
| 1 | 빌드 | Amplify 빌드 컨테이너가 amplify.yml의 명령대로 npm ci, npm run build를 실행 |
| 2 | 배포 | 빌드 산출물(.next)을 컴퓨트 실행 환경과 정적 자산 스토리지에 반영 |
| 3 | CloudFront invalidation | Amplify가 CDN 엣지에 캐시된 이전 응답을 무효화 |
| 4 | 컴퓨트 캐시 초기화 | 새 컴퓨트 인스턴스가 콜드 스타트되며, 이전 인스턴스의 인메모리 상태(09편에서 만든 조회수 저장소·10편에서 만든 공지 저장소)는 사라지고 초깃값으로 되돌아감 |
4단계는 이번 실습에서 직접 확인할 수 있는 부수 효과입니다. 10편에서 등록했던 공지는 재배포 후 사라지고, 09편에서 늘려뒀던 조회수도 0으로 돌아갑니다. 두 인메모리 저장소 모두 새 인스턴스에서 다시 시작되기 때문입니다(공지는 data/notices.seed.json 시드로, 조회수는 빈 Map으로). 이 문제는 13편에서 외부 공유 캐시로 해결합니다.
커스텀 헤더가 체감 시간에 주는 영향
05편에서 특정 경로에 Cache-Control: s-maxage=... 커스텀 헤더를 설정했다면, 그 값이 CDN 엣지에 남아있는 최대 시간을 늘립니다. 공식 문서는 재배포마다 캐시를 지운다고 명시하지만, 커스텀 헤더로 캐시 기간을 길게 설정한 SSR 경로에서 재배포 직후에도 잠시 이전 응답이 보였다는 사례가 커뮤니티에 다수 보고되어 있습니다(aws-amplify/amplify-hosting GitHub 이슈 #3186). 실습에서는 이 가능성을 염두에 두고, “즉시 안 바뀌면 실패”로 단정하지 말고 몇 차례 더 새로고침하며 타임라인을 기록합니다.
실습
1. 재배포 전 상태 기록
curl -sI "https://main.d1234567890abc.amplifyapp.com/"
curl -s -X POST "https://main.d1234567890abc.amplifyapp.com/api/notices/1/views"cache-control, age, x-cache 값과 09편에서 만든 조회수 API가 지금 돌려주는 views 값을 적어 둡니다. 홈 화면에서 10편에서 등록한 공지가 아직 목록에 남아 있는지도 확인합니다.
2. 눈에 보이는 콘텐츠 변경 만들기
data/notices.seed.json에 새 공지 하나를 추가합니다. 시드 파일을 바꾸는 것은 빌드 시점에 반영되는 변경이라, 4단계 순서 중 1단계(빌드)부터 확인하기 좋습니다.
// data/notices.seed.json (배열 끝에 추가)
{
"id": 8,
"title": "10월 프로모션 사전 안내",
"category": "공지",
"author": "마케팅팀",
"publishedAt": "2026-09-22",
"content": "10월 프로모션 사전 신청을 시작합니다."
}#!/usr/bin/env bash
# scripts/track-invalidation.sh
# 배포 직후 10초 간격으로 12번(약 2분) 응답을 확인합니다.
URL="https://main.d1234567890abc.amplifyapp.com/"
for i in $(seq 1 12); do
timestamp=$(date +%H:%M:%S)
headers=$(curl -sI "$URL")
age=$(echo "$headers" | grep -i '^age:' | tr -d '\r')
xcache=$(echo "$headers" | grep -i '^x-cache:' | tr -d '\r')
hasNewNotice=$(curl -s "$URL" | grep -c '10월 프로모션')
echo "$timestamp | $age | $xcache | 새 공지 노출: $hasNewNotice"
sleep 10
done3. 커밋·푸시로 재배포 트리거
변경 사항을 GitHub에 푸시합니다. Amplify 콘솔 → 앱 선택 → 배포 이력에서 빌드가 시작되는 시각을 확인합니다.
4. 배포 완료 직후 타임라인 수집
Amplify 콘솔에서 배포 상태가 “Deployed”로 바뀌는 즉시 스크립트를 실행합니다.
bash scripts/track-invalidation.sh5. 확인
결과를 아래와 같은 표로 정리합니다.
| 시각 | age | x-cache | 새 공지 노출 |
|---|---|---|---|
| 10:00:00 | age: 0 | x-cache: Miss from cloudfront | 1 |
| 10:00:10 | age: 10 | x-cache: Hit from cloudfront | 1 |
| 10:00:20 | age: 20 | x-cache: Hit from cloudfront | 1 |
(실제 값은 배포 시각과 캐시 설정에 따라 달라집니다. 배포 직후 첫 요청의 age가 0으로 리셋되고 x-cache가 Miss로 바뀌는지, “새 공지 노출” 값이 0에서 1로 바뀌는 시점이 언제인지가 핵심 확인 지점입니다.)
- 재배포 직후 첫 요청에서
age가 0으로 리셋됩니다. - “10월 프로모션” 공지가 목록에 나타납니다.
- 홈 화면 목록에서 10편에서 등록했던 공지는 사라지고,
data/notices.seed.json시드 데이터(새로 추가한 8번 포함)만 남습니다(4단계, 컴퓨트 캐시 초기화의 결과). - 재배포 후 같은 공지(
id=1)의 조회수 API를 다시 호출하면 값이1부터 다시 시작합니다. 컴퓨트 캐시 초기화로 09편의 인메모리 조회수 저장소도 함께 리셋됐다는 뜻입니다.
직접 해보기
- 05편에서 설정한
s-maxage값을 크게(예: 3600) 바꾼 뒤 같은 재배포 실습을 반복해 봅니다. 무효화 체감 시간이 달라지는지 관찰합니다.
확인 방법
s-maxage를 늘려도 공식 문서 기준으로는 재배포 시 캐시가 지워집니다. 다만 값이 클수록 무효화 이전에 여러 엣지 위치에 퍼져 있던 캐시 항목이 많아질 수 있어, 체감상 새 콘텐츠가 보이기까지 걸리는 시간이 값이 작을 때보다 들쭉날쭉하게 느껴질 수 있습니다.
track-invalidation.sh의 간격을 10초에서 2초로 줄여 더 촘촘한 타임라인을 기록해 봅니다.
확인 방법
간격을 줄이면 age가 0에서 리셋되는 정확한 시점을 더 좁은 범위로 좁힐 수 있습니다. 다만 요청 수가 늘어나므로 무료 티어의 SSR 요청 건수를 소모한다는 점을 감안합니다.
자주 하는 실수
| 증상 | 원인 | 고치는 법 |
|---|---|---|
| 재배포 직후에도 옛 콘텐츠가 계속 보임 | 브라우저 자체 캐시(로컬 캐시)를 보고 있음 | curl -sI처럼 브라우저 캐시를 거치지 않는 방법으로 재확인하거나 강력 새로고침을 사용한다 |
| age가 0으로 리셋되지 않고 계속 증가함 | 재배포가 실제로 완료되지 않았거나, 커스텀 헤더의 긴 TTL이 아직 반영 중 | Amplify 콘솔에서 배포 상태가 “Deployed”인지 먼저 확인한 뒤 몇 차례 더 새로고침한다 |
| 10편에서 등록한 공지가 재배포 후 사라져서 버그로 오해함 | 인메모리 저장소가 컴퓨트 캐시 초기화(4단계)로 시드 데이터로 되돌아간 것 | 정상 동작이다. 데이터를 재배포 후에도 유지하려면 12·13편의 외부 공유 캐시가 필요하다 |
| 타임라인 스크립트 실행 중 curl 명령이 자꾸 실패함 | Amplify 앱 URL 오타 또는 네트워크 문제 | Amplify 콘솔에서 정확한 배포 URL을 다시 복사해 스크립트에 반영한다 |