Skip to content
Go DevBJ
Go back

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

Edit page

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

바로 빌드 시간이다.

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

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

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

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

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

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

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

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

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

이런 작업은 단순 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는 역할이 다르다.

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

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 이미지는 배포 결과물이 아니라 빌드 중간 산출물로 보고, 내용 기반 캐시를 적용해야 글이 늘어도 빌드 시간이 덜 늘어난다.


Edit page
Share this post on:

Previous Post
AI로 기술 블로그 글감 뽑을 때 망하는 패턴과 안전한 흐름
Next Post
기술 블로그 주제가 너무 좁을 때, 유입용 카테고리 다시 잡는 법