LogoSEO Jing
  • All Posts
  • SEO Jing
  • okayJing
  • KD Team
  • CLAB Coreteam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

DevLogSEO JingInsight

MDX DOM 트리 파싱하기

2026년 3월 14일·5분 읽기

전체 흐름

content/*.mdx → [gray-matter로 파싱] → [fs로 스캔] → content-tree.json → [페이지에서 import] → FileExplorer

gray-matter

packages/utils에 설치했고, MDX 파일 상단의 frontmatter(YAML 메타데이터)를 파싱하는 데 사용한다.

yaml
---
title: React 시작하기
date: "2025-03-05"
tags: [react, frontend]
description: React의 기본...
---
  • MDX/마크다운 frontmatter 파싱의 사실상 표준 (Next.js 공식 예제에서도 사용)
  • 파일 내용 전체를 읽어서 { data, content }로 분리해줌
  • YAML/TOML/JSON frontmatter 모두 지원
  • 의존성이 가볍고, 빌드 타임에만 사용

scanContentDir()

content/ 디렉토리를 재귀 스캔해서 트리 구조 JSON을 만드는 함수다.

동작 과정:
  1. fs.readdirSync()로 현재 디렉토리의 엔트리(파일/폴더)를 읽음
  2. 각 엔트리를 순회하면서:
    • 폴더면 → 자기 자신을 재귀 호출해서 children을 채움
    • 파일이면 → 확장자 추출 후, .mdx/.md면 matter(raw)로 frontmatter 파싱
  3. 정렬: 폴더가 먼저, 파일이 나중 (한국어 정렬 localeCompare("ko"))
ts
const raw = fs.readFileSync(fullPath, "utf-8"); // MDX 파일 전체 읽기
const { data } = matter(raw); // frontmatter → JS 객체
// data = { title: "React 시작하기", date: "2025-03-05", tags: [...], ... }

getItemsForPath()

생성된 트리에서 특정 경로의 아이템만 꺼내는 함수다.
targetPath = "/frontend/hooks"
  → segments = ["frontend", "hooks"]
  → tree에서 name === "frontend"인 폴더 찾기 → 그 children으로 이동
  → children에서 name === "hooks"인 폴더 찾기 → 그 children 반환

루트(/)면 tree 자체를 반환하고, 경로가 존재하지 않으면 빈 배열 [] 반환.


빌드 스크립트

tsx(TypeScript executor)로 실행되는 빌드 스크립트로, pnpm dev 또는 pnpm build 전에 자동 실행된다.

json
"generate:content": "tsx scripts/generate-content-tree.ts",
"dev": "pnpm run generate:content && vinext dev",
"build": "pnpm run generate:content && vinext build"
  1. content/ 디렉토리에 scanContentDir() 호출 2. 결과를 src/generated/content-tree.json에 JSON으로 저장 3. 이 JSON은 .gitignore에 포함되어 커밋되지 않음 (매번 빌드 시 생성)

페이지에서 사용

tsx
import contentTree from "../../generated/content-tree.json"; // 정적 import

// 쿼리스트링에서 현재 경로 추출
const currentPath =
  new URLSearchParams(window.location.search).get("path") || "/";

// 해당 경로의 아이템 가져오기
const nodes = getItemsForPath(contentTree, currentPath);

// ContentNode[] → ExplorerItem[] 변환 후 FileExplorer에 전달
const items = toExplorerItems(nodes);

요약

구성 요소위치역할
gray-matterpackages/utils 의존성MDX frontmatter → JS 객체 파싱
scanContentDir()content.tsfs로 디렉토리 재귀 스캔 + frontmatter 파싱 → 트리 생성
getItemsForPath()content.ts

Post Q&A

오케이징에게 물어보기

MDX DOM 트리 파싱하기 전체를 기준으로 질문과 피드백을 받아요.답을 본 뒤에는 이 내용을 댓글로 달아서 서징에게도 물어볼 수 있어요. 작성자가 직접 볼 수 있어요!

0/500

포스트 목록

/SEOJing/devLog/insight
파일 10개, 폴더 0개
엄청난 피드백생각보다 어려웠던 댓글, 완독 로컬스토리지디자인 시스템을 구축할 때 주의할 점폰트는 왜 메인 페이지에서만 적용이 안되고 있었을까?MDX DOM 트리 파싱하기MDX 관련 이슈 노트결국 Node.js 까지 와버렸다전체적인 플로우Storybook으로 디자인 시스템 테스팅하기MDX가 뭘까?

같은 섹션의 대표 이미지

10 posts · latest first
SEO Jing26. 03. 15.

엄청난 피드백.

CLI 코드 리뷰에서 받은 피드백과 전체 코드 수정 계획을 정리했다.

26. 03. 15.SEOJing
트리에서 특정 경로의 아이템만 추출
generate-content-tree.tsscripts/빌드 타임에 JSON 생성
content-tree.jsonsrc/generated/ (자동 생성)정적 JSON, 페이지에서 import
SEO Jing26. 03. 15.

생각보다 어려웠던 댓글, 완독 로컬스토리지.

localStorage만으로 글 읽기 추적, 스크롤 진행률, 댓글 감지를 구현한 과정을 정리했다.

26. 03. 15.SEOJing
SEO Jing26. 03. 15.

MDX 관련 이슈 노트.

블로그 디테일 페이지에서 MDX를 렌더링하기 위해 검토한 라이브러리들과 최종 선택 과정.

26. 03. 15.SEOJing
SEO Jing26. 03. 14.

디자인 시스템을 구축할 때 주의할 점.

디자인 시스템 구현 시 파일 구조, 디자인 토큰, 유의 사항을 정리했다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

폰트는 왜 메인 페이지에서만 적용이 안되고 있었을까?.

Tailwind v4 환경에서 폰트가 메인 페이지에서만 적용되지 않던 원인과 Hydration Mismatch 이슈를 정리했다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

MDX DOM 트리 파싱하기.

MDX 파일의 경로 탐색 로직과 콘텐츠 트리 생성 과정을 정리했다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

결국 Node.js 까지 와버렸다.

MDX 파일 구조를 JSON으로 변환하기 위해 Node.js의 fs 모듈을 배워봤다.

26. 03. 14.SEOJing
SEO Jing26. 03. 13.

전체적인 플로우.

SEO Jing 프로젝트의 기술 스택 선정과 전체적인 개발 플로우 정리.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

Storybook으로 디자인 시스템 테스팅하기.

Storybook의 사용법과 디자인 시스템 개발에서의 장점을 정리했다.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

MDX가 뭘까?.

MDX의 개념과 블로그에서 활용하는 이유를 정리했다.

26. 03. 13.SEOJing