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

์ฐฝ์˜์ ์ธ ์ƒ๊ฐ์„ ์ž์œ ๋กญ๊ฒŒ ๊ทธ๋ฆฌ๋Š” ํ™”์ดํŠธ๋ณด๋“œ Excalidraw

by ๐Ÿ’ฒ๐ŸŽตโœ–๏ธโœ”๏ธโ˜ผ 2025. 5. 12.

Excalidraw๋Š” ๊ฐœ๋ฐœ์ž์™€ ๋””์ž์ด๋„ˆ๋ฅผ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ™”์ดํŠธ๋ณด๋“œ ๋„๊ตฌ๋‹ค. Wireframe๊ณผ diagram ์ž‘์„ฑ ๋„๊ตฌ ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ์ง๊ด€์ ์ด๊ณ  ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Excalidraw์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ํ™œ์šฉ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฌ๋‹ค.

์†Œ๊ฐœ

Excalidraw๋Š” ์›น ๊ธฐ๋ฐ˜์˜ ๋“œ๋กœ์ž‰ ๋„๊ตฌ๋กœ, ๊ฐœ๋ฐœ์ž์™€ ๋””์ž์ด๋„ˆ๊ฐ€ ์•„์ด๋””์–ด๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” ๋ฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค. ์ง๊ด€์ ์ธ interface์™€ ๋‹ค์–‘ํ•œ function์„ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ prototype์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ excalidraw.com์— ์ ‘์†ํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ์— ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Excalidraw์˜ ํ™œ์šฉ ๋ถ„์•ผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

  • ๋น ๋ฅธ wireframe ์ œ์ž‘์ด ํ•„์š”ํ•  ๋•Œ
  • ํŒ€๊ณผ์˜ ์•„์ด๋””์–ด ๊ณต์œ ์™€ ํ˜‘์—…์ด ํ•„์š”ํ•  ๋•Œ
  • ๋ณต์žกํ•œ system architecture๋ฅผ ์‹œ๊ฐํ™”ํ•  ๋•Œ
  • UI/UX design์„ ๋น ๋ฅด๊ฒŒ ํ”„๋กœํ† ํƒ€์ดํ•‘ํ•  ๋•Œ

Guide

Getting Started

๋กœ์ปฌ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด npm, yarn, pnpm ์ค‘ ์„ ํ˜ธํ•˜๋Š” ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค. pnpm์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š”๋ฐ, ์„ค์น˜ ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

pnpm add @excalidraw/excalidraw@latest

์„ค์น˜ ํ›„ React ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

import { Excalidraw } from "@excalidraw/excalidraw";

function App() {
  return (
    <div style={{ height: "500px" }}>
    <Excalidraw
      initialData={{
          appState: { viewBackgroundColor: "#ffffff" },
        elements: [],
        }}
      />
    </div>
  );
}

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ฐ”๋กœ ๋“œ๋กœ์ž‰์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๋“œ๋กœ์ž‰ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ์ง๊ด€์ ์ด๋‹ค. R ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด rectangle์„, C ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด circle์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. L ํ‚ค๋กœ line์„ ๊ทธ๋ฆฌ๊ณ , D ํ‚ค๋กœ diamond๋ฅผ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํ…์ŠคํŠธ๋Š” T ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํฐํŠธ ํฌ๊ธฐ๋Š” Ctrl/Cmd + +/- ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

์š”์†Œ๋ฅผ ์„ ํƒํ•˜๊ณ  ์ด๋™ํ•  ๋•Œ๋Š” V ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์š”์†Œ๋ฅผ dragํ•˜์—ฌ ์ด๋™ํ•˜๊ณ , Shift + drag๋กœ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. Alt + drag๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”์†Œ๋ฅผ ๋ณต์ œํ•  ์ˆ˜ ์žˆ์–ด ๋น ๋ฅธ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ดˆ๊ธฐ ์„ค์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค

  1. Dark mode ์„ค์ •: appState: { theme: "dark" }
  2. Grid ์„ค์ •: gridSize: 20
  3. Export ์„ค์ •: exportScale: 2

Basic Features

์ฃผ์š” tool์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ๋ถ„๋œ๋‹ค

  • ๊ธฐ๋ณธ ๋„ํ˜•: rectangle, circle, diamond, arrow
    • rectangle: UI component, container ํ‘œํ˜„์— ํ™œ์šฉ
    • circle: icon, button, node ํ‘œํ˜„์— ํ™œ์šฉ
    • diamond: decision point, condition ํ‘œํ˜„์— ํ™œ์šฉ
    • arrow: flow, relationship ํ‘œํ˜„์— ํ™œ์šฉ
  • ํ…์ŠคํŠธ: ๋‹ค์–‘ํ•œ font์™€ ํฌ๊ธฐ ์ง€์›
    • ์ œ๋ชฉ: 24px, Bold
    • ๋ถ€์ œ๋ชฉ: 18px, Semi-bold
    • ๋ณธ๋ฌธ: 14px, Regular
    • ์„ค๋ช…: 12px, Light
  • Line: straight line, curve, arrow, dotted line
    • straight line: ๊ธฐ๋ณธ ์—ฐ๊ฒฐ์„ 
    • curve: ์ž์—ฐ์Šค๋Ÿฌ์šด flow ํ‘œํ˜„
    • arrow: ๋ฐฉํ–ฅ์„ฑ ์žˆ๋Š” ๊ด€๊ณ„ ํ‘œํ˜„
    • dotted line: ์„ ํƒ์ /๊ฐ€๋Šฅํ•œ ๊ด€๊ณ„ ํ‘œํ˜„
  • ์ƒ‰์ƒ: background color, line color, opacity ์กฐ์ ˆ
    • Primary: #1a73e8 (Google Blue)
    • Secondary: #5f6368 (Gray)
    • Accent: #ea4335 (Red)
    • Background: #ffffff (White)
  • Style: line weight, dash style, corner radius
    • line weight: 1px (thin), 2px (normal), 4px (bold)
    • dash style: solid, dashed, dotted
    • corner radius: 0px (sharp), 4px (rounded), 8px (pill)

Additional Features

์ถ”๊ฐ€์ ์ธ function์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค

  • Layer Management
    • ์š”์†Œ๋ฅผ layer๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ด€๋ฆฌ
      • Background Layer: ๋ฐฐ๊ฒฝ ์š”์†Œ
      • Content Layer: ์ฃผ์š” ์ฝ˜ํ…์ธ 
      • Annotation Layer: ์„ค๋ช…๊ณผ ์ฃผ์„
      • UI Layer: ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ
    • layer ์ˆœ์„œ ๋ณ€๊ฒฝ์œผ๋กœ ์š”์†Œ ๊ฒน์นจ ์ œ์–ด
      • Ctrl/Cmd + ]: layer ์œ„๋กœ ์ด๋™
      • Ctrl/Cmd + [: layer ์•„๋ž˜๋กœ ์ด๋™
    • layer ์ž ๊ธˆ์œผ๋กœ ์‹ค์ˆ˜ ๋ฐฉ์ง€
      • Ctrl/Cmd + Shift + L: layer ์ž ๊ธˆ/ํ•ด์ œ
    • layer ๊ทธ๋ฃนํ™”๋กœ ๋ณต์žกํ•œ ๊ตฌ์กฐ ๊ด€๋ฆฌ
      • Ctrl/Cmd + G: ์„ ํƒ ์š”์†Œ ๊ทธ๋ฃนํ™”
      • Ctrl/Cmd + Shift + G: ๊ทธ๋ฃน ํ•ด์ œ
  • Grid System
    • ์ •๋ฐ€ํ•œ ์ •๋ ฌ์„ ์œ„ํ•œ grid ํ™œ์„ฑํ™”
      • ๊ธฐ๋ณธ grid: 20px
      • ์„ธ๋ฐ€ํ•œ grid: 10px
      • ๋Œ€ํ˜• grid: 40px
    • grid ํฌ๊ธฐ ์กฐ์ ˆ๋กœ ์„ธ๋ฐ€ํ•œ ์ž‘์—… ๊ฐ€๋Šฅ
      • Ctrl/Cmd + ,: grid ์„ค์ •
      • Ctrl/Cmd + .: grid ํ‘œ์‹œ/์ˆจ๊น€
    • snap ๊ธฐ๋Šฅ์œผ๋กœ ์š”์†Œ ์ •๋ ฌ ์šฉ์ด
      • Ctrl/Cmd + Shift + S: snap ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”
    • custom grid ์„ค์ •์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ณ„ ์ตœ์ ํ™”
      • UI Design: 8px grid
      • Architecture: 20px grid
      • Flow Chart: 40px grid
  • Style Preset
    • ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” style์„ preset์œผ๋กœ ์ €์žฅ
      • UI Component Style
      • Architecture Style
      • Flow Chart Style
    • ์ผ๊ด€๋œ design ์œ ์ง€
      • Color Palette
      • Typography
      • Spacing
    • ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ design system ๊ตฌ์ถ•
      • Shared Library
      • Component Library
      • Style Guide
    • AI ๊ธฐ๋ฐ˜ style ์ถ”์ฒœ ๊ธฐ๋Šฅ ํ™œ์šฉ
      • Auto Layout
      • Style Matching
      • Color Harmony

Performance & Optimization

ํšจ์œจ์ ์ธ ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค

  • Keyboard Shortcuts
    • Basic Operations
      • Ctrl/Cmd + Z: undo
      • Ctrl/Cmd + Shift + Z: redo
      • Ctrl/Cmd + D: duplicate
      • Ctrl/Cmd + G: group
      • Ctrl/Cmd + Shift + L: layer lock
    • Advanced Operations
      • Ctrl/Cmd + Shift + C: style ๋ณต์‚ฌ
      • Ctrl/Cmd + Shift + V: style ๋ถ™์—ฌ๋„ฃ๊ธฐ
      • Ctrl/Cmd + Shift + A: ์ „์ฒด ์„ ํƒ
      • Ctrl/Cmd + Shift + F: ์š”์†Œ ์ฐพ๊ธฐ
      • Ctrl/Cmd + Shift + E: export
  • Template System
    • ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” layout์„ template์œผ๋กœ ์ €์žฅ
      • UI Wireframe Template
      • System Architecture Template
      • Flow Chart Template
    • ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๊ด€๋œ design ์œ ์ง€
      • Design System Template
      • Component Library
      • Style Guide
    • ๋น ๋ฅธ prototyping ๊ฐ€๋Šฅ
      • Mobile App Template
      • Web App Template
      • Dashboard Template
    • AI ๊ธฐ๋ฐ˜ template ์ถ”์ฒœ ํ™œ์šฉ
      • Layout Suggestion
      • Component Arrangement
      • Style Matching
  • ์‹ค๋ฌด ์ตœ์ ํ™” ํŒ
    • ํŒŒ์ผ ๊ด€๋ฆฌ
      • ์ฃผ๊ธฐ์ ์ธ backup (์ตœ์†Œ 1์ผ 1ํšŒ)
      • version ๊ด€๋ฆฌ (์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งˆ๋‹ค)
      • cloud sync ํ™œ์šฉ (GitHub, Google Drive)
    • ์„ฑ๋Šฅ ๊ด€๋ฆฌ
      • ๋ถˆํ•„์š”ํ•œ ์š”์†Œ ์ œ๊ฑฐ
      • layer ๊ตฌ์กฐ ์ตœ์ ํ™”
      • ์ฃผ๊ธฐ์ ์ธ canvas ์ •๋ฆฌ
    • ํ˜‘์—… ์ตœ์ ํ™”
      • ์ž‘์—… ์˜์—ญ ๋ถ„๋ฆฌ
      • ์ฃผ๊ธฐ์  save
      • ๋ณ€๊ฒฝ ์ด๋ ฅ ์ถ”์ 

Troubleshooting

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” issue์™€ solution์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค

  • Performance Issues
    • ์š”์†Œ๊ฐ€ ๋งŽ์„ ๋•Œ ๋А๋ ค์ง€๋Š” ํ˜„์ƒ
      • solution: ๋ถˆํ•„์š”ํ•œ ์š”์†Œ ์ œ๊ฑฐ
      • solution: layer ๊ตฌ์กฐ ์ตœ์ ํ™”
      • solution: groupํ™”๋กœ ์š”์†Œ ์ˆ˜ ๊ฐ์†Œ
    • ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์‹œ memory ๊ด€๋ฆฌ
      • solution: ์ฃผ๊ธฐ์ ์ธ canvas ์ •๋ฆฌ
      • solution: ๋ถˆํ•„์š”ํ•œ history ์ œ๊ฑฐ
      • solution: export ํ›„ ์ƒˆ ํŒŒ์ผ๋กœ ์ž‘์—…
    • ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ €ํ•˜
      • solution: ๋ณต์žกํ•œ ๋„ํ˜• ๋‹จ์ˆœํ™”
      • solution: text ์š”์†Œ ์ตœ์†Œํ™”
      • solution: layer ์ˆ˜ ์ œํ•œ
  • Collaboration Issues
    • ๋™์‹œ ํŽธ์ง‘ ์‹œ conflict
      • solution: ์ž‘์—… ์˜์—ญ ๋ถ„๋ฆฌ
      • solution: ์ฃผ๊ธฐ์  save
      • solution: version ๊ด€๋ฆฌ ์ „๋žต ์ˆ˜๋ฆฝ
    • ๋ณ€๊ฒฝ ์ด๋ ฅ ์ถ”์ 
      • solution: GitHub ํ†ตํ•ฉ
      • solution: ์ฃผ๊ธฐ์  commit
      • solution: ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฌธ์„œํ™”
    • ํŒŒ์ผ ๊ณต์œ  ๋ฌธ์ œ
      • solution: cloud storage ํ™œ์šฉ
      • solution: export ํ˜•์‹ ์ตœ์ ํ™”
      • solution: ๊ถŒํ•œ ๊ด€๋ฆฌ ์„ค์ •
  • Export & Import Issues
    • ํ•ด์ƒ๋„ ๋ฌธ์ œ
      • solution: exportScale ์กฐ์ •
      • solution: SVG ํ˜•์‹ ํ™œ์šฉ
      • solution: PNG ์ตœ์ ํ™”
    • ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ
      • solution: JSON ๋ฐฑ์—…
      • solution: SVG ๋ณ€ํ™˜
      • solution: PNG fallback

Reference

๋Œ“๊ธ€