가장 최근에 쓴 글(로컬은 됐는데, 왜 거기서만 안 됐을까)을 발행하고 나서 바로 확인해봤다. 최신 글이니까 “이전 글”만 있고 “다음 글”은 없어야 정상인데, 화면엔 정반대로 나와 있었다 — “이전 글”이 안 보이고 “다음 글”만 있었다. 눌러보니 어제 쓴 글로 갔다.
인덱스 방향이 반대였다
코드([...slug]/index.astro)를 열어보니 원인은 배열 인덱스 하나였다. 글 목록을
정렬하는 getSortedPosts는 최신순이다 — 0번이 제일 최근 글, 숫자가 커질수록
오래된 글이다. 근데 getStaticPaths는 prevPost를 index - 1, nextPost를
index + 1로 잡고 있었다.
배열이 최신순이니 index - 1은 숫자가 더 작은 자리, 즉 더 최신 글이고
index + 1은 더 오래된 글이다. “이전 글”이 실제로는 더 최신 글을 가리키고
“다음 글”이 더 오래된 글을 가리키는 셈이었다 — 읽는 사람이 기대하는 방향(이전=과거,
다음=미래)과 정확히 반대였다.
같은 파일 안에 시리즈 네비게이션도 있는데, 이건 멀쩡했다. 시리즈는
getSortedSeriesPosts가 seriesOrder 오름차순(1편이 0번)으로 정렬해서, 같은
index - 1/index + 1 코드를 그대로 써도 방향이 우연히 맞아떨어지고 있었다.
정렬 방향이 반대인 두 데이터에 똑같은 인덱스 계산을 재사용한 게 문제였다 — 시리즈
쪽이 우연히 맞았기 때문에, 일반 글 쪽이 반대라는 게 오히려 더 뚜렷하게 보였다.
내가 만든 버그인 줄 알았는데
시리즈 기능은 이 블로그에서 나중에 따로 추가한 커스텀 기능이다. 그 기능을 넣으면서
getStaticPaths를 고치다가 실수로 방향을 뒤집었을 가능성이 제일 커 보였다.
확인해보려고 AstroPaper 원본 저장소의 같은 파일을
직접 가져와봤다. 시리즈 기능이 아예 없는 원본에도 똑같은 코드가 그대로 있었다 —
prevPost: sortedPosts[index - 1], nextPost: sortedPosts[index + 1]. 내가
새로 만든 버그가 아니라 테마 자체에 원래 있던 버그였다.
포크에도 고치고, 원본에도 보냈다
이 블로그 쪽 코드는 인덱스를 서로 바꿔서 바로 고쳤다. 그리고 전 세계 AstroPaper 사용자들도 똑같이 겪고 있을 문제라 원본에도 고쳐서 보내기로 했다.
이미 갖고 있던 포크(LazyEngineer99/astro-paper)를 업스트림과 동기화하고, 브랜치를
만들어 같은 방식으로 고쳤다. astro check, eslint, prettier 전부 통과하는 걸
확인하고 커밋했다.
여기서 예전에 AstroPaper에 PR을 열 때 겪었던 것과
같은 벽을 또 만났다. gh pr create가 Resource not accessible by personal access token으로 막혔다 — 지금 연결된 토큰이 남의 저장소에 PR을 여는 권한이 없었다.
그때처럼 토큰을 새로 받아서 임시로 주입하는 대신, 이번엔 그냥 git push가 알려준
링크로 GitHub 웹에서 직접 열었다.
그렇게 연 게 PR #674다.
남는 생각
이번엔 “권한이 없어서 막혔다”에서 굳이 권한을 뚫으려 하지 않고 그냥 손으로 여는 쪽을 골랐다. 예전(PR 세 개 열 때)엔 매번 토큰을 다시 받아서 CLI로 뚫었는데, 그때도 결국 세션이 바뀌면 다시 막히는 걸 세 번이나 겪었다. 자동화가 매번 막히는 지점이면, 그 지점만큼은 자동화를 고집하기보다 제일 빠른 수동 경로로 우회하는 게 나을 때도 있다.
그리고 버그 자체보다 인상 깊었던 건 발견 경로였다. 시리즈 네비게이션과 일반 글 네비게이션, 같은 파일 안에 성격이 비슷한 코드 두 벌이 있었고 하나는 맞고 하나는 틀렸다. 둘을 나란히 비교할 수 있었기 때문에 “이게 원래 이런 건가, 아니면 틀린 건가”를 감이 아니라 대조로 확인할 수 있었다. 비슷한 로직이 여러 군데 있다면, 그중 하나가 의심스러울 때 나머지와 비교해보는 것만으로 답이 나올 때가 있다.
추가 (2026-08-03)
PR #674가 메인테이너 승인을 받고 곧바로 main에 merge됐다.