apps/blogโ ๋ฉ์ธ ๋ธ๋ก๊ทธ ์ฑ (Next.js, MDX)packages/โ ๊ณต์ ํจํค์ง (eslint-config, typescript-config)- ํจํค์ง ๋งค๋์ : pnpm, ๋ชจ๋ ธ๋ ํฌ ๋น๋: Turbo
- ์ฝ๋๋ TypeScript ํ๊ฒฝ์ ๋ง์ถ๋ค.
anyํ์ ์ฌ์ฉ์ ์ง์ํ๋ค. ํ ์คํธ ์ฝ๋์์๋ ์์ธ์ ์ผ๋ก ํ์ฉํ๋ ๋ถํ์ํ ์ฌ์ฉ์ ํผํ๋ค.- non-null assertion(
!)์ ์ ๋ ์ฌ์ฉํ์ง ์๋๋ค. ํ์ ๊ฐ๋๋ ํ์ ์ขํ๊ธฐ๋ก ํด๋น ์ํฉ์ ๋ง๋ค์ง ์๋๋ค. object possibly undefined์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ์ ๊ฐ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.- ์๋ก์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ์ ์ต์ ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ํ๋ค.
๋ชจ๋ ํฌ์คํธ๋ MDX ํ์ผ ์๋จ์ frontmatter๋ฅผ ์ ์ํด์ผ ํ๋ค. @libs/frontmatter์ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
import { frontmatter } from '@libs/frontmatter';
export const metadata = frontmatter({
title: 'ํฌ์คํธ ์ ๋ชฉ',
description: 'ํฌ์คํธ์ ๋ํ ์งง์ ์์ฝ (1~2๋ฌธ์ฅ)',
seriesId: '์นดํ
๊ณ ๋ฆฌ๋ช
(์: frontend, ai)',
postId: 'ํฌ์คํธ-์๋ณ์ (ํ์ผ๋ช
๊ณผ ๋์ผํด์ผ ํจ)',
tags: ['ํ๊ทธ1', 'ํ๊ทธ2'],
date: 'YYYY-MM-DD HH:mm',
});์ฃผ์์ฌํญ:
postId๋ ํ์ผ ์์คํ ๊ฒฝ๋ก๋ก ์ฌ์ฉ๋๋ฏ๋ก ํ์ผ ์ด๋ฆ๊ณผ ์ ํํ ์ผ์นํด์ผ ํ๋ค.date๋YYYY-MM-DD HH:mmํ์์ ์ค์ํด์ผ ํ๋ค.
#(H1)์ ํฌ์คํธ ๋ด์์ ํ ๋ฒ๋ง ์ฌ์ฉํ๋ฉฐ ํฐ ์น์ ์ ์์์ผ๋ก ํ์ฉํ๋ค. (์ ๋ชฉ์ metadata์ title ๊ฐ์ ์์คํ ์ด ์ฌ์ฉ)##(H2),###(H3)๋ก ๋ ผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ก๋๋ค.
- ์ธ์ด ๋ช
์๋ฅผ ์์น์ผ๋ก ํ๋ค. (์:
```typescript,```json) - ํ์ํ ๊ฒฝ์ฐ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ฃผ์์ผ๋ก ํฌํจํ๋ค.
- ์ด๋ฏธ์ง๋ public ํด๋์ ์์น์ํค๊ณ , ์ ๋ ๊ฒฝ๋ก๋ก ์ฐธ์กฐํ๋ค. (์:
/image-name.png) altํ ์คํธ๋ฅผ ๋ฐ๋์ ์์ฑํ๋ค.
- 1์ธ์นญ ๊ฒฝํ ์ค์ฌ ์์ :
๋๋...,์ ์ ๊ฒฝ์ฐ...๋ฑ ์์ฑ์์ ์ค์ ๊ฒฝํ์ด ๋๋ฌ๋๋ ๊ด์ ์ ์์ฐ์ค๋ฝ๊ฒ ํ์ฉํ๋ค. ๋จ, ๋ชจ๋ ๋ฌธ์ฅ์ ๊ฐ์ ํ ํ์๋ ์๋ค. - ๋ฉ์ปค๋์ฆ ์ค์ฌ ์ค๋ช : ๊ฐ๋ ์ ์์ ๊ทธ์น์ง ์๊ณ , ์ฝ๋ ์์๋ ์ค์ ๊ฐ์ ํตํด ์ค์ ์๋ ๋ฐฉ์์ ์์ธํ ๋ค๋ฃฌ๋ค.
- ์น์ํ ๋น์ ์ฌ์ฉ: ๋ ์๊ฐ ์ด๋ฏธ ์๋ ๊ฐ๋ ์ ๋น์ ๋ก ์ฌ์ฉํ์ฌ ์ง์ ์ฅ๋ฒฝ์ ๋ฎ์ถ๋ค.
- ๊ณผ๋ํ ์์์ด ์ง์: "์ต๊ณ ์", "์๋์ ์ธ", "ํ๋ช ์ ์ธ" ๊ฐ์ ๊ทผ๊ฑฐ ์๋ ๊ณผ์ฅ ํํ์ ํผํ๋ค. ์ธ์ฌ๋ง์ด๋ ๋ง๋ฌด๋ฆฌ ํํ์ ์ด ๊ท์น์ ์ ์ฉ ๋์์ด ์๋๋ค.
ํฌ์คํธ ์์ฑ ์์ฒญ์ ๋ฐ์ผ๋ฉด ์๋ ์์๋ก ์งํํ๋ค.
๊ฒฝ๋ก ํ์: apps/blog/src/app/(main)/posts/[seriesId]/[postId]/page.mdx
apps/blog/src/app/(main)/posts/frontend/my-new-post/page.mdx
import { frontmatter } from '@libs/frontmatter';
export const metadata = frontmatter({
title: '์ ๋ชฉ์ ์
๋ ฅํ์ธ์',
description: '์ค๋ช
์ ์
๋ ฅํ์ธ์',
seriesId: 'frontend', // ๋๋ ai ๋ฑ
postId: 'my-new-post', // ํด๋๋ช
๊ณผ ๋์ผ
tags: [],
date: '2026-03-23 09:00', // ํ์ฌ ๋ ์ง ๊ธฐ๋ฐ
});
# ์ ๋ชฉ
๋ด์ฉ์ ์์ฑํ์ธ์.-
@libs/frontmatter๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ํฌํธ๋์๋๊ฐ? -
postId๊ฐ ํด๋๋ช /ํ์ผ๋ช ๊ณผ ์ผ์นํ๋๊ฐ? - ํ๊ตญ์ด ๋ฌธ์ฅ์ด ์์ฐ์ค๋ฝ๊ณ ๊ธฐ์ ์ฉ์ด๊ฐ ์ ํํ๊ฐ?
- ๋ชจ๋ ์ฝ๋ ์์ ๊ฐ ์ต์ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ํ๋๊ฐ?
- ๋น๋ ์ค๋ฅ ์์:
pnpm run build