Skip to content

fix(blog): frontmatter 파서 견고화 (#99, 파서 부분만)#126

Merged
Malloc72P merged 3 commits into
mainfrom
claude/issue-99-frontmatter-parser
Jul 1, 2026
Merged

fix(blog): frontmatter 파서 견고화 (#99, 파서 부분만)#126
Malloc72P merged 3 commits into
mainfrom
claude/issue-99-frontmatter-parser

Conversation

@Malloc72P

Copy link
Copy Markdown
Owner

#99 검토 결과 캐싱(성능)과 파서 견고화(정합성)를 분리했습니다. 캐싱은 28포스트 기준 빌드 12초로 지금 급하지 않다고 판단해 제외하고, 정합성 버그(silent skip)만 처리합니다.

문제

  • parseFrontmatterMetadata가 작은따옴표(') 전용 정규식이라 큰따옴표/백틱 사용 시 조용히 실패
  • 필수 필드(title/date) 누락 시 어떤 로그도 없이 null 반환 → getAllMdxFiles가 그 포스트를 통째로 목록에서 스킵 → 빌드는 성공하는데 포스트가 사라짐
  • fs 읽기 실패는 console.error만 찍고 역시 조용히 스킵

변경

  • extractStringField/extractArrayField: 작은/큰따옴표/백틱 모두 허용하도록 정규식 확장
  • 파싱 실패(블록 미발견/필수 필드 누락/fs 읽기 실패) → 파일 경로를 포함해 throw, getAllMdxFiles가 잡지 않고 그대로 전파 → 빌드 실패로 승격
  • 반환 타입 MdxFileInfo['frontMatter'] | null → 논널러블로 정리

검증

  • mdx-utils.test: 기존 null 기대 케이스 2개를 throw 기대로 수정 + 큰따옴표/백틱/에러 메시지 경로 케이스 4개 추가
  • 실제 28개 포스트로 프로덕션 빌드 성공 — 모두 작은따옴표라 회귀 없음 확인
  • 단위 84 / E2E 8(프로덕션) / lint 0 / tsc clean

🤖 Generated with Claude Code

- extractStringField/extractArrayField: 작은따옴표 전용 → 작은/큰따옴표/백틱 모두 허용
- parseFrontmatterMetadata/extractMetadata: null 반환(silent skip) → 파일 경로를 포함해 throw
  블록 미발견, title/date 누락, fs 읽기 실패 모두 빌드를 실패시켜 포스트가 목록에서
  조용히 사라지는 것을 방지
- getAllMdxFiles: metadata null 체크 제거(더 이상 nullable 아님, 예외는 상위로 전파)
- mdx-utils.test: 두 실패 케이스를 throw 기대로 수정 + 큰따옴표/백틱/에러 메시지 경로 케이스 추가
- 캐싱(성능)은 이번 범위에서 제외 — 파서 정합성만 우선 처리

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
blog Ignored Ignored Preview Jul 1, 2026 1:23am

리뷰 중 확인: 실제 frontmatter 값 중 내부에 혼합 따옴표를 쓰는 사례는 없음(검증 완료).
값 내부 이스케이프는 정규식 파서의 알려진 한계로 남기고, 왜 다루지 않는지 주석으로 근거를 남김.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Malloc72P

Copy link
Copy Markdown
Owner Author

🔍 코드 리뷰 (self-review)

발견 및 반영 (8bd02ed)

값 내부에 이스케이프된 같은 종류 따옴표(예: "it's")가 있으면 그 지점에서 값이 잘리는 정규식 파서의 알려진 한계를 발견했습니다.

  • 실제 콘텐츠 전수 확인: frontmatter({...}) 블록 내부에 혼합 따옴표를 쓰는 사례는 없음(매칭된 것들은 본문 예제 코드이거나 posts/ 밖의 별개 페이지) → 지금 실제 위험은 없음을 확인했습니다.
  • 이스케이프 파싱을 추가하는 대신, 왜 다루지 않는지 주석으로 명시했습니다(Simplicity First — 필요해지기 전에 복잡도를 추가하지 않음). 실제로 필요해지면 그때 정규식을 확장하면 됩니다.

검토했지만 변경하지 않은 것

  • "파일 하나 실패로 빌드 전체가 죽는 게 너무 가혹하지 않나?" — 의도된 동작입니다. 이슈 자체가 "silent skip 금지, 파싱 실패를 빌드 실패로 승격"을 명시적으로 요구했고, 실제 28개 포스트로 프로덕션 빌드가 성공하는 걸 확인했습니다. 앞으로 오타로 인한 파싱 실패가 나면 CI가 즉시 빨간불로 알려주는 게 조용히 글이 사라지는 것보다 낫습니다.

…w-up)

기존 api 테스트(find-posts/find-tags/find-series)는 전부 getAllMdxFiles를 mock하므로
실제 fs 스캔이나 parseFrontmatterMetadata의 throw 전파는 어디서도 검증되지 않고 있었다
(과거 이를 real fs로 검증하던 constants.test.ts는 #89에서 삭제됨).

- '실제 posts 디렉토리 스캔 시 던지지 않고 모든 글이 title/date를 갖는다' — 회귀 가드.
  향후 어떤 포스트의 frontmatter가 깨지면 pnpm build를 기다리지 않고 pnpm test에서 바로 드러남
- '깨진 frontmatter가 있으면 getAllMdxFiles 호출 자체가 던진다' — 임시 디렉토리 fixture로
  parseFrontmatterMetadata의 throw가 getAllMdxFiles까지 정상 전파됨을 검증

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Malloc72P

Copy link
Copy Markdown
Owner Author

✅ 회귀 검증 테스트 추가 (e2e3ed3)

좋은 지적 감사합니다 — 정확히 맞습니다. 기존 find-posts.test.ts/find-tags.test.ts/find-series.test.ts는 전부 getAllMdxFilesmock해서, 이번 PR이 바꾼 "실제 fs 스캔 + 예외 전파"는 어디서도 검증되지 않고 있었습니다. (과거 이를 실제 fs로 검증하던 constants.test.ts는 #89에서 하드코딩 추천 로직과 함께 삭제됨.)

getAllMdxFiles 통합 테스트 2건 추가:

  1. 회귀 가드: getAllMdxFiles()(실제 posts 디렉토리, mock 없음)가 던지지 않고 모든 글이 title/date를 갖는지 확인. 앞으로 어떤 포스트의 frontmatter가 깨지면 pnpm build까지 안 기다리고 pnpm test에서 바로 드러남.
  2. 전파 검증: 임시 디렉토리에 정상 1개 + date 누락 1개 fixture를 만들어, parseFrontmatterMetadata의 throw가 getAllMdxFiles까지 정상 전파되는지 확인.

검증

  • 단위 21스위트/86개 통과, tsc/lint clean

@Malloc72P Malloc72P merged commit 3677901 into main Jul 1, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant