๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ_TIL

๊ฐœ๋ฐœ_TIL | 2022-08-09 (78)

by Hee94 2022. 8. 9.

Toast UI Editor


๐Ÿšฉ๋ชฉ์ฐจ

  1. ๊ฐœ๋ฐœ ๋ ˆํผ๋Ÿฐ์Šค
  2. ํ† ์ŠคํŠธ UI ์—๋””ํ„ฐ?
  3. ์‚ฌ์šฉ๋ฒ•
  4. ์ฝ”๋“œ

๐Ÿ“œ ๊ฐœ๋ฐœ ๋ ˆํผ๋Ÿฐ์Šค

TOAST UI :: Make Your Web Delicious!

tui.editor/v3.0-migration-guide-ko.md at master · nhn/tui.editor

TOAST UI Editor ์‚ฌ์šฉ๋ฒ• ( ๋งˆํฌ๋‹ค์šด ์—๋””ํ„ฐ Markdown Editor)

TIL 2022.07.18 Toast UI editor Javascript ๊ตฌํ˜„

๐Ÿ“Œ ํ† ์ŠคํŠธ UI ์—๋””ํ„ฐ?

  • ํ† ์ŠคํŠธ UI ์—๋””ํ„ฐ๋Š” ์›น ํ”„๋ก ํŠธ์—”๋“œ์— ๋ถ™์ด๋Š” ํŽธ์ง‘๊ธฐ๋กœ, ํ…์ŠคํŠธ ๋˜๋Š” WYSIWYG๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆํฌ๋‹ค์šด ๋ฌธ์„œ๋ฅผ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ, ์Šคํฌ๋กค ๋™๊ธฐํ™”, ์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๋ฐ ์ฐจํŠธ ๊ธฐ๋Šฅ์ด ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ๋ชฉ์ 

  • ๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋“ค(์˜ˆ์‹œ๋กœ ๊นƒํ—ˆ๋ธŒ์™€ ๋ฒจ๋กœ๊ทธ๊ฐ€ ์žˆ์Œ)์—์„œ ์•„์ด๋””์–ด๋ฅผ ์ฐจ์šฉํ–ˆ์Œ
  • ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์ธ ๊ฑฐ๋ฎค๋‹ˆํ‹ฐ์—์„œ ์งˆ๋ฌธ์„ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์ฝ”๋“œ๋ธ”๋Ÿญ์ด ํฌํ•จ๋œ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ต‰์žฅํžˆ ํŽธ๋ฆฌํ• ํ…๋ฐ!
  • ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด, ๊ทธ๋Œ€๋กœ ์ €์žฅํ•˜๊ณ , ๋‹ค์‹œ ํŽ˜์ด์ง€์—์„œ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ์—๋””ํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค!

๐Ÿ’ป์—๋””ํ„ฐ(Editor)

  • ์—๋””ํ„ฐ๋Š” ๋งˆํฌ๋‹ค์šด ๋ฐฉ์‹๊ณผ ์ฝ”๋“œ๋ธ”๋Ÿญ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ์ง‘๊ธฐ
  • ํŽธ์ง‘๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์€ ๊ณณ์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค

๐Ÿ‘‍๐Ÿ—จ๋ทฐ์–ด(Viewer)

  • ๋ทฐ์–ด๋Š” ๋งˆํฌ๋‹ค์šด ๋ฐฉ์‹๊ณผ ์ฝ”๋“œ๋ธ”๋Ÿญ์„ ํ™”๋ฉด์—์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์‹œ๊ฐํ™” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•จ
  • ๋งˆํฌ๋‹ค์šด ํ˜•ํƒœ์˜ ๊ธ€์„ ๋ณด๊ณ  ์‹ถ์€ ๊ณณ์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค

โœ ์‚ฌ์šฉ๋ฒ•

๐Ÿ’พ Toast UI Editor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž„ํฌํŠธ

  • Toast UI Editor ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JQuery, Google Fonts์™€ ๊ฐ™์ด ์ฃผ์†Œํ˜•ํƒœ๋กœ ๋ฐฐํฌ๋˜์–ด ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™€ ์ฃผ์–ด์•ผ ํ•จ
  • CSS(์Šคํƒ€์ผ์‹œํŠธ), JS(์Šคํฌ๋ฆฝํŠธ) ํŒŒ์ผ์„ ๊ฐ๊ฐ head, body ํƒœ๊ทธ ์•ˆ์— ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค
  • ๋˜ํ•œ ์—๋””ํ„ฐ์™€ ๋ทฐ์–ด ๊ฐ๊ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šคํฌ๋ฆฝํŠธ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•จ

๐Ÿ—จ HTML ํƒœ๊ทธ ์ž‘์„ฑ

  • ์—๋””ํ„ฐ์™€ ๋ทฐ์–ด๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ div๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค
  • ์—๋””ํ„ฐ์™€ ๋ทฐ์–ด๋Š” ๊ฐ๊ฐ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” editor, viewer ๋ผ๋Š” id ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ํ•จ๊ป˜ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค

๐Ÿ“œ Script ์ž‘์„ฑ

  • div๋กœ ๋งŒ๋“ค์–ด์ง„ ํƒœ๊ทธ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ์–ด ๊ตฌํ˜„
  • ์—๋””ํ„ฐ์™€ ๋ทฐ์–ด๋Š” ๊ฐ๊ฐ Editor, Editor.Factory ๋ผ๋Š” Toast UI Editor ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

๐Ÿ‘จ‍๐Ÿ’ป ์ฝ”๋“œ

Editor ์ฝ”๋“œ

<!DOCTYPE html>
<html>

<head
    <link rel="stylesheet" href="https://uicdn.toast.com/editor/latest/toastui-editor.min.css" />
    <script src="https://uicdn.toast.com/editor/latest/toastui-editor-all.min.js"></script>
</head>

<body>                
  <div id="editor"></div>

    <script>
        const Editor = toastui.Editor;

        const editor = new Editor({
                el: document.querySelector('#editor'),
                height: '500px',
                initialEditType: 'markdown',
                previewStyle: 'vertical'
            });
    </script>
</body>

</html>

Viewer ์ฝ”๋“œ

<!doctype html>
<html lang="en">

<head>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.48.4/codemirror.css" />
    <link rel="stylesheet" href="https://uicdn.toast.com/editor/2.0.0/toastui-editor.min.css" />
</head>

<body>
  <div id="viewer"></div>
  <script src="https://uicdn.toast.com/editor/2.0.0/toastui-editor-all.min.js"></script>
    <script>
        // initialValue๋Š” ๊ธฐ๋ณธ๊ฐ’์ด content๋กœ ๋˜์–ด ์žˆ์Œ
        // ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋„ฃ์„ ๋ฐ์ดํ„ฐ๋ฅผ content๋กœ ์„ ์–ธํ•ด์•ผํ•จ

        const viewer = toastui.Editor.factory({
        el: document.querySelector('#viewer'),
        viewer: true,
        height: '500px',
        initialValue: details.content
    });
    </script>
</body>
</html>

๐Ÿšฉ์งˆ๋ฌธ ์ •๋ฆฌ

์™œ ์—๋””ํ„ฐ๋Š” ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์ฃผ๋‚˜์š”?


  • ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฒƒ์€ ํ•จ์ˆ˜๋กœ ์‹คํ–‰์‹œํ‚จ ์—๋””ํ„ฐ, ๋ทฐ์–ด๋ฅผ ๋‚ด์žฅํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ
  • ์žฌ์‚ฌ์šฉํ•  ์ƒ๊ฐ์ด ์—†๋‹ค๋ฉด ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ, toastui.Editor() ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค
toastui.Editor.factory({
        el: document.querySelector('#viewer'),
        viewer: true,
        height: '500px',
        initialValue: details.content
    });

๋ทฐ์–ด์™€ ๊ด€๋ จ๋œ ์Šคํฌ๋ฆฝํŠธ์˜ ์œ„์น˜๋Š”?


  • ๋ทฐ์–ด๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ฐ’์„ ๋„ฃ์„ initialValue ๋ผ๋Š” ๊ฐ’์„ ์š”๊ตฌํ•œ๋‹ค
  • ๋งˆํฌ๋‹ค์šด์œผ๋กœ ๋ณด์—ฌ์ค„ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, API๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ๋ ค๋ฐ›๋Š” API ๋‚ด๋ถ€์— ์ด ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด์žˆ์–ด์•ผ initialValue๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์—๋””ํ„ฐ๋ฅผ ๋”ฐ๋กœ js ํŒŒ์ผ๋กœ ๋นผ์ฃผ๋ ค๋ฉด ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ์„ ์–ธํ•˜๊ณ , API์—์„œ ๋Œ๋ ค์ค„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค!
window.onload = async function loadDetails() {
        // ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” API GET Method
        // ์•ˆ์— ์ž‘์„ฑ๊ธ€์˜ ๋ฐ์ดํ„ฐ์ธ details.content๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
    const details = await QuestionDetail(question_id);

    // ๋งˆํฌ๋‹ค์šด ์กฐํšŒ
    const viewer = toastui.Editor.factory({
        el: document.querySelector('#viewer'),
        viewer: true,
        height: '500px',
        initialValue: details.content
    });

'๊ฐœ๋ฐœ_TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๊ฐœ๋ฐœ_TIL | 2022-09-08 (79)  (0) 2022.09.08
๊ฐœ๋ฐœ_TIL | 2022-08-08 (77)  (0) 2022.08.09
๊ฐœ๋ฐœ_TIL | 2022-08-05 (76)  (0) 2022.08.09
๊ฐœ๋ฐœ_TIL | 2022-08-04 (75) // feat) KPT  (0) 2022.08.04
๊ฐœ๋ฐœ_TIL | 2022-08-03 (74)  (0) 2022.08.04