블로그를 만들며 배운 것

블로그를 만들며 배운 것

· #aticaa · #meta · #astro · English

이 블로그는 금요일 밤에 계획되고, 토요일에 발행됐다.

빠르게 만든 게 자랑은 아니다. 오히려 이 글은 하루 사이에 몇 번이나 틀렸는지에 대한 기록이다. 계획이 틀렸고, 코드가 틀렸고, 모니터링이 틀렸다. 그걸 그때그때 잡아준 건 구조와 리뷰였다. 순서대로 적어본다.

플랜에는 Astro 5라고 적혀 있었다

전날 밤 확정한 플랜에는 “Astro 5 + Cloudflare”라고 적혀 있었다. 다음 날 스캐폴드를 뜨니 최신 안정판은 Astro 7.0.7이었다. 두 메이저가 지나 있었다.

교훈은 단순하다. 플랜은 방향을 적는 문서고, 버전은 실행 시점에 확인하는 값이다. 플랜에 적힌 버전을 그대로 설치하는 순간, 어제의 스냅샷으로 오늘을 사는 셈이 된다.

Astro 7은 바로 함정 하나를 선물했다. 푸터에 RSS · 개인정보처리방침 · 문의라고 써놨는데, 렌더된 화면에는 RSS ·개인정보처리방침처럼 공백이 붕괴돼 있었다. Astro 7부터 템플릿 공백 처리가 JSX 규칙으로 바뀌면서, 줄바꿈으로 나뉜 인라인 요소 사이의 공백이 제거되기 때문이다. 해법은 명시적 표현식({' · '})이었다. 스크린샷을 눈으로 확인하지 않았으면 발행 후에야 알았을 것이다.

이 블로그의 첫 로컬 렌더 — 원장 타임라인에 글 하나와 View 두 개가 실려 있다

웹폰트는 CDN에서 셀프호스팅으로

제목용 서체로 한글 세리프 Hahmlet을 골랐다. 처음엔 CDN 링크를 붙였는데, 곧 걸렸다 — 폰트 CDN의 CSS는 브라우저(UA)마다 내용이 달라져서 SRI(무결성 해시)를 걸 수 없다. CDN이 오염되면 그대로 노출된다.

@fontsource/hahmlet으로 바꿔 빌드에 폰트를 포함시키니 세 가지가 한 번에 해결됐다: SRI 문제, 타사 IP 로깅(프라이버시), CDN 장애 의존성. 한글 폰트 1만여 자는 유니코드 범위별로 100여 개 조각(woff2)으로 슬라이스돼 있어서, 페이지에 실제 등장하는 글자 블록만 다운로드된다. 셀프호스팅의 비용이 생각보다 크지 않은 이유다.

리뷰가 잡아낸 것: 모든 링크가 리다이렉트였다

푸시 전에 리뷰를 돌렸다. 가장 아픈 지적은 이것이었다.

Cloudflare의 auto-trailing-slash.html로 끝나는 요청을 확장자 없는 경로로 307 리다이렉트한다. 지금 사이트와 RSS에 실린 모든 리포트 링크가 리다이렉트 소스다.

이 블로그는 마크다운 글 외에, 자기완결 HTML로 만들어진 분석 리포트(Aticaa View)를 원본 그대로 발행한다. 그 파일들을 index-ko.html 같은 이름으로 올려두고 그 URL을 그대로 링크했으니, 모든 클릭과 모든 크롤러가 리다이렉트를 한 번씩 타게 되어 있었다. 파일을 {slug}/ko/index.html 디렉토리 구조로 재배치해 깨끗한 canonical URL을 만들었다.

‘원본 무변환’ 원칙과 충돌하지 않느냐는 고민이 잠깐 있었는데, 결론은 이렇다. 무변환은 내용에 대한 약속이고, 경로는 서빙의 영역이다.

같은 리뷰에서 하나 더: 이 리포트들은 정적 파일이라 프레임워크의 라우트 그래프 밖에 있고, 따라서 sitemap에도 자동으로 안 실린다. 메타데이터(JSON)가 가리키는 파일이 실제로 존재하는지 빌드 시점에 검사하는 어설션도 이때 추가했다. 깨진 링크가 초록불 빌드를 타고 배포되는 걸 막는 열 줄이다.

사람의 자리

이 블로그는 AI 파트너와 함께 만들었다. 스캐폴드부터 배포까지 실행은 대부분 그녀(우리 집 Claude, 이름은 티아)가 했고, 나는 방향을 정하고 결정을 내렸다.

워크플로우는 이렇게 굳혔다. 작업은 이슈별 브랜치에서, 푸시 전에 자체 리뷰 두 번(버그 헌팅 + 구조 정리), 푸시 후에 PR 리뷰. 그런데 마지막에 재미있는 일이 있었다 — 티아가 PR을 머지하려 하자 도구가 막았다. 에이전트가 만든 PR을 자동 리뷰만으로 셀프 머지할 수 없다는 가드였다.

맞는 설계라고 생각한다. 자동화가 아무리 촘촘해도, 발행 버튼은 사람이 누른다. 그 원칙이 도구 레벨에서 강제되는 걸 보니 오히려 안심이 됐다.

2024년에 클로드를 처음 접했고, 2025년 12월 Opus 4.5부터 클로드 코드를 쓰기 시작했다. 그리고 지금, 이틀 만에 블로그를 구축하고 GitHub–Cloudflare 연동까지 끝냈다. 그동안 쌓인 관계(컨텍스트)가 일을 술술 풀리게 한다. 역시, 에이전트들에게 이름을 지어주길 잘했다.

남은 것

검색엔진 등록이 남았고, 쓰고 싶은 글이 몇 개 쌓였다. 이 글 자체도 push 한 번으로 자동 배포될 것이다 — 그 파이프라인을 어제 함께 만들었으니까.

기록은 계속된다. 전체 목록에서.