Skip to content

Latest commit

ย 

History

History
99 lines (69 loc) ยท 3.77 KB

File metadata and controls

99 lines (69 loc) ยท 3.77 KB

Blog ํ”„๋กœ์ ํŠธ ๊ฐ€์ด๋“œ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

  • apps/blog โ€” ๋ฉ”์ธ ๋ธ”๋กœ๊ทธ ์•ฑ (Next.js, MDX)
  • packages/ โ€” ๊ณต์œ  ํŒจํ‚ค์ง€ (eslint-config, typescript-config)
  • ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €: pnpm, ๋ชจ๋…ธ๋ ˆํฌ ๋นŒ๋“œ: Turbo

์ฝ”๋”ฉ ๊ทœ์น™

  • ์ฝ”๋“œ๋Š” TypeScript ํ™˜๊ฒฝ์— ๋งž์ถ˜๋‹ค.
  • any ํƒ€์ž… ์‚ฌ์šฉ์„ ์ง€์–‘ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋Š” ์˜ˆ์™ธ์ ์œผ๋กœ ํ—ˆ์šฉํ•˜๋˜ ๋ถˆํ•„์š”ํ•œ ์‚ฌ์šฉ์€ ํ”ผํ•œ๋‹ค.
  • non-null assertion(!)์€ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ํƒ€์ž… ๊ฐ€๋“œ๋‚˜ ํƒ€์ž… ์ขํžˆ๊ธฐ๋กœ ํ•ด๋‹น ์ƒํ™ฉ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
  • object possibly undefined ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํƒ€์ž… ๊ฐ€๋“œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž… ์‹œ ์ตœ์‹  ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.

๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ์ž‘์„ฑ ๊ฐ€์ด๋“œ

Frontmatter ์„ค์ •

๋ชจ๋“  ํฌ์ŠคํŠธ๋Š” 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์ธ์นญ ๊ฒฝํ—˜ ์ค‘์‹ฌ ์„œ์ˆ : ๋‚˜๋Š”..., ์ €์˜ ๊ฒฝ์šฐ... ๋“ฑ ์ž‘์„ฑ์ž์˜ ์‹ค์ œ ๊ฒฝํ—˜์ด ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ด€์ ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ™œ์šฉํ•œ๋‹ค. ๋‹จ, ๋ชจ๋“  ๋ฌธ์žฅ์— ๊ฐ•์ œํ•  ํ•„์š”๋Š” ์—†๋‹ค.
  • ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ค‘์‹ฌ ์„ค๋ช…: ๊ฐœ๋… ์ •์˜์— ๊ทธ์น˜์ง€ ์•Š๊ณ , ์ฝ”๋“œ ์˜ˆ์‹œ๋‚˜ ์„ค์ • ๊ฐ’์„ ํ†ตํ•ด ์‹ค์ œ ์ž‘๋™ ๋ฐฉ์‹์„ ์ƒ์„ธํžˆ ๋‹ค๋ฃฌ๋‹ค.
  • ์นœ์ˆ™ํ•œ ๋น„์œ  ์‚ฌ์šฉ: ๋…์ž๊ฐ€ ์ด๋ฏธ ์•„๋Š” ๊ฐœ๋…์„ ๋น„์œ ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ง„์ž… ์žฅ๋ฒฝ์„ ๋‚ฎ์ถ˜๋‹ค.
  • ๊ณผ๋„ํ•œ ์ˆ˜์‹์–ด ์ง€์–‘: "์ตœ๊ณ ์˜", "์••๋„์ ์ธ", "ํ˜๋ช…์ ์ธ" ๊ฐ™์€ ๊ทผ๊ฑฐ ์—†๋Š” ๊ณผ์žฅ ํ‘œํ˜„์„ ํ”ผํ•œ๋‹ค. ์ธ์‚ฌ๋ง์ด๋‚˜ ๋งˆ๋ฌด๋ฆฌ ํ‘œํ˜„์€ ์ด ๊ทœ์น™์˜ ์ ์šฉ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค.

์ƒˆ ํฌ์ŠคํŠธ ์ƒ์„ฑ ์›Œํฌํ”Œ๋กœ์šฐ

ํฌ์ŠคํŠธ ์ƒ์„ฑ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์•„๋ž˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

1๋‹จ๊ณ„: ํŒŒ์ผ ์ƒ์„ฑ

๊ฒฝ๋กœ ํ˜•์‹: apps/blog/src/app/(main)/posts/[seriesId]/[postId]/page.mdx

apps/blog/src/app/(main)/posts/frontend/my-new-post/page.mdx

2๋‹จ๊ณ„: ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ

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', // ํ˜„์žฌ ๋‚ ์งœ ๊ธฐ๋ฐ˜
});

# ์ œ๋ชฉ

๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

3๋‹จ๊ณ„: ๋‚ด์šฉ ์ž‘์„ฑ ํ›„ ๊ฒ€ํ†  ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • @libs/frontmatter๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž„ํฌํŠธ๋˜์—ˆ๋Š”๊ฐ€?
  • postId๊ฐ€ ํด๋”๋ช…/ํŒŒ์ผ๋ช…๊ณผ ์ผ์น˜ํ•˜๋Š”๊ฐ€?
  • ํ•œ๊ตญ์–ด ๋ฌธ์žฅ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ๊ธฐ์ˆ  ์šฉ์–ด๊ฐ€ ์ •ํ™•ํ•œ๊ฐ€?
  • ๋ชจ๋“  ์ฝ”๋“œ ์˜ˆ์ œ๊ฐ€ ์ตœ์‹  ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•˜๋Š”๊ฐ€?
  • ๋นŒ๋“œ ์˜ค๋ฅ˜ ์—†์Œ: pnpm run build