#dev 수정: 2026-05-28

Astro 블로그 빌드가 느릴 때, OG 이미지 캐시로 줄이는 방법

Astro 블로그에서 글마다 OG 이미지를 생성하면 글이 늘어날수록 빌드 시간이 길어진다. 매번 새로 만들 필요 없는 PNG를 캐시하고, 새 글이나 변경된 글만 다시 생성하는 방식으로 빌드를 줄이는 사고방식을 정리한다.

Astro 블로그를 직접 운영하다 보면 처음에는 잘 안 보이다가,
글이 늘면서 갑자기 신경 쓰이는 문제가 있다.

바로 빌드 시간이다.

특히 글마다 OG 이미지를 자동 생성하고 있다면 더 그렇다.

처음에는 몇 개 안 되니까 괜찮다.
그런데 글이 100개, 200개가 되면 이야기가 달라진다.

모든 글 읽기
→ 모든 OG 이미지 생성
→ 모든 페이지 빌드
→ 배포

이 흐름이면 매번 똑같은 PNG를 다시 만들게 된다.

그런데 생각해보면 이상하다.

제목과 설명이 안 바뀐 글의 OG 이미지는 매번 새로 만들 필요가 없다.

느린 이유는 이미지 생성이 반복되기 때문이다

Astro 자체 빌드도 시간이 들지만,
OG 이미지 생성은 별도의 비용이 있다.

보통은 이런 도구가 들어간다.

  • Satori
  • Resvg
  • Sharp
  • Canvas 계열 렌더링

이런 작업은 단순 HTML 생성보다 무겁다.

그래서 글마다 PNG를 다시 만들면 빌드 시간이 쉽게 늘어난다.

예를 들어 글이 200개라면:

200 posts
200 OG image render
200 PNG write

이 작업이 매번 반복된다.

하지만 실제로 매번 바뀌는 글은 보통 1~2개다.

캐시 기준은 파일명이 아니라 내용이어야 한다

처음에는 이렇게 생각하기 쉽다.

og-cache/{slug}.png 있으면 재사용

이 방식도 나쁘지는 않다.
하지만 글 제목이나 설명이 바뀌었는데 이미지가 그대로 남을 수 있다.

그래서 더 안전한 방식은 내용 기준 캐시다.

예:

cache key = hash(title + description + date + template version)

이렇게 하면 제목이나 설명이 바뀌면 캐시 키도 바뀐다.
반대로 아무것도 바뀌지 않은 글은 기존 이미지를 그대로 쓴다.

템플릿 버전도 캐시에 넣어야 한다

여기서 자주 놓치는 게 있다.

OG 이미지 디자인을 바꿨을 때다.

예를 들어:

  • 배경색 변경
  • 폰트 크기 변경
  • 로고 추가
  • 레이아웃 수정

이런 변경은 글 frontmatter가 바뀐 것은 아니다.
하지만 이미지는 다시 만들어야 한다.

그래서 캐시 키에 template version을 넣는 게 좋다.

OG_TEMPLATE_VERSION=2

이 값을 바꾸면 전체 OG 이미지를 새 템플릿 기준으로 다시 만들 수 있다.

GitHub Actions에서는 캐시 저장소를 따로 본다

로컬에서 캐시가 잘 된다고 끝이 아니다.

GitHub Actions는 매번 깨끗한 환경에서 시작한다.
그래서 캐시를 유지하려면 Actions cache를 써야 한다.

개념은 이렇다.

restore cache
→ build
→ 새 OG 이미지만 생성
→ save cache

즉, dist에 들어갈 최종 결과물과 og-cache는 역할이 다르다.

  • dist: 배포 결과물
  • og-cache: 다음 빌드를 빠르게 하기 위한 중간 산출물

이 둘을 섞으면 관리가 애매해진다.

build 폴더를 git에 넣는 방식은 조심해야 한다

가끔 이런 생각도 든다.

build 결과물을 main 브랜치에 같이 커밋하면 빠르지 않을까?

가능은 하다.
하지만 보통은 추천하지 않는다.

이유는 간단하다.

  • 빌드 결과물이 커밋마다 크게 늘어남
  • 실제 소스 변경과 생성물 변경이 섞임
  • 리뷰가 어려워짐
  • 충돌이 생기기 쉬움

정적 사이트 배포는 보통 소스와 결과물을 분리하는 게 낫다.

GitHub Pages라면:

main = source
gh-pages 또는 Pages artifact = build output
cache = Actions cache

이 구조가 깔끔하다.

로컬과 Actions 캐시는 따로 생각한다

또 하나 헷갈리는 지점이 있다.

로컬에서도 OG 이미지가 생성되고,
GitHub Actions에서도 생성된다.

그럼 두 번 관리해야 하나?

답은 반쯤 그렇다.

로컬 캐시
  = 개발 중 빠른 확인용

Actions 캐시
  = 배포 빌드 시간 단축용

둘은 같은 개념이지만 저장 위치가 다르다.

로컬 캐시를 git에 올릴 필요는 없다.
Actions cache가 배포 환경에서 따로 보관해주면 된다.

구현할 때 남기면 좋은 로그

캐시는 눈에 잘 안 보이기 때문에 로그가 중요하다.

예:

[og] cache hit slug=...
[og] cache miss slug=...
[og] generated slug=...
[og] copied from cache slug=...

이 정도만 있어도 빌드가 빨라졌는지 감이 온다.

특히 처음 한 번은 느리고,
두 번째부터 빨라지는 게 정상이다.

first build  = cache warm-up
second build = cache reuse

이걸 모르고 첫 빌드만 보면 캐시가 안 먹는 것처럼 보일 수 있다.

오늘 정리

Astro 블로그에서 OG 이미지를 자동 생성한다면,
글이 늘수록 빌드 시간이 늘어나는 건 자연스럽다.

하지만 모든 이미지를 매번 다시 만들 필요는 없다.

좋은 흐름은 이렇다.

글 메타데이터 hash 계산
→ 캐시 존재 확인
→ 있으면 재사용
→ 없으면 생성
→ Actions cache에 저장

이렇게 하면 새 글이나 바뀐 글만 이미지 생성 비용을 치르게 된다.

한 줄 요약

Astro 블로그 OG 이미지는 배포 결과물이 아니라 빌드 중간 산출물로 보고, 내용 기반 캐시를 적용해야 글이 늘어도 빌드 시간이 덜 늘어난다.

광고