저는 이전까지 타 플랫폼에 의존해 블로그를 운영하다가 이번에 자체적으로 블로그를 Next.js로 개발해 운영하게 되었는데요.
게시글을 마크다운(Markdown) 형식으로 작성할 생각이라 Next.js에서 어떻게 마크다운을 다룰지 고민하고 있었습니다.
마크다운 파싱
Next.js에서 마크다운을 컴포넌트로 파싱(Parsing)해주는 기술 스택으로는 next/mdx와 Contentlayer가 있습니다. next/mdx의 경우, 런타임에 Node.js의 fs를 통해 파일 시스템에 접근해 게시글을 읽어와야 하는데요. fs는 서버 컴포넌트에서만 사용 가능하므로 게시글을 다루는 모든 컴포넌트에는 SSR(Server Side Rendering)이 강제적으로 요구된다는 단점을 가지게 됩니다.
그에 비해 Contentlayer는 빌드 시점에 게시글들을 읽어와 JavaScript로 변환하기 때문에 클라이언트 컴포넌트에서도 접근할 수 있습니다.
그래서 유연함이나 성능 측면에서 Contentlayer가 뛰어나다고 생각해 Contentlayer를 사용하기로 했습니다.
Contentlayer 설정
앞서 설명드렸듯이, 저는 Contentlayer를 통해 마크다운을 다루기로 했는데요.contentlayer.config.ts
우선 Contentlayer를 사용하기 전에 contentlayer.config.ts에 게시글의 메타 데이터 형식과 마크다운 플러그인을 설정했는데요.
이후, 빌드를 수행하면 루트에 .contentlayer 디렉토리가 생성됩니다.21.mdx
---title: Next.js에서의 마크다운description: Next.js로 마크다운 기반 블로그 만들기date: 2024-12-02tags: [TypeScript, React, Next]---저는 이전까지 타 플랫폼에 의존해 블로그를 운영하다가 이번에 자체적으로 블로그를 Next.js로 개발해 운영하게 되었는데요.게시글을 마크다운(Markdown) 형식으로 작성할 생각이라 Next.js에서 어떻게 마크다운을 다룰 지 고민하고 있었습니다....
게시글을 컴포넌트로 파싱하기 위해서 useMdxComponent()를 사용할 수 있습니다.
이름에서 알 수 있듯이, useMdxComponent()는 커스텀 훅(Hook)이므로 클라이언트 컴포넌트에서만 사용 가능합니다.
그래서 따로 Markdown이라는 클라이언트 컴포넌트를 만들어 주었습니다.
useMdxComponent()에 게시글의 body에 있는 code를 주면 해당 code를 파싱해 컴포넌트를 반환하는데요.
이때, 반환된 컴포넌트는 components라는 Props를 전달받을 수 있습니다.
해당 Props를 활용하면 h1 등의 마크다운 전용 태그들을 커스텀할 수 있는데요.mdxComponents.tsx
이제 게시글 페이지에서는 게시글 번호를 경로 인자로 받아 게시글을 가져오고 해당 게시글을 Markdown 컴포넌트에 전달해 보여줄 수 있습니다.
또한 게시글은 빌드 시점에 Contentlayer에 의해 정적으로 생성되는데요.
그러므로 굳이 SSR(Server Side Rendering)을 사용할 이유가 없습니다.
그래서 각각의 게시글에 대한 페이지들을 SSG(Static Site Generation)로 렌더링하도록 했습니다.