[TIL๐Ÿ”ฅ] Day16~20(5์ฃผ์ฐจ ๋…ธ์…˜ ํด๋ก  ์ฝ”๋”ฉ)

๊น€๋‹ค์Šฌยท2021๋…„ 9์›” 6์ผ
2

Today I Learned

๋ชฉ๋ก ๋ณด๊ธฐ
16/22
post-thumbnail

Introduction

๋…ธ์…˜ ํด๋ก  ์ฝ”๋”ฉ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์— ๋„ˆ๋ฌด ํž˜์„ ์Ÿ์€ ๋‚˜๋จธ์ง€ 5์ฃผ์ฐจ TIL์„ ๋ชฐ์•„์„œ ์˜ค๋Š˜ ์“ฐ๋Š” ๋‚˜ ๋ฐ˜์„ฑํ•ด~๐Ÿฅฒ
์ €๋ฒˆ์ฃผ ์›”ํ™”์ˆ˜๋ชฉ๊ธˆ์€ ์ง„์งœ ๋จธ๋ฆฟ์†์— ๋…ธ์…˜ ์ƒ๊ฐ ๋ฟ์ด์—ˆ๋‹ค...
ํ•˜๋‚˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜์— ๋ถ€๋”ชํžˆ๊ณ ...์ข€๋งŒ ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜๋ฉด ๋ฐ”๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋œจ๊ณ ...
๊ทธ๋ž˜๋„ ์ผ๋‹จ ๊ธฐ๋ณธ ๊ตฌํ˜„ ์‚ฌํ•ญ ๊ตฌํ˜„์€ ์„ฑ๊ณตํ–ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ์ง€์ €๋ถ„ํ•˜๊ณ  ๋ง˜์— ๋“ค์ง„์•Š์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฐ”๋‹๋ผ JS์— ์กฐ๊ธˆ์€ ์ต์ˆ™ํ•ด์กŒ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ด์‹ฌํžˆ ๋ชฐ์ž…ํ•œ ๋‚˜ ์ž์‹ ์—๊ฒŒ๋„ ์‹ฌ์‹ฌํ•œ ์œ„๋กœ์˜ ๋ง์„ ๊ฑด๋„ค๊ณ  ์‹ถ๋‹ค.
์ด๋ฒˆ TIL์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์–ด๋ ต๊ณ  ๋ง‰ํ˜”๋˜ ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ์งš์–ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.


๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๋…ธ์…˜ ํด๋ก  ์ฝ”๋”ฉ ํ”„๋กœ์ ํŠธ


โ˜‘ ๊ธฐ๋ณธ ๊ตฌํ˜„ ์‚ฌํ•ญ

  1. ํ™”๋ฉด ์ขŒ์ธก์— ๋ฌธ์„œ ๋ Œ๋”๋ง
    • ๋ฌธ์„œ๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋ฃจํŠธ ๋ฌธ์„œ๋Š” ํ•˜์œ„ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ง
  2. ๊ฐ ๋ฌธ์„œ๋Š” ์ถ”๊ฐ€์™€ ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง
    • ์ถ”๊ฐ€ ์‹œ ํ•˜์œ„ ๋ฌธ์„œ๊ฐ€ ์ถ”๊ฐ€๋จ
    • ์‚ญ์ œ ์‹œ ๋ฌธ์„œ๊ฐ€ ์‚ญ์ œ๋˜๊ณ , ํ•˜์œ„ ๋ฌธ์„œ๋Š” ๋ฃจํŠธ ๋ฌธ์„œ๊ฐ€ ๋จ
  3. ํ™”๋ฉด ์šฐ์ธก์—๋Š” ํŽธ์ง‘๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉฐ, ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ ๋‚ด์šฉ์€ ์ž๋™์œผ๋กœ ์„œ๋ฒ„์— ์ €์žฅ๋จ
  4. History API๋ฅผ ์ด์šฉํ•ด SPA ํ˜•ํƒœ๋กœ ๊ตฌํ˜„
    • ๊ธฐ๋ณธ์€ ๋ฌธ์„œ๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์€ ์ƒํƒœ
    • ๋ฌธ์„œ id๋ฅผ ๊ฐ€์ง„ url๋กœ ์ ‘์† ์‹œ ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ํŽธ์ง‘๊ธฐ์— ๋กœ๋”ฉ

๐ŸŒด Tree View (menu)

๋…ธ์…˜์„ ๋ณด๋ฉด ๋ฃจํŠธ ๋ฌธ์„œ์™€ ํ•˜์œ„ ๋ฌธ์„œ๋“ค๋กœ ๋ฉ”๋‰ด ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”๋‰ด ๊ตฌ์„ฑ์€ ul๊ณผ li ํƒœ๊ทธ์˜ ์กฐํ•ฉ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

<ul>
    <li>๋ฃจํŠธ ๋ฌธ์„œ1</li>
    <li>๋ฃจํŠธ ๋ฌธ์„œ2</li>
    <ul>
    	<li>ํ•˜์œ„ ๋ฌธ์„œ 1</li>
        <li>ํ•˜์œ„ ๋ฌธ์„œ 2</li>
    </ul>
</ul>

๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณต๋˜๋Š” ๊ตฌ์กฐ์ด๋ฏ€๋กœ mapํ•จ์ˆ˜์™€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.
์ฒ˜์Œ์—๋Š” map ๋ง๊ณ  forEach๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•˜๋ คํ–ˆ์œผ๋‚˜ ๊ณ„์†ํ•ด์„œ undefined๊ฐ€ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.
๋‚ด๊ฐ€ map๊ณผ forEach์˜ ์ฐจ์ด๋ฅผ ์•„์ง ์ •ํ™•ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋˜ ํƒ“์ด์—ˆ๋‹ค.
map์˜ ๊ฒฝ์šฐ ์ˆ˜์ •๋œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ˜๋ฉด์— forEach๋Š” ์–ด๋– ํ•œ ๊ฐ’๋„ ๋ฐ˜ํ™˜ํ•˜์ง€์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ push๋กœ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•ด์ค˜์•ผ๋งŒ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
map()๊ณผ forEach()

์—ฌ๋Ÿฌ๋ฒˆ์˜ ์‹œ๋„ ๋์— Tree View๋ฅผ ๊ตฌํ˜„ํ•ด๋‚ด๋Š”๋ฐ ์„ฑ๊ณตํ–ˆ๋‹ค.

// tree menu ๋งŒ๋“ค๊ธฐ : map + ์žฌ๊ท€
  const createTreeView = (document) => {
    return document
      .map(
        ({ id, title, documents }) => `
      <li data-id=${id} class="documentItem">${
          documents.length > 0
            ? `<span class="hasChild">${title}</span>`
            : `${title}`
        }
      <button class="createDoc"><i class="fas fa-folder-plus"></i></button>
      <button class="removeDoc"><i class="fas fa-trash-alt"></i></button>
      ${
        documents.length > 0
          ? `<ul class="hasChildUl">${createTreeView(documents)}</ul>`
          : ""
      }
      </li>`
      )
      .join("");
  };

๐Ÿš€ ์ถ”๊ฐ€์™€ ์‚ญ์ œ ๊ธฐ๋Šฅ

์ถ”๊ฐ€์™€ ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” TodoApp์„ ๋งŒ๋“ค๋ฉฐ ์—ฐ์Šตํ•ด ๋ณธ ์ ์ด ์žˆ์–ด ๋‚˜๋ฆ„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
์ด๋ฒคํŠธ ์œ„์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ className์ด ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•จ์ˆ˜์— id๊ฐ’์„ ๋„˜๊ฒจ๋ฒ„๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ๋Š” DocumentsPage๋ผ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ •์˜ํ•ด์ฃผ์—ˆ๋‹ค.

๊ตฌํ˜„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

$documentList.addEventListener("click", (e) => {
    const $li = e.target.closest("li");
    if ($li) {
      const { id } = $li.dataset;
      const $button = e.target.closest("button");
      if (e.target.className === "documentItem") {
        onSelect(id);
      } else if ($button.className === "createDoc") {
        onCreate(id);
      } else if ($button.className === "removeDoc") {
        onRemove(id);
      }
    }
  });

๋˜ํ•œ, e.target.dataset, e.target.closest ๋“ฑ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ํƒ€๊ฒŸ์˜ ์†์„ฑ๋„ ์™„๋ฒฝํžˆ ๊ณต๋ถ€ํ•ด ์ž˜ ํ™œ์šฉํ•ด์•ผํ•จ์„ ๋Š๊ผˆ๋‹ค.


๐Ÿ˜ข ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ & state ๊ด€๋ฆฌ

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ๊ฒƒ์€ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋กœ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค์„ ์ชผ๊ฐœ๋Š” ๊ณผ์ •์ด์—ˆ๋‹ค.
์‹œ๊ฐ„์€ ํ•œ์ •๋˜์–ด์žˆ๊ณ , ๋จธ๋ฆฟ์†์— ์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌ์„ฑํ•ด์•ผ๊ฒ ๋‹ค ์ด๋Ÿฐ ์ƒ๊ฐ๋งŒ ๊ฐ€์ง€๊ณ  ์ฝ”๋”ฉ์— ๋“ค์–ด๊ฐ€๋‹ˆ ๊ตฌ์กฐ๊ฐ€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด์—ˆ๋‹ค...

์›๋ž˜ ์ฒ˜์Œ ์ƒ๊ฐ์€ DocumentList ์ปดํฌ๋„ŒํŠธ(=ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ document ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋“ค์–ด์žˆ์Œ)๋ฅผ DocumentsPage(=์ขŒ์ธก navBar) ์ปดํฌ๋„ŒํŠธ์— ๋ถˆ๋Ÿฌ์˜ค๊ณ ,
Editor(=ํŽธ์ง‘๊ธฐ) ์ปดํฌ๋„ŒํŠธ๋ฅผ DocumentEditPage(=์šฐ์ธก ํŽธ์ง‘๊ธฐ ํŽ˜์ด์ง€)์— ๋ถˆ๋Ÿฌ์™€
App ์ปดํฌ๋„ŒํŠธ์—์„œ DocumentsPage, DocumentEditPage ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ฝ”๋”ฉ์„ ํ•˜๋‹ค๋ณด๋‹ˆ, DocumentEditPage์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค DocumentsPage๋ฅผ ์žฌ๋ Œ๋”๋งํ•ด์•ผํ•˜๋‹ค๋ณด๋‹ˆ DocumentsPage ์ปดํฌ๋„ŒํŠธ๋ฅผ DocumentEditPage์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๊ทธ๋Ÿฐ ๊ตฌ์กฐ๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค...

๋ญ”๊ฐ€ ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋„ˆ๋ฌด ์–ฝํžˆ๊ณ  ์–ฝํ˜€ ์ด๋ ‡๊ฒŒ ํ•˜๋Š”๊ฒŒ ๋งž๋‚˜ ์‹ถ์€ ์ƒ๊ฐ์ด ๊ณ„์† ๋“ค์—ˆ๋‹ค...
์‹œ๊ฐ„์ด ํ•œ์ •๋˜์–ด์žˆ๋‹ค๋ณด๋‹ˆ ์ผ๋‹จ ๊ตฌํ˜„์—๋งŒ ์ดˆ์ ์„ ๋งž์ถฐ ์–ด๋–ป๊ฒŒ๋“  ๊ตฌํ˜„ํ•ด๋‚ด๊ธด ํ–ˆ๋Š”๋ฐ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์•˜๋‹ค...๐Ÿ˜ต

๊ทธ๋ฆฌ๊ณ  ์•„์ง state๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ํ™•์‹คํžˆ ์ดํ•ดํ•˜์ง€๋ชปํ•œ ๊ฒƒ ๊ฐ™๋‹ค...
๊ณ„์†ํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ๊ฒ ๋‹ค...!!!๐Ÿ”ฅ


๐Ÿ’ซ ํžˆ์Šคํ† ๋ฆฌ API ์ด์šฉํ•ด SPA ํ˜•ํƒœ๋กœ ๊ตฌํ˜„

SPA ํ˜•ํƒœ์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ์ดˆ์— ํ•œ๋ฒˆ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , AJAX๋ฅผ ์ด์šฉํ•ด ํŽ˜์ด์ง€ ๊ฐฑ์‹ ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์žฌ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ „์ฒด์ ์ธ ํŠธ๋ž˜ํ”ฝ์ด ๊ฐ์†Œํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, url์ด ๋ณ€๊ฒฝ๋˜์ง€์•Š์œผ๋ฏ€๋กœ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ(๋’ค๋กœ ๊ฐ€๊ธฐ, ์•ž์œผ๋กœ ๊ฐ€๊ธฐ ๋“ฑ)๊ฐ€ ์–ด๋ ต๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ history API์ด๋‹ค. history์˜ pushState ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์†Œ์ฐฝ์˜ url์„ ๋ณ€๊ฒฝํ•˜๊ณ  url์„ history์— ์ถ”๊ฐ€ํ•œ๋‹ค. replaceState ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ๋Š” ํ˜„์žฌ์˜ history๋ฅผ ์ˆ˜์ •ํ•ด ์›ํ•˜๋Š” url๋กœ ์—…๋ฐ์ดํŠธํ•ด์ค€๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํŠน์ • document๋ฅผ ์„ ํƒํ–ˆ์„ ๊ฒฝ์šฐ์™€ ์ƒˆ๋กœ์šด ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๊ฒฝ์šฐ
push๋ฅผ ์ด์šฉํ•˜์—ฌ url์„ ํ˜„์žฌ document์˜ id๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

onSelect: async (id) => {
      push(`/documents/${id}`);
    },
onCreate: async (id) => {
     const createdDoc = await request(`/documents`, {
        method: "POST",
        body: JSON.stringify({
          title: "์ƒˆ๋กœ์šด ๋ฌธ์„œ",
          parent: id,
        }),
      });
      push(`/documents/${createdDoc.id}`);
      this.render();
    }

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ pushState์™€ replaceState ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์†Œ์ฐฝ์˜ url์„ ๋ณ€๊ฒฝํ•  ๋ฟ HTTP ์š”์ฒญ์ด ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ request๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ์žฌ๋ Œ๋”๋งํ•ด์ฃผ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

DocumentEditPage์—์„œ ๋ฌธ์„œ์˜ ํƒ€์ดํ‹€์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ทธ ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์œผ๋กœ DocumentsPage๊ฐ€ ์žฌ๋ Œ๋”๋ง๋˜์–ด ๋ณ€๊ฒฝ๋œ ํƒ€์ดํ‹€์ด ์ ์šฉ๋˜์–ด์•ผํ•˜๋Š”๋ฐ ์œ„์˜ ๊ณผ์ •์„ ์ œ๋Œ€๋กœ ์•ˆํ•ด์ค˜์„œ ์ฉ”์ฉ”๋งจ ๊ธฐ์–ต์ด ๋‚œ๋‹ค.

์‚ฌ์‹ค setState๋ฅผ ์ด์šฉํ•ด ๋ Œ๋”๋งํ•˜๋Š” ๊ณผ์ •์„ ํ•œ๋ฒˆ์— ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ์•„์ง ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์œ ๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•ด์„œ ์ ์šฉํ•˜์ง€๋ชปํ–ˆ๋‹ค...
๊ฐ•์˜๋ฅผ ๋ณต์Šตํ•˜๋ฉฐ ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ด์•ผ๊ฒ ๋‹ค!!!


๐Ÿ’ง ๊ฐœ์„ ํ•ด์•ผํ•  ์ 

1. DocumentList Toggle ๊ด€๋ จ
- ์—ด๋ฆฌ๋Š” ํ† ๊ธ€์€ ์ •์ƒ ๋™์ž‘ํ•˜๋‚˜, ํŽ˜์ด์ง€ ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œ ์‹œ ํ† ๊ธ€์ด ๋‹ค์‹œ ๋‹ซํžˆ๋Š” ํ˜„์ƒ ๋ฐœ์ƒ

2. ์‚ญ์ œ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ๊ด€๋ จ
- ์ž์‹ document ์‚ญ์ œ ์‹œ ํ•ด๋‹น document์˜ ํ•˜์œ„ document๊ฐ€ ์‚ญ์ œ๋œ document์˜ ์œ„์น˜๋กœ ๊ฐ€์ง€์•Š๊ณ , ๋ฃจํŠธ document๋กœ ๊ฐ€๋Š” ํ˜„์ƒ
- ํ˜„์žฌ ์„ ํƒ๋œ ๋ฌธ์„œ ์‚ญ์ œ ์‹œ editor๊ฐ€ ์—†์–ด์ง€์ง€์•Š๊ณ  ๋‚จ์•„์žˆ๋Š” ํ˜„์ƒ(=/documents/๋กœ ๋ Œ๋”๋ง์ด ์•ˆ๋˜๋Š” ๋ฌธ์ œ)

3. Document onSelect ๊ด€๋ จ
- ์ด๋ฏธ ์„ ํƒ๋˜์–ด์žˆ๋Š” document๋ฅผ ๋˜ ์„ ํƒ ์‹œ ์ฝ˜์†”์ฐฝ์— ์˜ค๋ฅ˜ ๋ฐœ์ƒ, ๊ธฐ๋Šฅ์€ ์ •์ƒ ๋™์ž‘


๐Ÿ˜– ์•„์ง ๋ฏธ์™„์„ฑ๋œ ๋…ธ์…˜ ๊ตฌ๊ฒฝํ•˜๊ธฐ


๐Ÿ™‡๐Ÿปโ€โ™€๏ธ ์ฒซ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐ...

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

profile
์ธ์ƒ์€ ์šฉ๊ธฐ์˜ ์–‘์— ๋”ฐ๋ผ ์ค„์–ด๋“ค๊ฑฐ๋‚˜, ๋Š˜์–ด๋‚œ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€