Published on

Markdown vs MDX 가이드

📘 Markdown(.md) vs MDX(.mdx) 가이드

  1. Markdown(.md)이란?

텍스트를 쉽게 꾸미는 문법

README, 블로그 글, 기술 문서 등에서 가장 많이 사용

.md 확장자를 가짐

순수한 텍스트 + 마크다운 문법만 사용 가능

✅ 예시 (post.md)

title: '마크다운 예제 글'
date: '2025-01-01'
tags: ['Markdown', 'Blog']

# 안녕하세요 👋

이 글은 **마크다운**으로 작성되었습니다.

- 리스트 1
- 리스트 2

[링크](https://example.com)
  1. MDX(.mdx)란?

Markdown + JSX (리액트 컴포넌트 삽입 가능)

.mdx 확장자를 가짐

마크다운 문법은 그대로 사용하면서, 필요할 때 React 컴포넌트를 직접 불러와 쓸 수 있음

Next.js, Gatsby, Docusaurus 같은 React 기반 프레임워크에서 자주 사용

✅ 예시 (post.mdx)

title: 'MDX 예제 글'
date: '2025-01-02'
tags: ['MDX', 'React']

#MDX 예제 ✨

마크다운 문법은 그대로 쓰면서...

<Button>클릭하세요</Button>

<MyChart data={chartData} />

👉 여기서 <Button><MyChart>는 React 컴포넌트입니다.
즉, 블로그 글 안에서 버튼, 차트, 동적 UI를 직접 넣을 수 있습니다.

  1. 공통점

둘 다 Frontmatter(---로 감싼 메타데이터) 사용 가능

글 본문에서 마크다운 문법 (# 제목, 굵게, 리스트) 지원

#4. 차이점 요약

구분 .md .mdx
기본 기능 텍스트 + 마크다운 텍스트 + 마크다운 + JSX
확장성 정적 문서 작성 리액트 컴포넌트 삽입 가능 (동적)
실행 환경 어디서나 사용 가능 (GitHub, 블로그 등) React 기반 환경 필요 (Next.js, Gatsby 등)
예시 블로그 글, README 블로그 글 + 인터랙티브 컴포넌트
  1. 언제 어떤 걸 써야 할까?

단순히 글만 작성한다면 → .md

글 속에 컴포넌트, 차트, 인터랙티브 기능을 넣고 싶다면 → .mdx

👉 예를 들어:

기술 블로그(문서 위주) → .md면 충분

개발 블로그(코드 실행 버튼, 차트, 동적 UI) → .mdx 권장

#6. Next.js + Contentlayer에서 사용하기

#설치

npm install contentlayer next-contentlayer @mdx-js/react

#next.config.js

const { withContentlayer } = require('next-contentlayer')

module.exports = withContentlayer({
  experimental: {
    appDir: true,
  },
})

#posts/hello.mdx (글 작성)

---
title: 'Hello MDX'
date: '2025-01-03'
---

# Hello World

&lt;Button&gt;클릭!&lt;/Button&gt;

#페이지에서 불러오기

import { allPosts } from 'contentlayer/generated'
import { useMDXComponent } from 'next-contentlayer/hooks'

export default function Post({ params }) {
  const post = allPosts.find((p) => p._raw.flattenedPath === params.slug)
  const MDXContent = useMDXComponent(post.body.code)

  return (
    <article>
      <h1>{post.title}</h1>
      <MDXContent />
    </article>
  )
}

✅ 요약

.md = 마크다운 문법만 → 정적 글

.mdx = 마크다운 + React → 동적인 글

둘 다 Frontmatter 지원

Next.js + Contentlayer 같은 환경에서 둘 다 불러올 수 있지만, 컴포넌트를 쓰려면 mdx를 선택해야 함