์ฝ”๋“œ๋กœ ๋ณด๋Š” ๋„คํŠธ์›Œํฌ ๋‹ค์ด์–ด๊ทธ๋žจ / ์ฝ”๋“œ๋กœ ๋ณด๋Š” ๋„คํŠธ์›Œํฌ ๋‹ค์ด์–ด๊ทธ๋žจ

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

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์žฅ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ธก๋ฉด์€ ์ด ๋ฌธ์„œ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋Š” ๊ดœ์ฐฎ๊ฒ ์ง€๋งŒ ๋‹ค์ด์–ด๊ทธ๋žจ์€... ์™œ๋ƒ๋ฉด... ๋ชจ๋“  ๋ฌธ์„œ๋Š” ์˜จ๋ผ์ธ์— ์žˆ์Šต๋‹ˆ๋‹ค. html ํ˜•์‹์˜ ๊ฒฝ์šฐ ํ…์ŠคํŠธ์—๋Š” ์‹ค์ œ๋กœ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ํ‘œ์‹œํ•˜๋Š” gif/jpeg/png ๊ทธ๋ฆผ์ด ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์ด์–ด๊ทธ๋žจ์€ Visio๋‚˜ ์˜จ๋ผ์ธ ์„œ๋น„์Šค a la draw.io์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๊ทธ๋ž˜ํ”ฝ ํ˜•์‹์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ณ  HTML์— ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จ ํ•ด.

๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ณ„ํš์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” ๊ทธ๋‹ค์ง€ ๋ณต์žกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๊ฐœ์ฒด ์ˆ˜๋Š” XNUMX๊ฐœ ๋˜๋Š” XNUMX๊ฐœ์ด๋ฉฐ ์—ฐ๊ฒฐ ์ˆ˜๋Š” ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ์Šค ์„œ๋ช…, ์ผ๋ถ€ ์ง€์ •. ๊ฐ„๋‹จํ•œ ๊ณ„ํš์€ ๋ง๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋„ˆ๋ฌด ๋ณต์žกํ•œ ๊ณ„ํš์€ ์—ํ—ด... (c) "๊ทธ๋“ค์€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค, ์„ ์ƒ๋‹˜." ๋งŽ์€ ๊ณ„ํš์ด ์žˆ์œผ๋ฏ€๋กœ ์ •๊ธฐ์ ์œผ๋กœ, ๊ฐ„ํ—์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Š์ž„์—†์ด ์™œ๋ƒํ•˜๋ฉด ๊ทธ๋“ค์€ ์šฐ๋ฆฌ ์ œํ’ˆ์˜ ๊ฐœ๋ฐœ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์„œ๋น„์Šค์˜ HTML์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณด์…จ๋‚˜์š”?

๋ฌผ๋ก ์ด์ง€. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚˜๋Š” gliffy.com์˜ ๊ทธ๋ž˜ํ”ฝ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํƒ€์‚ฌ ์„œ๋น„์Šค๋กœ ์ด๋™ํ•˜์—ฌ ํŽธ์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋™๋ฃŒ์—๊ฒŒ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋ฌด์—‡์„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

์ตœ๊ทผ์— ๊ถŒ์žฅ ์‚ฌํ•ญ์—์„œ Github์˜ ์ €์žฅ์†Œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. github.com/RaoulMeyer/diagram-as-code. ์ฝ”๋“œ๋กœ์„œ์˜ ๋‹ค์ด์–ด๊ทธ๋žจ. ์ €๊ฒƒ๋“ค. ์šฐ๋ฆฌ๋Š” js์—์„œ ํ•„์š”ํ•œ ํšŒ๋กœ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด js๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์„œ ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ๋™์ผํ•œ HTML์— ์ง์ ‘ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋‚˜๋Š” ๋ฌธ์„œ ์ „์ฒด๋ฅผ HTML๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์„œ๋Š” ๋งˆํฌ๋‹ค์šด ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ ์„ธํŠธ์ด๋ฉฐ, ์ด๋Š” Wintersmith์™€ ๊ฐ™์€ ์ผ๋ถ€ ์—”์ง„์— ์˜ํ•ด ๋ณธ๊ฒฉ์ ์ธ ๋ฌธ์„œ ์‚ฌ์ดํŠธ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์œ„ํ‚ค ์‹œ์Šคํ…œ.

๋งค์šฐ ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๊ฐ€ ์—ด๋ฆฌ๊ณ  ๊ตฌ์„ฑํ‘œ์˜ JS ์ฝ”๋“œ๊ฐ€ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋ฌด์—‡์ด ์ž˜๋ชป ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด ์ €์žฅ์†Œ๋ฅผ ์ข‹์•„ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ฝ”๋“œ๋‚˜ ํ…์ŠคํŠธ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๊ทธ๋ฆฌ๋Š” ์œ ์ผํ•œ ์˜ˆ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. (๊ธฐ์‚ฌ ๋งˆ์ง€๋ง‰์—๋Š” ์ฃผ์ œ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ์ฝ”๋“œ๋กœ ๊ฒ€์ƒ‰ํ•œ ํ”„๋กœ์ ํŠธ ๋ฐ ๊ธฐ์‚ฌ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ทธ๋ฆฌ๊ณ  ๋ฌธ์„œ๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋‚˜๋ฟ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๋™๋ฃŒ๋„ ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์–ด ์ˆ˜์ •, ์„ค๋ช… ๋ณ€๊ฒฝ, ์ƒˆ ๊ทธ๋ฆผ ์‚ฝ์ž… ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

๋”ฐ๋ผ์„œ ๊ธด ํ•™์Šต ๊ณก์„ ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๊ณณ์—์„œ๋Š” ๊ฐ„๋‹จํžˆ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ์ƒˆ ํšŒ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 

๋˜ ๋‹ค๋ฅธ ๋™๋ฃŒ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ฌผ๋ก  ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ์—„๊ฒฉํ•˜๊ณ  ํ‘œํ˜„๋ ฅ์ด ํ’๋ถ€ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚˜๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๋…ธ๋“œ, ์—ฐ๊ฒฐ, ๋…ธ๋“œ ๊ทธ๋ฃน ๋ฐ ๋…ธ๋“œ ์œ„์น˜๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ฐฐ์—ด ์„ธํŠธ๋กœ ์ƒ์ƒํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฒธ์†ํ•œ ์˜๊ฒฌ์œผ๋กœ๋Š” ๋งค์šฐ ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์ง€๋งŒ ๋ฌผ๋ก  ๋ง›๊ณผ ์ƒ‰์ƒ์€ ...

๋ฐฐ์—ด์˜ ์ฐจํŠธ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

  • ๊ฐ ๋…ธ๋“œ๋Š” ๋…ธ๋“œ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ์‹๋ณ„์ž๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.
  • ๋…ธ๋“œ์— ์•„์ด์ฝ˜์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋น„๋ฌธ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‘ ๋…ธ๋“œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ์˜ ํ†ต์‹ ์„ ์œ„ํ•ด ์ƒ‰์ƒ๊ณผ ๋น„๋ฌธ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ†ต์‹  ๋ฐฉํ–ฅ์€ ์†Œ์Šค์—์„œ ํƒ€๊ฒŸ์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†Œ์Šค์™€ ํƒ€๊ฒŸ์€ ๋…ธ๋“œ ์‹๋ณ„์ž๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ๋ฅผ ๊ทธ๋ฃน์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ด€๊ณ„๋Š” ๊ทธ๋ฃน๊ณผ ๊ทธ๋ฃน ๋ชจ๋‘์—์„œ ์ง€์ •๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฐ„๋‹จํ•œ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์–ป์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€? ์ƒ๋‹นํžˆ.

์ฝ”๋“œ๋กœ ๋ณด๋Š” ๋„คํŠธ์›Œํฌ ๋‹ค์ด์–ด๊ทธ๋žจ / ์ฝ”๋“œ๋กœ ๋ณด๋Š” ๋„คํŠธ์›Œํฌ ๋‹ค์ด์–ด๊ทธ๋žจ

๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ๋‹ค์Œ js ์ฝ”๋“œ๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์š”์†Œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ณณ - ๋…ธ๋“œ, ๊ฐ€์žฅ์ž๋ฆฌ - ์—ฐ๊ฒฐ.
 

  const elements = {
    nodes: [       // ะพะฟะธัั‹ะฒะฐะตะผ ัƒะทะปั‹
      { id: 'client', type: 'smartphone', label: 'Mobile App'},
      { id: 'server', type: 'server', label: 'Main Server'},
      { id: 'db1', type: 'database', label: 'DB 1'},
      { id: 'db2', type: 'database', label: 'DB 2'},
    ],
    edges: [       // ัƒะบะฐะทั‹ะฒะฐะตะผ ัะฒัะทะธ
      { source: 'client', target: 'server', label: 'request' },
      { source: 'server', target: 'db1', label: 'request' },
      { source: 'server', target: 'db2', label: 'request' },
    ],
  };
  Diagram('scheme1', elements);

๋ฌผ๋ก  ํšŒ๋กœ๋„๋ฅผ ์ง์ ‘ ๊ทธ๋ฆฐ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ดํ† ์Šค์ผ€์ดํ”„.js ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ์‹œ๊ฐํ™” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋‚ด ์†”๋ฃจ์…˜์—์„œ๋Š” ๊ฐ€๋Šฅ์„ฑ์˜ ์ผ๋ถ€๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

์˜ˆ, ๋ถ€ํƒํ•ฉ๋‹ˆ๋‹ค. ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ฃน์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๊ทธ๋ฃน์˜ ๊ทธ๋ฃน ๋ชฉ๋ก์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์š”์†Œ ์ž์ฒด์—๋Š” ๊ทธ๋ฃน ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ ๋ณด๋Š” ๋„คํŠธ์›Œํฌ ๋‹ค์ด์–ด๊ทธ๋žจ / ์ฝ”๋“œ๋กœ ๋ณด๋Š” ๋„คํŠธ์›Œํฌ ๋‹ค์ด์–ด๊ทธ๋žจ

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค:

<div id="scheme5" style="height:500px;width:800px;"></div>
<script>
  const elements5 = {
    groups: [
      { id: 'g1', label: 'ะ“ั€ัƒะฟะฟะฐ ัะตั€ะฒะธัะพะฒ 1'},
      { id: 'g2', label: 'ะ“ั€ัƒะฟะฟะฐ ัะตั€ะฒะธัะพะฒ 2'},
    ],
    nodes: [
      { id: 'man1', type: 'person', label: 'ะงะตะปะพะฒะตะบ'},
      { id: 'client', type: 'smartphone', label: 'ะกะผะฐั€ั‚ั„ะพะฝ'},
      { id: 'agent-backend', type: 'server', group: 'g1', label: 'agent-backend'},
      { id: 'web', type: 'server', group: 'g1', label: 'ะŸั€ะธะปะพะถะตะฝะธะต admin'},
      { id: 'www', type: 'server', group: 'g1', label: 'ัั‚ั€ะฐะฝะธั†ะฐ ะทะฐะณั€ัƒะทะบะธ'},
      { id: 'mongodb1', type: 'database', group: 'g1', label: 'Mongo DB 1'},
      { id: 'mongodb2', type: 'database', group: 'g1', label: 'Mongo DB 2'},
      { id: 'runner-integration1', type: 'worker', group: 'g1', label: 'ะพั‚ะฟั€ะฐะฒะบะฐ'},
      { id: 'runner-integration2', type: 'worker', group: 'g1', label: 'ะพั‚ะฟั€ะฐะฒะบะฐ'},
      { id: 'api', type: 'server', group: 'g1', label: 'API'},
      { id: 'server2', type: 'server', group:'g2', label: 'ัะตั€ะฒะตั€'},
      { id: 'otherServer', type: 'server', group:'g2', label: 'ัะตั€ะฒะตั€'},
      { id: 'firebase', type: 'cloud', label: 'Google Firebase'},
    ],
    edges: [
      { source: 'client', target: 'agent-backend', label: 'json', color: 'red' },
      { source: 'agent-backend', target: 'mongodb1', color: 'red' },
      { source: 'agent-backend', target: 'mongodb2',  color: 'red' },
      { source: 'mongodb1', target: 'runner-integration1', label: 'ะดะฐะฝะฝั‹ะต' },
      { source: 'mongodb2', target: 'runner-integration2', label: 'ะดะฐะฝะฝั‹ะต' },
      { source: 'mongodb1', target: 'web', label: 'ะดะฐะฝะฝั‹ะต ะดะปั ะพั‚ะพะฑั€ะฐะถะตะฝะธั' },
      { source: 'runner-integration1', target: 'server2', label: 'ะดะฐะฝะฝั‹ะต' },
      { source: 'runner-integration2', target: 'otherServer', label: 'ะดะฐะฝะฝั‹ะต' },
      { source: 'api', target: 'firebase', label: 'ะทะฐะฟั€ะพัั‹', color: 'blue', },
      { source: 'firebase', target: 'client', label: 'push', color: 'blue'},
      { source: 'server2', target: 'api', label: 'ัƒะฒะตะดะพะผะปะตะฝะธั', color: 'blue'},
      { source: 'man1', target: 'client', },
    ],
    positions: [
      { id: 'client', row: 2, col: 1,},
      { id: 'agent-backend', row: 2, col: 3,},
      { id: 'web', row: 6, col: 3,},
      { id: 'www', row: 1, col: 3,},
      { id: 'mongodb1', row: 1, col: 4,},
      { id: 'mongodb2', row: 2, col: 5,},
      { id: 'runner-integration1', row: 3, col: 3,},
      { id: 'runner-integration2', row: 4, col: 3,},
      { id: 'api', row: 5, col: 3,},
      { id: 'server2', row: 6, col: 7,},
      { id: 'otherServer', row: 4, col: 7,},
      { id: 'firebase', row: 5, col: 1,},
      { id: 'logger', row: 2, col: 7,},
      { id: 'crm', row: 5, col: 8,},
    ],
};
  Diagram('scheme5', elements5, {layout: 'grid'});
</script>

ํ•œํŽธ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑํ‘œ๋Š” ๋…ธํŠธ๋ถ์— ์žˆ๋Š” ๊ฑฐ์˜ ๋‘ ๊ฐœ์˜ ์ฝ”๋“œ ํ™”๋ฉด์ธ ๋ฐ˜๋ฉด, a la json ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์‚ฌํ•˜๊ฒŒ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฑ„์šธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์น˜๊ฐ€ ๋…ธ๋“œ์™€ ๋ณ„๋„๋กœ ๋ฐฐ์น˜๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋” ํŽธ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ๋…ธ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ช‡ ๊ฐœ์˜ ๊ทธ๋ฃน์„ ์ง€์ •ํ•˜๊ณ  ์ด๋ฅผ ๋…ธ๋“œ์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ฐ๊ฒฐ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฃผ์š” ๊ฐœ์ฒด์™€ ๊ฐœ์ฒด ๊ฐ„์˜ ์—ฐ๊ฒฐ์ด ์žˆ์„ ๋•Œ๋งŒ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ์ด๋Ÿฌํ•œ ๊ฐœ์ฒด์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ทจํ•ฉ๋‹ˆ๋‹ค. ํ˜น์€ ๊ทธ ๋ฐ˜๋Œ€๋กœ๋„.

ํฌ์ง€์…˜ ์—†์ด ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

ํฌ์ง€์…˜ ์—†์ด๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๊ตฌ๊ฒจ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜ˆ์ œ์—์„œ ์ด ์˜ต์…˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„ธํฌ๊ฒฝ๊ด€์˜ ๋…ธ๋“œ ์œ„์น˜์— ๋Œ€ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ”„์ฝ”์ฆˆ, ์ด๋Š” ๊ทธ๋ฃน์˜ ์กด์žฌ๋„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๋” ์‰ฝ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์ด์–ด๊ทธ๋žจ์˜ ์ฒซ ๋ฒˆ์งธ ์ดˆ์•ˆ ๋‹จ๊ณ„์—์„œ๋Š” ์œ„์น˜ ์—†์ด๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ „ํ•จ ์Šคํƒ€์ผ์—์„œ๋„ ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๊ฒƒ๋“ค. ํ•œ ๋…ธ๋“œ๋Š” a1์— ์žˆ๊ณ  ๋‹ค๋ฅธ ๋…ธ๋“œ๋Š” d5์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ์‚ฌ์ดํ† ์Šค์ผ€์ดํ”„๊ฐ€ ์บ”๋ฒ„์Šค ์œ„์˜ ๊ฐœ์ฒด๋ฅผ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด๋™ํ•˜๊ณ , ๋‹ค์–‘ํ•œ ๋ ˆ์ด์•„์›ƒ ์˜ต์…˜์„ ํ™•์ธํ•œ ๋‹ค์Œ, ์ฝ”๋“œ์—์„œ ์›ํ•˜๋Š” ์š”์†Œ์˜ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ๋‚˜์š”?
 
๋ฌผ๋ก  ํšŒ๋กœ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์Šค์Šค๋กœ๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ั€ะตะดะฐะบั‚ะพั€, ์ž์ฒด์ ์œผ๋กœ ์Šคํ‚ค๋งˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €(localStorage)์— ์ตœ์‹  ๋ฒ„์ „์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋„ํ•ด ๋ณด์…จ๋‚˜์š”? ์ด์ œ ํŽ˜์ด์ง€์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์‹œ :

1. ์Šคํฌ๋ฆฝํŠธ ์—ฐ๊ฒฐ

<script src="https://unpkg.com/@antirek/[email protected]/dist/code-full.min.js"></script>

2. HTML์— ์ฝ”๋“œ ์ถ”๊ฐ€

<div id="scheme1" style="height:300px;width:800px;"></div>
<script>      
  const elements = {    
    nodes: [
      { id: 'client', type: 'smartphone', label: 'Mobile App'},
      { id: 'server', type: 'server', label: 'Main Server'},
      { id: 'db1', type: 'database', label: 'DB 1'},
      { id: 'db2', type: 'database', label: 'DB 2'},
    ],
    edges: [
      { source: 'client', target: 'server', label: 'request' },
      { source: 'server', target: 'db1', label: 'request' },
      { source: 'server', target: 'db2', label: 'request' },
    ],
  };
  Diagram('scheme1', elements);
</script>

3. ํ•„์š”ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค. (๋ถ€์—‰์ด๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ์‰ฌ์šด ๊ฒƒ ๊ฐ™์•„์š” :)

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ŠคํŠธ๋ž˜๋‹ˆ์ฒด ํ”„๋กœํ…ํ„ฐ github์—์„œ.

๊ฒฐ๊ณผ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‚ด ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ์— ์ธ๋ผ์ธ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ˜•์‹์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์Šˆํผ ํšŒ๋กœ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์ง€๋งŒ ์—ฐ๊ฒฐ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ž‘์€ ํšŒ๋กœ์—๋Š” ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์–ธ์ œ๋“ ์ง€ ์‹ ์†ํ•˜๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ์กฐ์ •ํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๋™๋ฃŒ๋Š” ํŠน๋ณ„ํ•œ ๊ต์œก ์—†์ด ๋„ํฌ์—์„œ ์ตœ์†Œํ•œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์บก์…˜ ๋“ฑ์„ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.))

๋ฌด์—‡์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก  ์—ฌ๊ธฐ์—๋Š” ๋งŽ์€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์•„์ด์ฝ˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ์กด ์•„์ด์ฝ˜์€ ๋ชจ๋‘ ์Šคํฌ๋ฆฝํŠธ์— ์ธ๋ผ์ธ์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค). ๋ณด๋‹ค ํ‘œํ˜„๋ ฅ์ด ํ’๋ถ€ํ•œ ์•„์ด์ฝ˜ ์„ธํŠธ๋ฅผ ์„ ํƒํ•˜์„ธ์š”. ์—ฐ๊ฒฐ์„ ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?
 
์ด์Šˆ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฏ€๋กœ ๋Œ“๊ธ€์— ์•„์ด๋””์–ด๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์†”๋ฃจ์…˜์€ ํ™•์‹คํžˆ ์ข์€ ๋ฒ”์œ„์˜ ๋ฌธ์ œ์— ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์•„๋งˆ๋„ '๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ฝ”๋“œ๋กœ ๋ณด์—ฌ์ฃผ์„ธ์š”'๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํžˆ ์ฝ”๋”ฉํ•˜์—ฌ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๊ทธ๋ฆฌ๋Š” ๋ฐ ๋” ํŽธ๋ฆฌํ•œ ๋„๊ตฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ์ข‹์€ ์„ ํƒ
  2. ํ›Œ๋ฅญํ•œ ์„œ๋น„์Šค (9์ข…์˜ ์ฐจํŠธ ์˜จ๋ผ์ธ ์—๋””ํ„ฐ)
  3. ๋ฌผ๋ก , mermaid.js
  4. ๋งค์šฐ ์ƒ์„ธํ•˜๊ณ  ๋ณต์žกํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ข‹์•„ํ•œ๋‹ค๋ฉด ์ด ํ”„๋กœ์ ํŠธ์— ํ™•์‹คํžˆ ๊ฐํƒ„ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. go.drawthe.net

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€