털뭉이 러시를 새로 배포하고 나서, 이전 번들 파일이 404가 되는 것을 확인했습니다. 문제는 그게 캐시된 껍데기가 여전히 그 파일을 가리키고 있다는 것이었습니다.

"옛 판이 뜬다"가 아니라 "안 뜬다"입니다

서비스워커가 모든 GET 요청에 같은 정책을 쓰고 있었습니다. 캐시된 게 있으면 그걸 바로 주고, 뒤에서 조용히 새로 받아 다음번을 대비하는 방식입니다. 이미지나 폰트에는 좋은 정책입니다.

HTML 껍데기에는 아닙니다.

껍데기 안에는 index-Bj20fkeO.js 같은 내용 해시가 붙은 이름이 적혀 있습니다. 새로 배포하면 내용이 바뀌었으니 해시도 바뀌고, 옛 이름의 파일은 사라집니다.

그러면 이렇게 됩니다. 캐시에서 옛 껍데기가 나옵니다 → 그 껍데기가 옛 번들을 요청합니다 → 404. 옛 판이 뜨는 게 아닙니다. 껍데기는 떴는데 알맹이가 없어서 아무것도 안 뜹니다.

"캐시가 오래된 걸 보여준다"는 흔한 불편인데, 여기서는 그게 완전한 고장으로 바뀝니다. 해시 이름은 캐시를 잘 쓰라고 만든 장치인데, 껍데기에 적용하면 정확히 그 장점이 흉기가 됩니다.

파일 종류마다 정책이 달라야 했습니다

껍데기는 네트워크 먼저. 화면 이동, /로 끝나는 경로, .html은 항상 새로 받아 봅니다. 네트워크가 안 되면 그때만 캐시된 껍데기로 떨어집니다. 오프라인 지원은 유지하되, 온라인일 때는 항상 최신 껍데기를 봅니다.

해시 자산은 캐시 먼저 그대로. 이름이 곧 내용이라 같은 이름이면 같은 파일입니다. 새로 받을 이유가 없습니다.

그리고 캐시 이름을 v2로 올려 이전 배포가 남긴 것을 통째로 버렸습니다. 정책을 고쳐도 이미 잘못 캐시된 껍데기가 남아 있으면 고친 보람이 없습니다.

배포 꾸러미를 저장소에 넣었습니다

이번에 다른 문제도 같이 드러났습니다. 배포에 쓰는 꾸러미가 저장소에 없어서 한 번 통째로 유실됐고, 손으로 복원해야 했습니다.

빌드 산출물이라고 생각해서 추적하지 않았는데, 실제로는 그중 일부만 산출물이었습니다. 워커 코드와 배포 설정은 손으로 쓴 것입니다. 빌드해서 다시 만들어지지 않습니다.

그래서 손으로 쓴 둘만 추적하고, 진짜 복사본인 정적 파일 폴더는 계속 제외합니다. "빌드 폴더 안에 있으니 빌드 산출물"이라는 위치 기준이 틀렸던 것입니다. 다시 만들 수 있는지로 가르는 게 맞습니다.

확인

배포 후 실제 브라우저로 열어 새 번들이 200으로 받아지고 콘솔 오류가 없는 것을 확인했습니다.

GET /furball/                          200
GET /furball/assets/index-Derl0Niy.js  200