[ Introduction > Blog ]
[๋ธ๋ก๊ทธ ์๊ฐ] ํ๋ก ํธ์๋ - ์๋ํฐ
๋ธ๋ก๊ทธ ์๊ฐ โ ์๋ํฐ
์๋
ํ์ธ์. ์ฒซ ๋ฒ์งธ ๋ธ๋ก๊ทธ ๊ธ์
๋๋ค.
์ ๋ ํ๋ก๊ทธ๋๋ฐํ๋ฉด์ ๊ณ ๋ฏผํ๊ณ ํด๊ฒฐํ ๊ณผ์ ์ ๊ธฐ๋กํ๊ณ ๊ณต์ ํ๊ธฐ ์ํด ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ธ์ ์ ์ฐ๋ ํธ์ ์๋์ง๋ง, ์์ ยท๋ณด์ํ๋ฉด์ ํจ์จ์ ์ผ๋ก ์ง์์ ๋๋ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ ์ ๊ฐ ์ง์ ๋ง๋ ๋ธ๋ก๊ทธ ์๋ํฐ๋ฅผ ์๊ฐํ๋ ค ํฉ๋๋ค.
1๋ฌ ๊ฐ๊น์ด ๋ค์ํ ์๋ํฐ๋ฅผ ํ
์คํธํ๊ณ , ๊ฒฐ๊ตญ ProseMirror ๊ธฐ๋ฐ Tiptap์ ์ ํํ์ต๋๋ค.
ํํญ์
ํ์ฅ์ฑ์ด ๋ฐ์ด๋๊ณ
Viewer๋ฅผ JSON/Text ํ์ ๋ชจ๋ SSR ๊ฐ๋ฅ
Next.js & ๋ฐฑ์๋์ ๊ถํฉ์ด ์ข์
์๋ํฐ | SSR | ํ์ฅ์ฑ | ์์ง | WYSIWYG | Markdown | RIch Text | ๊ธฐํ |
---|---|---|---|---|---|---|---|
editor.js | ๐ก | โ๏ธ | ์์ฒด | โ | ๐ก | โ | ๋ฌธ์ ์ข์. Json ๊ตฌ์กฐ. |
react-md-editor | โ | โก๏ธ | ์์ฒด | โ | โ | โ | ์ด์ง์ ์ฌ์ฉ์ฑ ์์ข์. |
toast UI | โ | โฌ๏ธ | ProseMirror | โ | โ | โ | ๋ฌธ์ํ ๋์จ. ํ๋ฌ๊ทธ์ธ ์ ์. |
quill | ๐ก | โ๏ธ | Delta | โ | ๐ก | โ | ๋ฌธ์ ์ข์. JSON ๊ตฌ์กฐ. |
TipTap | โ | โ๏ธ | ProseMirror | โ | ๐ก | โ | ๋ฌธ์ ๋ณดํต. ๊ธฐ๋ฅ ์ ๋๋จ. |
ProseMirror | โ | โฌ๏ธ | ์์ฒด | โ | โ | ๐ก | ๋ฌธ์ ์ต๊ณ . ๋์ ๋ฌ๋ ์ปค๋ธ. |
๐ ๊ฒฐ๋ก : ๊ฐ๋จ ๊ธฐ๋ฅ ์์ฃผ๋ผ๋ฉด Quill/Editor.js ์ถ์ฒ. ํ์ง๋ง ์ปค์คํ ๊ธฐ๋ฅ ๋ง์ด ํ์ํ๋ค๋ฉด Tiptap/ProseMirror๊ฐ ์ต์ ์ผ ๊ฒ์ ๋๋ค.
1. ๊ธฐ๋ฅ ์ ์
์ ์ ์๋ํฐ์ ํ์ํ ๊ธฐ๋ฅ๋ค์ ๊ธฐ๋ฅ๋ค์ ์ ๋ฆฌํด ๋ดค์ต๋๋ค.
๊ธฐ๋ณธ ํ ์คํธ ํธ์ง ๊ธฐ๋ฅ
๊ธ์จ์ฒด ๋ณ๊ฒฝ (๊ตต๊ฒ, ๋ฐ์ค, ๊ธฐ์ธ์, ์๊น, ๋ฐฐ๊ฒฝ์)
๊ธ๋จธ๋ฆฌ ๊ธฐํธ, ๋ฒํธ ๊ธฐํธ, ์ฒดํฌ ๋ฆฌ์คํธ
๋ฌธ๋จ ์ข, ์ฐ, ๊ฐ์ด๋ฐ ์ ๋ ฌ
๋งํฌ๋ค์ด ๋ฌธ๋ฒ ์ง์ (#์ ๊ณ ๋์ฐ๋ฉด h1 ํ๊ทธ.. ```js ์์ฑ์ js ์ฝ๋ ๋ธ๋ก ์๋ ์์ฑ)
๋ค์ฌ์ฐ๊ธฐ, ๋ด์ด์ฐ๊ธฐ
ํ์ดํผ ํ ์คํธ ์์ฑ
Viewer์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง
Viewer๋ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง(SSR)์ด ๊ฐ๋ฅํ์ฌ NextJs์ ISR, SSG๋ก ์บ์ฑ๊ฐ๋ฅ
์ฝ๋ ๋ธ๋ก ๋ฐ ์ฝ๋ ํ์ด๋ผ์ดํ
์ฝ๋ ๋ธ๋ก์ ์ค์ ํ ์ฝ๋ฉ ์ธ์ด์ ๋ง๋ ๋ฌธ๋ฒ ๊ฐ์กฐ
Code Syntax Highlighter๋ SSR์ด ๊ฐ๋ฅํ์ฌ, NextJs์ ISR, SSG๋ก ์บ์ฑ๊ฐ๋ฅ.
๊ธฐ๋ณธ Syntax Highlighted๋ ์ฝ๋์ ์์ ์ถ๊ฐ.(ํ๊ดํฌ, ๋ฐ์ค ๋ฑ)
VS Code์์ ๋ณต์ฌํ ์ฝ๋๋ ์๋์ผ๋ก ํด๋น ํ์ผ์ ์ธ์ด๋ฅผ ๊ฐ์งํ์ฌ ์ฝ๋ ๋ธ๋ก ์์ฑ
์ด๋ฏธ์ง ์ ๋ก๋ ๋ฐ ๊ด๋ฆฌ
์ด๋ฏธ์ง ์ ๋ ฌ ๋ฐ ํฌ๊ธฐ ์กฐ์ ๊ธฐ๋ฅ ์ง์
๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ ์ ํธํ๊ฒ S3์ ์ ๋ก๋ํ์ฌ URL์ ๋ฐ์ ์ฌ์ฉ
์ ๋ก๋ ์, WebP ์์ถ ํ ๋น๊ตํ์ฌ ํจ์จ์ ์ธ ํฌ๋ฉง ์ฌ์ฉ.
๊ธฐ์กด์ ์ด๋ฏธ์ง URL์ ์ฌํ์ฉํ์ฌ ๋ถํ์ํ ์ ๋ก๋ ๋ฐฉ์ง.
๋ชฉ์ฐจ(TOC) ์๋ ์์ฑ
ํค๋๋ฅผ ํตํด ์๋์ผ๋ก ๋ชฉ์ฐจ(TOC) ์์ฑ
์ฒซ ์ฌ๋์ฌ, ๋๋๊ทธ ์๋์์ฑ
"/"๋ฅผ ์ ๋ ฅํ๋ฉด ์ฃผ์ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
๋ด์ฉ์ ๋๋๊ทธํ๋ฉด ๋๋๊ทธํ ์์ญ์ ํ์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
2. ๊ธฐ๋ฅ ์๊ฐ
6๊ฐ์ง ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด์ ์ด๋ ค์ ๋ ์ ๋ฐ ๊ตฌํ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์๊ฐํ๊ฒ ์ต๋๋ค.
2.1 Code Syntax Highlighter
๊ฐ๋ฐ ์ด์ : ๊ฐ๋ฐ ๋ธ๋ก๊ทธ๋ผ ๋ค์ํ ์ธ์ด ์ฝ๋ ๊ฐ์กฐ๊ฐ ํ์
๊ตฌํ: Shiki ๊ธฐ๋ฐ, 100+ ์ธ์ด ์ง์, Line ๋จ์ ํ์ฑ โ Line number ์ฒ๋ฆฌ ๊ฐ๋ฅ
ํน์ง: ์ฝ๋ ๋ธ๋ก์ ํ๊ดํยท๋ฐ์ค
ยท์ทจ์์๊ฐ์ ๋งํฌ๋ ์ ์ฉ ๊ฐ๋ฅ. VS Code ๋ณต๋ถ ์ธ์ด ์๋ ๊ฐ์ง.์ด๋ ค์: ProseMirror Schema/Mark ์ถฉ๋ ํด๊ฒฐ โ 2์ฃผ ์ด์ ์์
์ฑ๊ณผ: ์๋ํฐ์ ํ ๋ชธ์ฒ๋ผ ์๋(์๋ํฐ ์ปจํ ์คํธ ์ฐ๋), ๋ฐ์ดํฐ ์ด์ค ์ ์ฅ ๋ถํ์

2.2 Viewer์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง
๊ฐ๋ฐ ์ด์ : Next.js ISR/SSG ์บ์ฑ์ ํตํ ๋น ๋ฅธ ๋ ๋๋ง
๊ณ ์ํ ๋ฐฉ์๋ค :
ํด๋ผ์ด์ธํธ์์ HTML ์ ๋ฌ โ ๋ณด์ ์ทจ์ฝํ ์ ์์.
์๋ฒ์์ SSR๋ก ๋ฐ์ดํฐ ํ์ฑ๊ณผ Sanitizing ์ํ โ ์ต์ ๋ฐ์, ์์
๊ตฌํ : ์๋ฒ์์ ๋ฐ์ดํฐ ์ ์ฅ + ํ์ฑํ HTML ์บ์ฑ ๋ณํ โ ๋น ๋ฅด๊ฒ ์ถ๋ ฅ ๋ฐ ์์
์ฅ์ : ๋ณด์ ๊ฐํ, ๋ฐ์ดํฐ ์ค๋ณต ์ ์ฅ ๋ถํ์
2.3 ์ด๋ฏธ์ง ์ ๋ก๋

๊ฐ๋ฐ ์ด์ : S3 ์ ์ฅ์์ ์ค์๊ฐ ์ด๋ฏธ์ง ์ ๋ก๋๊ฐ ํ์.
๊ตฌํ : ํด๋ฆฝ๋ณด๋ ๋ถ์ฌ๋ฃ๊ธฐ โ WebP ์์ถ โ S3 ์ ๋ก๋ ํ URL ๋ฐํ
์ด๋ ค์ : ์ธ๋ถ URL ์ฒ๋ฆฌ ๋ฐฉ์๊ณผ CSP ์ค์ ์ ๋ํ ๊ณ ๋ฏผ
์ฅ์ : ๊ธฐ์กด URL ์ฌํ์ฉ โ ์ค๋ณต ์ ๋ก๋ ๋ฐฉ์ง
2.4 ๊ธฐ๋ณธ ํ ์คํธ ํธ์ง ๊ธฐ๋ฅ
![]() | ![]() |
๊ตฌํ : Tiptap์ ํ๋ฌ๊ทธ์ธ์ ํ์์ ๋ง๊ฒ ๊ฐ๋ฐ
์ด๋ ค์ : ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค๋ฉด ProseMirror ๋ฌธ์๊น์ง ์ฐธ๊ณ ํด์ผ ํจ.
์ฅ์ : ์ธ์ ๋ ๊พธ๋ฏธ๋ ์์ ๋๋ฅผ ๊ธฐ๋ฅ ์ถ๊ฐ๋ก ํ์ฅํ ์ ์๋ค.
2.5 TOC

๊ฐ๋ฐ ์ด์ : ๋๋ฌด ์ํค ๋ชฉ์ฐจ ์ฐพ์๊ฐ๋ ๊ธฐ๋ฅ์ด ๋ถ๋ฌ์์.
๊ตฌํ :
Heading ํ๋ฌ๊ทธ์ธ์ TOC๋ฅผ ์ํ data-attribute๋ฅผ ์ถ๊ฐ ๋ฐ ํ์ฉํ์ฌ ํ์ฑ.
ResizeObserver๋ฅผ ํตํ Layout ๋ณ๊ฒฝ ๊ฐ์ง, Debouncing ์ ์ฉ์ผ๋ก ์ต์ ํ.
์ด๋ ค์ : ํ์ฑํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์๋ํฐ Heading ํ๋ฌ๊ทธ์ธ ๊ตฌํ ์ฌํญ์ ๋ชจ๋ฅด๋ฉด ์ ์ง ๋ณด์ ํ๋ฆ.
์ฅ์ : ํ๋์ ๋ชฉ์ฐจ๋ฅผ ๋ณผ ์ ์๊ณ ์ฐพ์ ์ ์๋ค.
2.6 ์ฒซ ์ฌ๋์ฌ, ๋๋๊ทธ ์๋์์ฑ
![]() | ![]() |
๊ฐ๋ฐ ์ด์ : ๋ ธ์ ์๋ํฐ๋ฅผ ๋ ํผ๋ฐ์ค๋ก ๋ดค์ ๋ ์ถฉ๋ถํ ์ข์ ๋ณด์.
๊ตฌํ :
๋คํํ ๊ธฐ๋ณธ์ ์ธ ํ๋ฌ๊ทธ์ธ์ด ์์ด ํด๋น ํ๋ฌ๊ทธ์ธ ํ์ฉ
์ปค์คํ ํ๊ฒ ์ถ๊ฐํ๊ณ ์ถ์ ๊ธฐ๋ฅ์ ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํจ.
์ด๋ ค์ : Command๋ฅผ ๋ค ํ์ ํ๊ณ ์ถ๊ฐํด์ผํ๋๋ฐ, ์ฝ๋๋ธ๋ญ์ ๋ฐ๋ฅ๋ถํฐ ๋ง๋ ๊ธฐ๋ฅ์ด๋ผ ์ปค๋งจ๋๋ฅผ ์ง์ ์ถ๊ฐํด์ค์ผ ํ์.
์ฅ์ : ๋ง์ฐ์ค๋ฅผ ์ปจํธ๋กค ๋ฐ์ค๊น์ง ์ฌ๋ฆฌ์ง ์์์ ์ข์.
3. ๊ธฐํ ๊ธฐ๋ฅ
3.1 Iframe (CodePen)
๊ฐ๋ฐ ์ด์ : ์ธ์ ๊ฐ ์ฝ๋ ์๋๊น์ง ๋ณด์ฌ์ฃผ๋๋ก ํด์ผํ๋๋ฐ, ์ฝ๋ ํ์ ํ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
๊ตฌํ :
iframe ์ ์ฉ์ ๋ณด์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ด์ CSP๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉ.
์ด๋ ค์ : ์์ ํ Third Party์ด๊ธฐ ๋๋ฌธ์ CSP ์ํฅ์ ๋ง์ด ๋ฐ๋๋ฐ ์ค์ ํ๊ฒฝ์์ ํ ์คํธ๊ฐ ํ๋ฆ.