ํ”Œ๋Ÿฌ๊ทธ์ธ(Plugin)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž์‹ ๋งŒ์˜ ๊ธฐ๋Šฅ์œผ๋กœ Obsidian์„ ํ™•์žฅํ•˜์—ฌ ๋งž์ถคํ˜• ๋…ธํŠธ ์ž‘์„ฑ ๊ฒฝํ—˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์ƒ˜ํ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์†Œ์Šค ์ฝ”๋“œ(Source Code)์—์„œ ์ปดํŒŒ์ผ(Compile)ํ•˜๊ณ  Obsidian์— ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

ํ•™์Šต ๋‚ด์šฉ

์ด ํŠœํ† ๋ฆฌ์–ผ์„ ์™„๋ฃŒํ•˜๋ฉด ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:

  • Obsidian ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ™˜๊ฒฝ ๊ตฌ์„ฑ
  • ์†Œ์Šค ์ฝ”๋“œ์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ปดํŒŒ์ผ
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ˆ˜์ •ํ•œ ํ›„ ๋‹ค์‹œ ๋กœ๋“œ

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

์ด ํŠœํ† ๋ฆฌ์–ผ์„ ์™„๋ฃŒํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ๋กœ์ปฌ ๋จธ์‹ ์— ์„ค์น˜๋œ Git
  • Node.js์šฉ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
  • Visual Studio Code์™€ ๊ฐ™์€ ์ฝ”๋“œ ์—๋””ํ„ฐ(Code Editor)

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•œ ๋ฒˆ์˜ ์‹ค์ˆ˜๋กœ ๋ณผํŠธ(Vault)์— ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๋ฉ”์ธ ๋ณผํŠธ์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐœ๋ฐœ ์ „์šฉ ๋ณ„๋„ ๋ณผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋นˆ ๋ณผํŠธ ๋งŒ๋“ค๊ธฐ.

1๋‹จ๊ณ„: ์ƒ˜ํ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‹ค์šด๋กœ๋“œ

์ด ๋‹จ๊ณ„์—์„œ๋Š” Obsidian์ด ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋ณผํŠธ์˜ .obsidian ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด plugins ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒ˜ํ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์‚ฌ์šฉํ•  ์ƒ˜ํ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ GitHub ์ €์žฅ์†Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ„ฐ๋ฏธ๋„(Terminal) ์ฐฝ์„ ์—ด๊ณ  ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ plugins ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    cd path/to/vault
    mkdir .obsidian/plugins
    cd .obsidian/plugins
  2. Git์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ˜ํ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํด๋ก (Clone)ํ•ฉ๋‹ˆ๋‹ค.

    git clone https://github.com/obsidianmd/obsidian-sample-plugin.git

GitHub ํ…œํ”Œ๋ฆฟ ์ €์žฅ์†Œ

์ƒ˜ํ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ €์žฅ์†Œ๋Š” GitHub ํ…œํ”Œ๋ฆฟ ์ €์žฅ์†Œ(Template Repository)์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ƒ˜ํ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ž์‹ ๋งŒ์˜ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ํ…œํ”Œ๋ฆฟ์—์„œ ์ €์žฅ์†Œ ๋งŒ๋“ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ƒ˜ํ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํด๋ก ํ•  ๋•Œ๋Š” ์ž์‹ ์˜ ์ €์žฅ์†Œ URL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

2๋‹จ๊ณ„: ํ”Œ๋Ÿฌ๊ทธ์ธ ๋นŒ๋“œ

์ด ๋‹จ๊ณ„์—์„œ๋Š” Obsidian์ด ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒ˜ํ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

  1. ํ”Œ๋Ÿฌ๊ทธ์ธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    cd obsidian-sample-plugin
  2. ์˜์กด์„ฑ(Dependencies)์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    npm install
  3. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์€ ํ„ฐ๋ฏธ๋„์—์„œ ๊ณ„์† ์‹คํ–‰๋˜๋ฉฐ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

    npm run dev

ํ”Œ๋Ÿฌ๊ทธ์ธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ด์ œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ปดํŒŒ์ผ๋œ ๋ฒ„์ „์ด ํฌํ•จ๋œ main.js ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๋‹จ๊ณ„: ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™œ์„ฑํ™”

Obsidian์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋กœ๋“œํ•˜๋ ค๋ฉด ๋จผ์ € ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. Obsidian์—์„œ ์„ค์ •์„ ์—ฝ๋‹ˆ๋‹ค.
  2. ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด์—์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ผœ๊ธฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. ์„ค์น˜๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„๋ž˜์—์„œ Sample Plugin ์˜†์˜ ํ† ๊ธ€ ๋ฒ„ํŠผ์„ ์„ ํƒํ•˜์—ฌ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ Obsidian์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ผ๋ถ€ ๋ณ€๊ฒฝํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

4๋‹จ๊ณ„: ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์—…๋ฐ์ดํŠธ

์ด ๋‹จ๊ณ„์—์„œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ(Manifest) manifest.json์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ด๋ฆ„๊ณผ ์„ค๋ช… ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ฝ”๋“œ ์—๋””ํ„ฐ์—์„œ manifest.json์„ ์—ฝ๋‹ˆ๋‹ค.
  2. id๋ฅผ "hello-world"์™€ ๊ฐ™์€ ๊ณ ์œ  ์‹๋ณ„์ž๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  3. name์„ "Hello world"์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  4. ํ”Œ๋Ÿฌ๊ทธ์ธ ํด๋” ์ด๋ฆ„์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ id์™€ ์ผ์น˜ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  5. ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ์ƒˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋กœ๋“œํ•˜๋ ค๋ฉด Obsidian์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด๋ฆ„์ด ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋œ ๊ฒƒ์„ ํ™•์ธํ•˜์„ธ์š”.

manifest.json์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค Obsidian์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

5๋‹จ๊ณ„: ์†Œ์Šค ์ฝ”๋“œ ์—…๋ฐ์ดํŠธ

์‚ฌ์šฉ์ž๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ–ˆ์„ ๋•Œ ์ธ์‚ฌ๋ง์„ ํ‘œ์‹œํ•˜๋Š” _๋ฆฌ๋ณธ ์•„์ด์ฝ˜(Ribbon Icon)_์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ฝ”๋“œ ์—๋””ํ„ฐ์—์„œ main.ts๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

  2. ํ”Œ๋Ÿฌ๊ทธ์ธ ํด๋ž˜์Šค(Class) ์ด๋ฆ„์„ MyPlugin์—์„œ HelloWorldPlugin์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  3. obsidian ํŒจํ‚ค์ง€(Package)์—์„œ Notice๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค(Import).

    import { Notice, Plugin } from 'obsidian';
  4. onload() ๋ฉ”์„œ๋“œ(Method)์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

    this.addRibbonIcon('dice', 'Greet', () => {
      new Notice('Hello, world!');
    });
  5. **๋ช…๋ น ํŒ”๋ ˆํŠธ(Command Palette)**์—์„œ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์•ฑ ๋‹ค์‹œ ๋กœ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹ค์‹œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ Obsidian ์ฐฝ ์™ผ์ชฝ์˜ ๋ฆฌ๋ณธ์—์„œ ์ฃผ์‚ฌ์œ„ ์•„์ด์ฝ˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์„ ํƒํ•˜๋ฉด ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ ๋ชจ์„œ๋ฆฌ์— ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„์—๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹ค์‹œ ๋กœ๋“œํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํŒจ๋„์—์„œ ๋น„ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์ด ๋‹จ๊ณ„์˜ 5๋ฒˆ์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ๋ช…๋ น ํŒ”๋ ˆํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ•ซ ๋ฆฌ๋กœ๋”ฉ(Hot Reloading)

๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋ ค๋ฉด Hot-Reload ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜์„ธ์š”.

๊ฒฐ๋ก 

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” TypeScript API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ Obsidian ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋นŒ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์‹œ ๋กœ๋“œํ•˜์—ฌ Obsidian ๋‚ด์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.