๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

Open WebUI์— ๊ธฐ์—ฌํ•  ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”? ์‹œ์ž‘ํ•ด๋ด…์‹œ๋‹ค! ๐Ÿš€

Open WebUI ๊ฐœ๋ฐœ์— ๋›ฐ์–ด๋“ค ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‚˜์š”? ์ด ์ข…ํ•ฉ์ ์ธ ๊ฐ€์ด๋“œ๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“  ์ดˆ๋ณด์ž๋“  ๊ด€๊ณ„์—†์ด, ํ”„๋ŸฐํŠธ์—”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ๋ฐฑ์—”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๋ฉฐ Open WebUI์˜ ๋ฏธ๋ž˜์— ๊ธฐ์—ฌํ•  ์ค€๋น„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค! ๊ฐ„๋‹จํ•˜๊ณ  ์ƒ์„ธํ•œ ๋‹จ๊ณ„๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ค€๋น„ํ•ด๋ด…์‹œ๋‹ค!

์‚ฌ์ „ ์ค€๋น„โ€‹

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์‹œ์Šคํ…œ์ด ๋‹ค์Œ ์ตœ์†Œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”:

  • ์šด์˜ ์ฒด์ œ: Linux (๋˜๋Š” Windows์˜ WSL), Windows 11, ๋˜๋Š” macOS. (์ตœ์ƒ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๊ถŒ์žฅ)
  • Python: 3.11 ์ด์ƒ ๋ฒ„์ „. (๋ฐฑ์—”๋“œ ์„œ๋น„์Šค ํ•„์ˆ˜)
  • Node.js: 22.10 ์ด์ƒ ๋ฒ„์ „. (ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ ํ•„์ˆ˜)
  • ๊ถŒ์žฅ IDE: VSCode์™€ ๊ฐ™์€ IDE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ํŽธ์ง‘, ๋””๋ฒ„๊น… ๋ฐ ํ†ตํ•ฉ ํ„ฐ๋ฏธ๋„ ์ ‘๊ทผ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์„ ํ˜ธํ•˜๋Š” IDE๊ฐ€ ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉํ•˜์…”๋„ ์ข‹์Šต๋‹ˆ๋‹ค!
  • [์„ ํƒ ์‚ฌํ•ญ] GitHub Desktop: ์ปค๋งจ๋“œ๋ผ์ธ Git ์‚ฌ์šฉ์ด ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Git ์ €์žฅ์†Œ ๊ด€๋ฆฌ๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด GitHub Desktop ์„ค์น˜๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.

๋กœ์ปฌ ํ™˜๊ฒฝ ์„ค์ •โ€‹

Open WebUI์˜ ํ”„๋ŸฐํŠธ์—”๋“œ (์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค)์™€ ๋ฐฑ์—”๋“œ (API ๋ฐ ์„œ๋ฒ„ ๋กœ์ง) ๋ชจ๋‘๋ฅผ ์„ค์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํด๋ก โ€‹

๋จผ์ € git clone ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Open WebUI ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋กœ์ปฌ ๋จธ์‹ ์— ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”. ์ด๋Š” ๋กœ์ปฌ ์ปดํ“จํ„ฐ์— ํ”„๋กœ์ ํŠธ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  1. ํ„ฐ๋ฏธ๋„ ์—ด๊ธฐ (Windows์—์„œ Git Bash๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด Git Bash๋ฅผ ์—ฝ๋‹ˆ๋‹ค).
  2. Open WebUI ํ”„๋กœ์ ํŠธ๋ฅผ ์ €์žฅํ•  ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™.
  3. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํด๋ก : ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”:
git clone https://github.com/open-webui/open-webui.git
cd open-webui

git clone ๋ช…๋ น์ด GitHub์—์„œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. cd open-webui ๋ช…๋ น์€ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

2. ํ”„๋ŸฐํŠธ์—”๋“œ ์„ค์ • (์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค)โ€‹

๋จผ์ € ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(๋ธŒ๋ผ์šฐ์ €์— ํ‘œ์‹œ๋˜๋Š” ๋ถ€๋ถ„)๋ฅผ ์‹คํ–‰ํ•ด๋ด…์‹œ๋‹ค:

  1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ตฌ์„ฑ:
    • ์˜ˆ์ œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ .env๋กœ ๋ณต์‚ฌ:

      cp -RPp .env.example .env

      ์ด ๋ช…๋ น์€ .env.example ํŒŒ์ผ์„ .env๋ผ๋Š” ์ƒˆ ํŒŒ์ผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. .env ํŒŒ์ผ์€ ํ”„๋ŸฐํŠธ์—”๋“œ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • .env ํŒŒ์ผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•: ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ(์˜ˆ: VSCode)์—์„œ .env ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์—๋Š” API ์—”๋“œํฌ์ธํŠธ ๋ฐ ๊ธฐํƒ€ ์„ค์ •๊ณผ ๊ฐ™์€ ํ”„๋ŸฐํŠธ์—”๋“œ ๊ตฌ์„ฑ ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ฐœ๋ฐœ์—์„œ๋Š” .env.example์˜ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•„์š”ํ•˜๋ฉด ์ด๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”: ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๊ธฐ์—ฌํ•  ๋•Œ .env์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์„ธ์š”.

  1. ํ”„๋ŸฐํŠธ์—”๋“œ ์ข…์†์„ฑ ์„ค์น˜:

    • ํ”„๋ŸฐํŠธ์—”๋“œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™: ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ(open-webui ๋””๋ ‰ํ† ๋ฆฌ)์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

      # ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์‹คํ–‰:
      cd open-webui
    • ํ•„์š”ํ•œ JavaScript ํŒจํ‚ค์ง€ ์„ค์น˜:

      npm install

      ์ด ๋ช…๋ น์€ npm(Node ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์˜ package.json ํŒŒ์ผ์„ ์ฝ๊ณ  ํ”„๋ŸฐํŠธ์—”๋“œ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋„๊ตฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ ์†๋„์— ๋”ฐ๋ผ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘:

    npm run dev

    ์ด ๋ช…๋ น์€ ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ๊ณ„๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋”ฐ๋ฅด๋ฉด ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ž„์„ ๋‚˜ํƒ€๋‚ด๊ณ  ๋กœ์ปฌ URL์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ๐ŸŽ‰ ํ”„๋ŸฐํŠธ์—”๋“œ ์ ‘๊ทผ: ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  http://localhost:5173์œผ๋กœ ์ด๋™ํ•˜์„ธ์š”. Open WebUI์˜ ํ”„๋ŸฐํŠธ์—”๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ฉฐ ๋ฐฑ์—”๋“œ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ง ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”! ์ด์ œ ๋ฐฑ์—”๋“œ๋ฅผ ์„ค์ •ํ•ด๋ด…์‹œ๋‹ค. ์ด ํ„ฐ๋ฏธ๋„์€ ๊ณ„์† ์‹คํ–‰ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜์„ธ์š” โ€“ ํ”„๋ŸฐํŠธ์—”๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

3. ๋ฐฑ์—”๋“œ ์„ค์ • (API ๋ฐ ์„œ๋ฒ„)โ€‹

๋” ์›ํ™œํ•œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์œ„ํ•ด ํ”„๋ŸฐํŠธ์—”๋“œ ๋ฐ ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค์— ๋ณ„๋„์˜ ํ„ฐ๋ฏธ๋„ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ž‘์—… ํ๋ฆ„์„ ๋” ์ฒด๊ณ„์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ ๋ถ€๋ถ„์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์™œ ๋ณ„๋„์˜ ํ„ฐ๋ฏธ๋„์ด ํ•„์š”ํ•œ๊ฐ€์š”?

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

VSCode ํ†ตํ•ฉ ํ„ฐ๋ฏธ๋„ ์‚ฌ์šฉ (๊ถŒ์žฅ):

VSCode์˜ ํ†ตํ•ฉ ํ„ฐ๋ฏธ๋„ ๊ธฐ๋Šฅ์€ ์—ฌ๋Ÿฌ ํ„ฐ๋ฏธ๋„ ๊ด€๋ฆฌ๋ฅผ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด ๋‹ค์Œ์„ ํ™œ์šฉํ•ด๋ณด์„ธ์š”:

  1. ํ”„๋ก ํŠธ์—”๋“œ ํ„ฐ๋ฏธ๋„ (์ด๋ฏธ ์—ด๋ ค ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ): ํ”„๋ก ํŠธ์—”๋“œ ์„ค์ • ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ž๋‹ค๋ฉด, ์•„๋งˆ ์ด๋ฏธ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ(open-webui ๋””๋ ‰ํ† ๋ฆฌ)์—์„œ VSCode ํ„ฐ๋ฏธ๋„์„ ์—ด์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ”„๋ก ํŠธ์—”๋“œ ๋ช…๋ น์–ด(npm run dev ๋“ฑ)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— open-webui ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

  2. ๋ฐฑ์—”๋“œ ํ„ฐ๋ฏธ๋„ (์ƒˆ๋กœ ์—ด๊ธฐ):

    • VSCode์—์„œ Terminal > New Terminal๋กœ ์ด๋™ (๋˜๋Š” Windows/Linux์˜ ๊ฒฝ์šฐ Ctrl+Shift+ ๋‹จ์ถ•ํ‚ค, macOS์˜ ๊ฒฝ์šฐ Cmd+Shift+ ์‚ฌ์šฉ)ํ•˜์—ฌ ์ƒˆ ํ†ตํ•ฉ ํ„ฐ๋ฏธ๋„ ํŒจ๋„์„ ์—ฝ๋‹ˆ๋‹ค.
    • backend ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™: ์ด ์ƒˆ๋กœ์šด ํ„ฐ๋ฏธ๋„์—์„œ cd backend ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ backend ํด๋”๋กœ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ๋ฐฑ์—”๋“œ ๊ด€๋ จ ๋ช…๋ น์–ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

    ์ด์ œ VSCode ๋‚ด์—์„œ ํ”„๋ก ํŠธ์—”๋“œ(open-webui ๋””๋ ‰ํ† ๋ฆฌ)์— ๋Œ€ํ•œ ํ„ฐ๋ฏธ๋„๊ณผ ๋ฐฑ์—”๋“œ(backend ๋””๋ ‰ํ† ๋ฆฌ)์— ๋Œ€ํ•œ ํ„ฐ๋ฏธ๋„ ๋‘ ๊ฐœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. VSCode ๋‚ด์—์„œ ์ด๋“ค ํ„ฐ๋ฏธ๋„ ๊ฐ„์„ ์‰ฝ๊ฒŒ ์ „ํ™˜ํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ๋ณด๋‹ค ๊น”๋”ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์œ„ํ•ด ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœ๋ฉ๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ ์„ค์ • ๋‹จ๊ณ„ (๋ฐฑ์—”๋“œ ํ„ฐ๋ฏธ๋„์—์„œ):

  1. ๋ฐฑ์—”๋“œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™: (์ด์ „ ๋‹จ๊ณ„์—์„œ ์ƒˆ๋กœ์šด ํ„ฐ๋ฏธ๋„์—์„œ ์ด๋ฏธ backend ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.) ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”:

    cd backend
  2. Conda ํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™” (๊ถŒ์žฅ):

    • Conda๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Python ์ข…์†์„ฑ๊ณผ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ์Šคํ…œ ๋‚ด ๋‹ค๋ฅธ Python ํ”„๋กœ์ ํŠธ์™€์˜ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์˜ฌ๋ฐ”๋ฅธ Python ๋ฒ„์ „ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

      conda create --name open-webui python=3.11
      conda activate open-webui
      • conda create --name open-webui python=3.11: ์ด ๋ช…๋ น์–ด๋Š” Python 3.11 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” open-webui๋ผ๋Š” ์ด๋ฆ„์˜ ์ƒˆ๋กœ์šด Conda ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ Python 3.11.x ๋ฒ„์ „์ด ๋‹ค๋ฅด๋”๋ผ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
      • conda activate open-webui: ์ด ๋ช…๋ น์–ด๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋œ Conda ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋˜๋ฉด ํ„ฐ๋ฏธ๋„ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ open-webui ํ™˜๊ฒฝ์— ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋„๋ก ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค (์˜ˆ: (open-webui)๊ฐ€ ์ค„์˜ ์‹œ์ž‘์— ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Œ).

    ๋ฐฑ์—”๋“œ ํ„ฐ๋ฏธ๋„์—์„œ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•œ ํ›„ ์ง„ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

    (Conda ์‚ฌ์šฉ์€ ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ, Python ์ข…์†์„ฑ ๊ด€๋ฆฌ ๋ฐ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.) Conda ์‚ฌ์šฉ์„ ์„ ํƒํ•˜์ง€ ์•Š๋”๋ผ๋„, Python 3.11 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ข…์†์„ฑ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

  3. ๋ฐฑ์—”๋“œ ์ข…์†์„ฑ ์„ค์น˜:

    • ๋ฐฑ์—”๋“œ ํ„ฐ๋ฏธ๋„์—์„œ (Conda๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ) ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”:
    pip install -r requirements.txt -U

    ์ด ๋ช…๋ น์–ด๋Š” pip (Python ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ backend ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ requirements.txt ํŒŒ์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค. requirements.txt๋Š” ๋ฐฑ์—”๋“œ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. pip install์€ ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์„ฑ Python ํ™˜๊ฒฝ (Conda ํ™˜๊ฒฝ ์‚ฌ์šฉ ์‹œ ํ•ด๋‹น ํ™˜๊ฒฝ, ์•„๋‹ˆ๋ฉด ์‹œ์Šคํ…œ ์ „์ฒด Python ํ™˜๊ฒฝ)์— ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. -U ํ”Œ๋ž˜๊ทธ๋Š” ํ˜ธํ™˜๋˜๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘:

    • ๋ฐฑ์—”๋“œ ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:
    sh dev.sh

    ์ด ๋ช…๋ น์–ด๋Š” dev.sh ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. (๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰ ์ค‘ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์—์„œ dev.sh ํŒŒ์ผ์„ ์—ด์–ด ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‹œ์ž‘ ํ›„ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

    ๐Ÿ“„ API ๋ฌธ์„œ ํƒ์ƒ‰ํ•˜๊ธฐ: ๋ฐฑ์—”๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ผ ๋•Œ, ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋™ ์ƒ์„ฑ๋œ API ๋ฌธ์„œ์— http://localhost:8080/docs์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๋ฐฑ์—”๋“œ API ์—”๋“œํฌ์ธํŠธ, ๋ฐฑ์—”๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ ์˜ˆ์ƒ/๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ค‘ ์ด ๋ฌธ์„œ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜์„ธ์š”!

๐ŸŽ‰ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ž๋‹ค๋ฉด ๋กœ์ปฌ์—์„œ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰ ์ค‘์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์— ์•ก์„ธ์Šคํ–ˆ๋˜ ๋ธŒ๋ผ์šฐ์ € ํƒญ(๋ณดํ†ต http://localhost:5173)์œผ๋กœ ๋Œ์•„๊ฐ€์„ธ์š”. ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์„ธ์š”. ์ด์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ์ปฌ ๋ฐฑ์—”๋“œ์™€ ์—ฐ๊ฒฐ๋œ ์ „์ฒด Open WebUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐโ€‹

์„ค์น˜๋‚˜ ๊ฐœ๋ฐœ ์ค‘์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

๐Ÿ’ฅ "FATAL ERROR: Reached Heap Limit" (ํ”„๋ก ํŠธ์—”๋“œ)โ€‹

์ด ์˜ค๋ฅ˜๋Š” ์ฃผ๋กœ ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์—…ํ•  ๋•Œ ๋นŒ๋“œ ๊ณผ์ •์—์„œ Node.js๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Node.js ํž™ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ ค Node.js๊ฐ€ ์‚ฌ์šฉํ•  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ํ™•๋ณดํ•˜์„ธ์š”. ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. NODE_OPTIONS ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ (๊ฐœ๋ฐœ ๊ถŒ์žฅ):

    • ํ˜„์žฌ ํ„ฐ๋ฏธ๋„ ์„ธ์…˜์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์ž„์‹œ๋กœ ๋Š˜๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ํ„ฐ๋ฏธ๋„์—์„œ npm run dev ๋˜๋Š” npm run build๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— NODE_OPTIONS ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์„ธ์š”:

      export NODE_OPTIONS="--max-old-space-size=4096" # Linux/macOS (bash, zsh)์šฉ
      # set NODE_OPTIONS=--max-old-space-size=4096 # Windows (๋ช…๋ น ํ”„๋กฌํ”„ํŠธ)์šฉ
      # $env:NODE_OPTIONS="--max-old-space-size=4096" # Windows (PowerShell)์šฉ
      npm run dev

      ์šด์˜ ์ฒด์ œ ๋ฐ ํ„ฐ๋ฏธ๋„์— ๋งž๋Š” ๋ช…๋ น์„ ์„ ํƒํ•˜์„ธ์š”. 4096์€ 4GB ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๊ฐ’์„ ๋” ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: 8GB์— ๋Œ€ํ•ด 8192). ์ด ์„ค์ •์€ ํ˜„์žฌ ํ„ฐ๋ฏธ๋„ ์„ธ์…˜์—์„œ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  2. Dockerfile ์ˆ˜์ •ํ•˜๊ธฐ (๋„์ปค ํ™˜๊ฒฝ์šฉ):

    • ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Dockerfile ๋‚ด์—์„œ NODE_OPTIONS ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋„์ปค ํ™˜๊ฒฝ์—์„œ ์ผ๊ด€๋œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

      ENV NODE_OPTIONS=--max-old-space-size=4096
    • ์ถฉ๋ถ„ํ•œ RAM ํ• ๋‹น: ๋ฐฉ๋ฒ•์— ๊ด€๊ณ„์—†์ด, Node.js์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ RAM์ด ์‹œ์Šคํ…œ ๋˜๋Š” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ตœ์†Œ 4GB RAM์„ ๊ถŒ์žฅํ•˜๋ฉฐ, ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ๋‚˜ ๋ณต์žกํ•œ ๋นŒ๋“œ์˜ ๊ฒฝ์šฐ ๋” ๋งŽ์€ RAM์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ซ์•„ RAM์„ ํ™•๋ณดํ•˜์„ธ์š”.

โš ๏ธ ํฌํŠธ ์ถฉ๋Œ (ํ”„๋ก ํŠธ์—”๋“œ & ๋ฐฑ์—”๋“œ)โ€‹

ํฌํŠธ์™€ ๊ด€๋ จ๋œ "Address already in use" ๋˜๋Š” "Port already bound"์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ด๋Š” ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด 5173(ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ๋ณธ๊ฐ’) ๋˜๋Š” 8080(๋ฐฑ์—”๋“œ ๊ธฐ๋ณธ๊ฐ’) ํฌํŠธ๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํฌํŠธ๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  1. ์ถฉ๋Œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ์‹๋ณ„: ํ•„์š”ํ•œ ํฌํŠธ๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • Linux/macOS: ์ƒˆ ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  lsof ๋˜๋Š” netstat ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์„ธ์š”:
      • lsof -i :5173 (๋˜๋Š” ๋ฐฑ์—”๋“œ ํฌํŠธ์˜ ๊ฒฝ์šฐ :8080)
      • netstat -tulnp | grep 5173 (๋˜๋Š” 8080) ์ด๋Ÿฌํ•œ ๋ช…๋ น์€ ์‚ฌ์šฉ ์ค‘์ธ ํฌํŠธ์˜ ํ”„๋กœ์„ธ์Šค ID(PID)์™€ ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
    • Windows: ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ๋˜๋Š” PowerShell์„ ์—ด๊ณ  netstat ๋˜๋Š” Get-NetTCPConnection์„ ์‚ฌ์šฉํ•˜์„ธ์š”:
      • netstat -ano | findstr :5173 (๋˜๋Š” :8080) (๋ช…๋ น ํ”„๋กฌํ”„ํŠธ)
      • Get-Process -Id (Get-NetTCPConnection -LocalPort 5173).OwningProcess (PowerShell) ์ด๋Ÿฌํ•œ ๋ช…๋ น๋„ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ PID๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  2. ์ถฉ๋Œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ: ํ”„๋กœ์„ธ์Šค ID(PID)๋ฅผ ์‹๋ณ„ํ•œ ํ›„, ํ•ด๋‹น ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ๋ฌด์—‡์ธ์ง€ ํ™•์‹ ์ด ์—†๋Š” ๊ฒฝ์šฐ ์ฃผ์˜ํ•˜์„ธ์š”.

    • Linux/macOS: kill ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์„ธ์š”: kill <PID> (์—ฌ๊ธฐ์„œ <PID>๋Š” ์‹ค์ œ ํ”„๋กœ์„ธ์Šค ID๋กœ ๋Œ€์ฒด). kill๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ kill -9 <PID> (๊ฐ•์ œ ์ข…๋ฃŒ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•˜์„ธ์š”.
    • Windows: ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ๋˜๋Š” PowerShell์—์„œ taskkill ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์„ธ์š”: taskkill /PID <PID> /F (์—ฌ๊ธฐ์„œ <PID>๋Š” ํ”„๋กœ์„ธ์Šค ID๋กœ ๋Œ€์ฒด). /F ํ”Œ๋ž˜๊ทธ๋Š” ๊ฐ•์ œ ์ข…๋ฃŒ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  3. ๋Œ€์•ˆ์œผ๋กœ ํฌํŠธ ๋ณ€๊ฒฝ (๊ณ ๊ธ‰):

    • ์ถฉ๋Œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(์˜ˆ: ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ์„œ๋น„์Šค์ธ ๊ฒฝ์šฐ), ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ/๋˜๋Š” ๋ฐฑ์—”๋“œ๊ฐ€ ๋‹ค๋ฅธ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก Open WebUI๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      • ํ”„๋ก ํŠธ์—”๋“œ ํฌํŠธ: ํ”„๋ก ํŠธ์—”๋“œ ๋ฌธ์„œ๋‚˜ ๊ตฌ์„ฑ ํŒŒ์ผ(์ข…์ข… vite.config.js ๋˜๋Š” ์œ ์‚ฌ)์—์„œ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํฌํŠธ๋ฅผ ์œ„ํ•ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ .env ํŒŒ์ผ๋„ ์กฐ์ •ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ๋ฐฑ์—”๋“œ ํฌํŠธ: dev.sh ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ๋ฐฑ์—”๋“œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ํ™•์ธํ•˜์—ฌ ๋ฐฑ์—”๋“œ ํฌํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์‹œ์ž‘ ๋ช…๋ น ๋˜๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ์˜ .env ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฑ์—”๋“œ URL์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๐Ÿ”„ ํ•ซ ๋ฆฌ๋กœ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Œโ€‹

ํ•ซ ๋ฆฌ๋กœ๋“œ(๋˜๋Š” ํ•ซ ๋ชจ๋“ˆ ๊ต์ฒด - HMR)๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ž๋™์œผ๋กœ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋Š” ๋ฉ‹์ง„ ๊ฐœ๋ฐœ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ๊ฐ€ ํฌ๊ฒŒ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ ๋‹จ๊ณ„:

  1. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ ์—ฌ๋ถ€ ํ™•์ธ: npm run dev(ํ”„๋ก ํŠธ์—”๋“œ)์™€ sh dev.sh(๋ฐฑ์—”๋“œ)๊ฐ€ ๊ฐ๊ฐ์˜ ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰ ์ค‘์ด๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ํ„ฐ๋ฏธ๋„ ์ถœ๋ ฅ์—์„œ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ด๊ณ  "๊ฐ์‹œ ๋ชจ๋“œ" ๋˜๋Š” "๊ฐœ๋ฐœ ๋ชจ๋“œ"๋ผ๊ณ  ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋จผ์ € ํ•ด๊ฒฐํ•˜์‹ญ์‹œ์˜ค.
  2. ๊ฐ์‹œ ๋ชจ๋“œ/HMR ๋ฉ”์‹œ์ง€ ํ™•์ธ: ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ„ฐ๋ฏธ๋„์—์„œ ํ•ซ ๋ฆฌ๋กœ๋“œ ๋˜๋Š” ๊ฐ์‹œ ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "HMR ํ™œ์„ฑํ™”๋จ", "ํŒŒ์ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ฐ์‹œ ์ค‘" ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๋ฌธ๊ตฌ๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์œผ๋ฉด ๊ตฌ์„ฑ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ: ๋•Œ๋กœ๋Š” ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ ๋•Œ๋ฌธ์— ํ•ซ ๋ฆฌ๋กœ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋”๋ผ๋„ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ•์ œ ์ƒˆ๋กœ๊ณ ์นจ์„ ์‹œ๋„ํ•˜์„ธ์š”:
    • Windows/Linux: Ctrl+Shift+R
    • macOS: Cmd+Shift+R
    • ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ํ”„๋ŸฐํŠธ์—”๋“œ๋ฅผ ๋น„๊ณต๊ฐœ/์‹œํฌ๋ฆฟ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์—์„œ ์—ด์–ด๋ณด์„ธ์š”.
  4. ์ข…์†์„ฑ ๋ฌธ์ œ(ํ”„๋ก ํŠธ์—”๋“œ): ์˜ค๋ž˜๋œ ๋˜๋Š” ์†์ƒ๋œ ํ”„๋ก ํŠธ์—”๋“œ ์ข…์†์„ฑ์€ ํ•ซ ๋ฆฌ๋กœ๋“œ๋ฅผ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ์ข…์†์„ฑ์„ ์ƒˆ๋กœ๊ณ ์นจํ•ด๋ณด์„ธ์š”:
    • ํ”„๋ก ํŠธ์—”๋“œ ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”:

      rm -rf node_modules && npm install

      ์ด ๋ช…๋ น์€ ์ข…์†์„ฑ์ด ์ €์žฅ๋œ node_modules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ญ์ œํ•œ ๋‹ค์Œ ๋‹ค์‹œ ์ƒˆ๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์†์ƒ๋œ ๋˜๋Š” ์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  5. ๋ฐฑ์—”๋“œ ์žฌ์‹œ์ž‘ ํ•„์š”(๋ฐฑ์—”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ธ ๊ฒฝ์šฐ): ํ•ซ ๋ฆฌ๋กœ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ(UI, ์Šคํƒ€์ผ๋ง, ์ปดํฌ๋„ŒํŠธ)์— ๋Œ€ํ•ด ๊ฐ€์žฅ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ(ํŠนํžˆ ์„œ๋ฒ„ ๋กœ์ง, API ์—”๋“œํฌ์ธํŠธ, ์ข…์†์„ฑ ๋ณ€๊ฒฝ ๋“ฑ)์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋ฅผ ์ˆ˜๋™์œผ๋กœ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(sh dev.sh๋ฅผ ์ค‘์ง€ํ•œ ๋‹ค์Œ ๋‹ค์‹œ ์‹คํ–‰). ๋ฐฑ์—”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ•ซ ๋ฆฌ๋กœ๋“œ๋Š” ๋งŽ์€ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ์„ค์ •์—์„œ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‹ ๋ขฐ๋„๊ฐ€ ๋‚ฎ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. IDE/ํŽธ์ง‘๊ธฐ ๋ฌธ์ œ: ๋“œ๋ฌผ๊ฒŒ IDE ๋˜๋Š” ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ํŒŒ์ผ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ์ œ๋Œ€๋กœ ๊ฐ์ง€๋˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IDE๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ์ด ์ œ๋Œ€๋กœ ์ €์žฅ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์„ธ์š”.
  7. ๊ตฌ์„ฑ ๋ฌธ์ œ(๊ณ ๊ธ‰): ์œ„ ๋‹จ๊ณ„ ์ค‘ ์•„๋ฌด ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ํ”„๋ก ํŠธ์—”๋“œ ๋˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์„ค์ •์— ๋” ๋ณต์žกํ•œ ๊ตฌ์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ๋ฌธ์„œ, ๊ตฌ์„ฑ ํŒŒ์ผ(e.g., vite.config.js ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ตฌ์„ฑ ํŒŒ์ผ)์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ Open WebUI ์ปค๋ฎค๋‹ˆํ‹ฐ ๋˜๋Š” ์œ ์ง€๋ณด์ˆ˜ํŒ€์— ๋„์›€์„ ์š”์ฒญํ•˜์„ธ์š”.

Open WebUI์— ๊ธฐ์—ฌํ•˜๊ธฐโ€‹

Open WebUI์— ๋Œ€ํ•œ ๊ธฐ์—ฌ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋”์šฑ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๊ท€ํ•˜์˜ ๋„์›€์ด ๋งค์šฐ ์†Œ์ค‘ํ•ฉ๋‹ˆ๋‹ค. ์›ํ™œํ•˜๊ณ  ํšจ๊ณผ์ ์ธ ๊ธฐ์—ฌ ์›Œํฌํ”Œ๋กœ๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๊ฐ€์ด๋“œ๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค:

  1. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ดํ•ด: ํ”„๋กœ์ ํŠธ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ, ํŠนํžˆ frontend์™€ backend ํด๋”๋ฅผ ์ตํžˆ๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€์„ธ์š”. ์ฝ”๋“œ, ๊ตฌ์„ฑ ํŒŒ์ผ ๋ฐ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์–ด๋–ป๊ฒŒ ์กฐ์ง๋˜์–ด ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜์„ธ์š”.

  2. ์ž‘์€ ๊ธฐ์—ฌ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ: ํ”„๋กœ์ ํŠธ์— ์ฒ˜์Œ ์ฐธ์—ฌํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์€ ๊ธฐ์—ฌ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

    • ๋ฌธ์„œ ๊ฐœ์„ : ์˜คํƒ€ ์ˆ˜์ •, ์„ค๋ช… ๋ช…ํ™•ํ™”, ๋ฌธ์„œ์— ๋” ๋งŽ์€ ์„ธ๋ถ€์‚ฌํ•ญ ์ถ”๊ฐ€.
    • ๋ฒ„๊ทธ ์ˆ˜์ •: ๋ณด๊ณ ๋œ ๋ฒ„๊ทธ ๋˜๋Š” ๋ฌธ์ œ ์ฒ˜๋ฆฌ.
    • ์ž‘์€ UI ๊ฐœ์„ : ์Šคํƒ€์ผ๋ง ๊ฐœ์„ , ์ž‘์€ ๋ ˆ์ด์•„์›ƒ ๋ฌธ์ œ ์ˆ˜์ •. ์ด๋Ÿฌํ•œ ์ž‘์€ ๊ธฐ์—ฌ๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์™€ ๊ธฐ์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ตํžˆ๋Š” ๋ฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  3. ๋” ํฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋จผ์ € ๋…ผ์˜ํ•˜๊ธฐ: ์ค‘์š”ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ๋Œ€๊ทœ๋ชจ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ณ„ํš ์ค‘์ธ ๊ฒฝ์šฐ, ์•„์ด๋””์–ด๋ฅผ ํ”„๋กœ์ ํŠธ ์œ ์ง€๋ณด์ˆ˜ํŒ€ ๋˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋จผ์ € ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

    • GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ด์Šˆ ์—ด๊ธฐ๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ œ์•ˆ.
    • Open WebUI ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฑ„๋„(๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ์˜ README ๋˜๋Š” ์›น์‚ฌ์ดํŠธ์—์„œ ๋งํฌ ํ™•์ธ)์„ ๊ฐ€์ž…ํ•˜์—ฌ ์•„์ด๋””์–ด ๋…ผ์˜. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ธฐ์—ฌ ๋‚ด์šฉ์ด ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ธฐ๋Šฅ์— ๋‚ญ๋น„๋˜๋Š” ๋…ธ๋ ฅ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์ž‘์—…์„ ์œ„ํ•œ ๋ณ„๋„ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ: ์ ˆ๋Œ€๋กœ dev ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ํ•ญ์ƒ ์ž‘์—… ์ค‘์ธ ๊ธฐ๋Šฅ ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์œ„ํ•ด ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ์ด๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ด€๋ฆฌ ๋ฐ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.

    • dev ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ƒˆ ๋ธŒ๋žœ์น˜(e.g., my-feature-branch)๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด:

      git checkout dev
      git pull origin dev # ๋กœ์ปฌ dev ๋ธŒ๋žœ์น˜๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€
      git checkout -b my-feature-branch
  5. ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ž์ฃผ ์ปค๋ฐ‹ํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑ: ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ • ์‹œ ์ž‘์€ ๋…ผ๋ฆฌ์  ์ปค๋ฐ‹์„ ์ž์ฃผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์–ด๋–ค ๋ณ€๊ฒฝ์„ ํ–ˆ๋Š”์ง€์™€ ๊ทธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค. ์ข‹์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ ํ˜‘์—…์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

    • ์ข‹์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์˜ˆ: Fix: ๋ฐฑ์—”๋“œ ์„ค์ • ๋ฌธ์„œ์˜ ์˜คํƒ€ ์ˆ˜์ •
    • ์ข‹์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์˜ˆ: Feat: ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๊ธฐ๋ณธ ์ •๋ณด ํ‘œ์‹œ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  6. dev ๋ธŒ๋žœ์น˜์™€ ์ •๊ธฐ์ ์œผ๋กœ ๋™๊ธฐํ™” ์œ ์ง€: ์ž‘์—… ์ค‘์ธ ๋ธŒ๋žœ์น˜๊ฐ€ dev ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋™๊ธฐํ™”๋˜๋„๋ก ํ•˜์—ฌ ๋‚˜์ค‘์— ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜์‹ญ์‹œ์˜ค:

    git checkout dev
    git pull origin dev
    git checkout my-feature-branch
    git merge dev

    git merge ๋‹จ๊ณ„์—์„œ ๋ฐœ์ƒํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜์‹ญ์‹œ์˜ค.

  7. ํ‘ธ์‹œ ์ „์— ํ…Œ์ŠคํŠธ ์‹คํ–‰ (๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ): ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Open WebUI์— ๋Œ€ํ•œ ํŠน์ • ํ…Œ์ŠคํŠธ ์ ˆ์ฐจ๋ฅผ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์Šต๊ด€์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ๋‚˜ package.json(ํ”„๋ก ํŠธ์—”๋“œ์˜ ๊ฒฝ์šฐ) ๋ฐ ๋ฐฑ์—”๋“œ ํŒŒ์ผ์—์„œ ํ…Œ์ŠคํŠธ ๊ด€๋ จ ๋ช…๋ น์–ด๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค (์˜ˆ: npm run test, pytest ๋“ฑ). ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํšŒ๊ท€๋ฅผ ์•ผ๊ธฐํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  8. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ์ œ์ถœ: ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ํ…Œ์ŠคํŠธ(ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ)๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ์—ฌํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด GitHub์—์„œ Open WebUI ์ €์žฅ์†Œ์˜ dev ๋ธŒ๋žœ์น˜์— ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋ฅผ ์ œ์ถœํ•˜์‹ญ์‹œ์˜ค.

    • GitHub์—์„œ Open WebUI ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.
    • ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.
    • "Contribute" ๋˜๋Š” "Pull Request" ๋ฒ„ํŠผ ํด๋ฆญ (์ผ๋ฐ˜์ ์œผ๋กœ ๋…น์ƒ‰).
    • PR ์–‘์‹ ์ž‘์„ฑ:
      • ์ œ๋ชฉ: ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์š”์•ฝํ•œ ๋ช…ํ™•ํ•˜๊ณ  ์„ค๋ช…์ ์ธ ์ œ๋ชฉ์„ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค (์˜ˆ: "Fix: ๋กœ๊ทธ์ธ ํผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ").
      • ์„ค๋ช…: ๋ณ€๊ฒฝ ์‚ฌํ•ญ, ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ(์žˆ์„ ๊ฒฝ์šฐ), ๊ด€๋ จ๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ณด๋‹ค ์ž์„ธํžˆ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๊ด€๋ จ๋œ ์ด์Šˆ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
    • PR ์ œ์ถœ.

    ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž๊ฐ€ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋ฉฐ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์— ์‘๋‹ต์„ ์ž˜ ํ•˜๊ณ  ์š”์ฒญ์ด ์žˆ์„ ๊ฒฝ์šฐ ์ˆ˜์ •ํ•  ์ค€๋น„๋ฅผ ํ•˜์‹ญ์‹œ์˜ค.

์ด ํฌ๊ด„์ ์ธ ๊ฐ€์ด๋“œ๋ฅผ ์ฝ์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! Open WebUI์— ๊ธฐ์—ฌํ•˜์‹œ๋ ค๋Š” ๊ด€์‹ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฌ๋ฉฐ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. Open WebUI ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ผ์›์ด ๋˜๋Š” ๋ฐ ๋„์›€ ๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! ๐ŸŽ‰ ํ–‰๋ณตํ•œ ์ฝ”๋”ฉ ๋˜์„ธ์š”!