Skip to content
에챠피의 기록 연습
Go back

Vercel이 옛날 글을 계속 보여준 이유 — 빈 컨텐츠 컬렉션 함정

Edit page

AstroPaper 템플릿으로 블로그를 새로 세팅하면서 만난 이상한 현상을 기록한다.

Table of contents

Open Table of contents

상황

블로그를 내 것으로 만들기 위해 다음 작업을 했다.

  1. 사이트 제목·설명·소셜 링크 등 개인 정보로 변경
  2. 홈 화면 hero 영역의 “Mingalaba” 인사를 한국어로 교체
  3. AstroPaper에 딸려오던 샘플 포스트 17개를 전부 삭제
  4. 모든 변경사항을 commit & push

로컬 dev 서버(npm run dev)에서는 의도대로 글 목록이 비어있는 깔끔한 화면이 나왔다. 그런데 Vercel에 배포된 사이트를 열어보니 이런 모습이었다.

push가 끝났는데도 옛날 샘플 글들이 그대로 보이는 화면

Hero 섹션의 한국어 인사(“안녕하세요 👋“)는 적용됐는데, Featured 섹션에는 지웠던 샘플 글 3개가 그대로 보였다. “How to configure AstroPaper theme”, “Adding new posts in AstroPaper theme”, “AstroPaper 5.0”.

1차 검증 — 코드는 정말 깨끗한가

가장 먼저 의심한 건 push 누락. 하지만 원격 저장소를 직접 확인해보니 정확히 들어가 있었다.

$ git ls-tree origin/main src/data/blog/
100644 blob e69de29...    src/data/blog/.gitkeep

.gitkeep 외에는 아무것도 없다. 원격 코드는 깨끗하다.

로컬에서 직접 빌드를 돌려봤다.

$ npx astro build
...
[content] Synced content
[WARN] [glob-loader] No files found matching "**/[^_]*.md" in directory "src/data/blog"
...
The collection "blog" does not exist or is empty.
...
 Completed in 1.45s.
[build] 7 page(s) built
[build] Complete!

The collection "blog" does not exist or is empty 메시지가 무섭게 보이지만 fatal error가 아니라 정보성 로그다. 실제로 7개 페이지가 정상 생성되며 빌드는 성공으로 끝났다. 생성된 dist/index.html을 grep해봐도 “Featured”, “Recent Posts”, 옛 글 제목 어느 것도 흔적이 없었다.

로컬 빌드 결과물은 완전히 깨끗했다. 문제는 Vercel 쪽.

2차 시도 — 임시 포스트로 강제 트리거

원인을 정확히는 모르겠지만, 컨텐츠가 0개라는 상태가 어떤 식으로든 빌드/배포 파이프라인의 엣지 케이스를 건드린 것 같았다. 그래서 단순한 가설을 세웠다.

“포스트를 하나라도 만들어서 push하면, Vercel이 새 빌드를 정상적으로 배포하지 않을까?”

임시로 hello-world.md 한 개를 작성해서 push했다. 결과:

임시 포스트 push 후 옛 글들이 사라지고 새 포스트만 보이는 화면

옛날 샘플 글 3개가 전부 사라지고 새 포스트만 노출됐다. 가설이 맞았다.

정리

git에는 의도한 변경이 정확히 들어가 있었음에도, 호스팅 단계에서 결과가 다를 수 있다는 것을 직접 확인한 사례였다.

더 공부해볼 것

이번에는 “임시 포스트 push”라는 우회로 해결했지만, 아래는 아직 남은 의문들이다. 근본 원인을 짚어보고 싶을 때 따라가볼 학습 거리.

1. Astro 컨텐츠 컬렉션이 비어있을 때 빌드 동작

2. Vercel의 “Skipped Build” / “No changes” 동작

3. CDN/Edge 캐시

4. Pagefind 동작

5. 진단을 더 빨리 하려면

회고

원격 저장소와 로컬 빌드 산출물을 직접 검증해서 “내 코드는 맞다”는 걸 확정한 다음, 호스팅 쪽 이슈로 좁혀가는 흐름이 이번 디버깅의 핵심이었다. 처음에 dev 서버 캐시 탓으로 의심하느라 시간을 좀 썼는데, 다음부터는 원격 + 로컬 빌드 결과물 검증을 첫 단계로 두자.


Edit page
Share this post on:

Previous Post
Claude API는 기억하지 않는다 — 멀티턴 대화에서 컨텍스트를 유지하는 법