Skip to content

Latest commit

ย 

History

History
71 lines (51 loc) ยท 6.85 KB

File metadata and controls

71 lines (51 loc) ยท 6.85 KB

Architecture

WhyLog์˜ AI, Server, Web ๊ฐ„ ์—ฐ๊ฒฐ ๊ตฌ์กฐ์™€ ์„œ๋น„์Šค ํ๋ฆ„์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ๊ตฌ์„ฑ

Web (React, axios + WebSocket)
   โ”‚ REST (JWT Bearer)         โ”‚ WebSocket (์‹ค์‹œ๊ฐ„ ํšŒ์˜ signaling)
   โ–ผ                            โ–ผ
Server (Spring Boot)  โ”€โ”€RESTโ”€โ”€โ–ถ  ai (FastAPI)
   โ”‚        โ”‚                        โ”‚
   โ”‚        โ”‚                        โ”œโ”€ Gemini (ํ…์ŠคํŠธ ์ƒ์„ฑยท์ž„๋ฒ ๋”ฉ)
   โ”‚        โ”‚                        โ”œโ”€ Deepgram (์Œ์„ฑ ์ „์‚ฌ)
   โ”‚        โ”‚                        โ””โ”€ ChromaDB (์ปค๋ฐ‹ยท์ ์šฉ์‚ฌํ•ญ ์ž„๋ฒ ๋”ฉ)
   โ”‚        โ””โ”€โ”€RESTโ”€โ”€โ–ถ LiveKit (์‹ค์‹œ๊ฐ„ ์˜ค๋””์˜ค/๋น„๋””์˜ค SFU + ๋…น์Œ egress)
   โ””โ”€โ”€RESTโ”€โ”€โ–ถ GitHub (์ปค๋ฐ‹ ์ด๋ ฅ ์กฐํšŒ, kohsuke GitHub API)
   โ””โ”€โ”€S3

Web๊ณผ LiveKit์€ ์˜ˆ์™ธ์ ์œผ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ๋‹ค(RTC). ๊ทธ ์™ธ ๋ชจ๋“  ํ†ต์‹ ์€ Server๋ฅผ ๊ฑฐ์นœ๋‹ค โ€” aiยทGitHubยทS3ยทLiveKit ํ† ํฐ ๋ฐœ๊ธ‰์€ Web์ด ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํŒŒํŠธ๋ณ„ ์—ญํ• 

ํŒŒํŠธ ์ฑ…์ž„ ์ฑ…์ž„์ด ์•„๋‹Œ ๊ฒƒ
Web ํ™”๋ฉด, ๋ธŒ๋ผ์šฐ์ € Web Speech API๋กœ ์‹ค์‹œ๊ฐ„ ์ž๋ง‰ ์ƒ์„ฑ, LiveKit RTC ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ, Server REST/WebSocket ํ˜ธ์ถœ ์›๋ฌธ ํšŒ์˜ ๋ถ„์„, ์ปค๋ฐ‹ ๋งค์นญ ์ ์ˆ˜ ๊ณ„์‚ฐ, ํŒŒ์ผ ์ €์žฅ โ€” ์ „๋ถ€ Serverยทai๊ฐ€ ํ•œ๋‹ค
Server ๋„๋ฉ”์ธ ์ƒํƒœ(Team/Meeting/Decision/Application/Commit)์˜ ์ •๋ณธ ์ €์žฅ, ์™ธ๋ถ€ ์‹œ์Šคํ…œ(aiยทLiveKitยทGitHubยทS3) ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜, ์ธ์ฆ ์ „์‚ฌยท์š”์•ฝยท์ž„๋ฒ ๋”ฉยท๋งค์นญ ์ ์ˆ˜ ๊ณ„์‚ฐ ์ž์ฒด๋Š” ํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ์ „๋ถ€ ai์— ์œ„์ž„ํ•˜๊ณ  ๊ฒฐ๊ณผ๋งŒ ์ €์žฅ
ai ์Œ์„ฑ ์ „์‚ฌ(Deepgram), ํšŒ์˜ ๋ถ„์„ยท์ ์šฉ์‚ฌํ•ญ ์ถ”์ถœ(Gemini), ์ปค๋ฐ‹ ์š”์•ฝยท์ž„๋ฒ ๋”ฉ(Gemini), ์ž„๋ฒ ๋”ฉ ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜ ๋งค์นญ ์ ์ˆ˜ ๊ณ„์‚ฐ(ChromaDB) ๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ์˜ ์ •๋ณธ์„ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค โ€” ๋งค ์š”์ฒญ๋งˆ๋‹ค ํ•„์š”ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ Server๊ฐ€ ์‹ค์–ด ๋ณด๋‚ธ๋‹ค. ์ธ์ฆ/์ธ๊ฐ€๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค

์ธ์ฆ

  • Server๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ JWT access/refresh ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค.
  • Web์€ access ํ† ํฐ์„ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ๋ณด๊ด€ํ•˜๊ณ , ๋งค ์š”์ฒญ์— Authorization: Bearer๋กœ ์ฃผ์ž…ํ•œ๋‹ค. 401์„ ๋ฐ›์œผ๋ฉด refresh๋กœ ์žฌ๋ฐœ๊ธ‰์„ ์‹œ๋„ํ•œ๋‹ค.
  • ai๋Š” ๋ณ„๋„ ์ธ์ฆ์ด ์—†๋‹ค โ€” Server๋งŒ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ์ „์ œ๋กœ ์‹ ๋ขฐ ๊ฒฝ๊ณ„ ์•ˆ์— ๋‘”๋‹ค.

์„œ๋น„์Šค ํ๋ฆ„ 1 โ€” ์‹ค์‹œ๊ฐ„ ํšŒ์˜ (Web โ†” LiveKit, Web โ†” Server)

ํšŒ์˜ ์ค‘ ์˜ค๋””์˜ค/๋น„๋””์˜ค์™€ "์‹ค์‹œ๊ฐ„ ํ…์ŠคํŠธ"๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฒฝ๋กœ๋กœ ํ๋ฅธ๋‹ค.

  • ์˜ค๋””์˜ค/๋น„๋””์˜ค: Web์€ Server๊ฐ€ ๋ฐœ๊ธ‰ํ•œ ํ† ํฐ์œผ๋กœ LiveKit์— ์ง์ ‘ ์—ฐ๊ฒฐํ•ด RTC๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค. LiveKit์ด room ์ „์ฒด ์˜ค๋””์˜ค๋ฅผ ๋…น์Œ(egress)ํ•ด S3์— ์ €์žฅํ•˜๊ณ , ์ด ์›๋ณธ ์˜ค๋””์˜ค๊ฐ€ ํšŒ์˜ ์ข…๋ฃŒ ํ›„ "ํ๋ฆ„ 2"์˜ ๊ณต์‹ ์ „์‚ฌ ์ž…๋ ฅ์ด ๋œ๋‹ค.
  • ์‹ค์‹œ๊ฐ„ ํ…์ŠคํŠธ: Web์ด ๋ธŒ๋ผ์šฐ์ € Web Speech API๋กœ ๋ฐœํ™”๋ฅผ ์ฆ‰์„์—์„œ ์ „์‚ฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Server๊ฐ€ ์—ฌ๋Š” ๋ณ„๋„์˜ WebSocket์œผ๋กœ ๋ณด๋‚ธ๋‹ค. Server๋Š” ์ด๋ฅผ ์ฐธ๊ฐ€์ž์—๊ฒŒ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” ๋™์‹œ์— ํšŒ์˜๋ณ„๋กœ ๋ฒ„ํผ๋งํ•ด๋‘”๋‹ค โ€” ํ™”๋ฉด ์ž๋ง‰์šฉ์ด์ž, ํšŒ์˜ ์ข…๋ฃŒ ํ›„ ๊ณต์‹ ๋ถ„์„์— ์ฐธ๊ณ  ์ปจํ…์ŠคํŠธ๋กœ ํ•จ๊ป˜ ์ „๋‹ฌ๋œ๋‹ค.
  • ํšŒ์˜ ์ข…๋ฃŒ(์ฐธ์—ฌ์ž๊ฐ€ ์ง์ ‘ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜, ์‹ค์‹œ๊ฐ„ ์ฐธ์—ฌ์ž๊ฐ€ ์ „๋ถ€ ๋น ์ ธ์„œ ์ž๋™ ์ข…๋ฃŒ)๋Š” ํ•ญ์ƒ ๊ฐ™์€ ์ฒ˜๋ฆฌ๋กœ ์ˆ˜๋ ดํ•œ๋‹ค: ๋…น์Œ ์ค‘์ง€ โ†’ ๋ฐฉ ์ •๋ฆฌ โ†’ "ํ๋ฆ„ 2" ๋น„๋™๊ธฐ ์‹œ์ž‘.

์„œ๋น„์Šค ํ๋ฆ„ 2 โ€” ํšŒ์˜ ์ข…๋ฃŒ ํ›„ AI ๋ถ„์„ (Server โ†” ai)

  1. Server๊ฐ€ ๋…น์Œ๋œ ์˜ค๋””์˜ค์™€ ์‹ค์‹œ๊ฐ„ ํ…์ŠคํŠธ ๋ฒ„ํผ๋ฅผ ai์— ๋„˜๊ฒจ ์ „์‚ฌ+๋ถ„์„ ์‹คํ–‰(run)์„ ๋น„๋™๊ธฐ๋กœ ์‹œ์ž‘์‹œํ‚จ๋‹ค.
  2. ai๊ฐ€ Deepgram์œผ๋กœ ์˜ค๋””์˜ค๋ฅผ ์ „์‚ฌํ•˜๊ณ , Gemini๋กœ ๋…ผ์˜ ์ฃผ์ œยท๊ฒฐ์ • ๊ทผ๊ฑฐยท์ ์šฉ์‚ฌํ•ญยทํƒ€์ž„๋ผ์ธ์„ ์ถ”์ถœํ•œ๋‹ค. ์ง„ํ–‰ ๋‹จ๊ณ„๋Š” ์ „์‚ฌ์ค‘ โ†’ ์ „์‚ฌ์™„๋ฃŒ โ†’ ์š”์•ฝ์™„๋ฃŒ โ†’ ์ ์šฉ์‚ฌํ•ญ์ถ”์ถœ์™„๋ฃŒ๋กœ ๋‚˜๋‰˜๋ฉฐ, Server๋Š” ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ƒํƒœ๋ฅผ ์กฐํšŒ(ํด๋ง)ํ•œ๋‹ค.
  3. Server๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ๋กœ ์ €์žฅํ•œ๋‹ค: ๋ฐœํ™” ๋ชฉ๋ก, ํšŒ์˜ ์š”์•ฝ, ๊ฒฐ์ •(Decision, ํšŒ์˜๋‹น 1๊ฐœ), ์ ์šฉ์‚ฌํ•ญ๊ณผ ๊ทธ ๊ทผ๊ฑฐยทํƒ€์ž„๋ผ์ธ. ์ ์šฉ์‚ฌํ•ญ ๊ณ„์—ด์€ ๋งค๋ฒˆ ์ „๋ถ€ ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑํ•œ๋‹ค โ€” ์žฌ๋ถ„์„์€ append๊ฐ€ ์•„๋‹ˆ๋ผ ์Šค๋ƒ…์ƒท ๊ต์ฒด๋‹ค.
  4. ์ €์žฅ์ด ๋๋‚˜๋ฉด Server๊ฐ€ ๊ทธ ์ ์šฉ์‚ฌํ•ญ๋“ค์„ ๋‹ค์‹œ ai์— ๋ณด๋‚ด ์ž„๋ฒ ๋”ฉ์„ ๋งŒ๋“ค๊ฒŒ ํ•˜๊ณ (ChromaDB ์ €์žฅ), ์ด์–ด์„œ ์ปค๋ฐ‹ ์ž๋™ ๋งค์นญ์„ ์š”์ฒญํ•œ๋‹ค. ์ด ๋‘ ๋‹จ๊ณ„๋Š” ์‹คํŒจํ•ด๋„ ์ „์ฒด ํ๋ฆ„์„ ๋˜๋Œ๋ฆฌ์ง€ ์•Š๋Š” best-effort๋‹ค โ€” ๋ถ„์„ ๊ฒฐ๊ณผ ์ €์žฅ ์ž์ฒด๋Š” ์ด๋ฏธ ๋๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  5. ๋งค์นญ ์ ์ˆ˜ ๊ณ„์‚ฐ ๋กœ์ง์€ ai์— ์žˆ๊ณ (docs/domain.md ์ฐธ์กฐ), Server๋Š” ๊ฒฐ๊ณผ๋ฅผ ์‹ ๋ขฐ๋„ ์ž„๊ณ„๊ฐ’์œผ๋กœ ํ•œ ๋ฒˆ ๋” ๊ฑธ๋Ÿฌ ์ €์žฅํ•  ๋ฟ ์ ์ˆ˜ ์ž์ฒด๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

์„œ๋น„์Šค ํ๋ฆ„ 3 โ€” GitHub ์ปค๋ฐ‹ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ (Server โ†” GitHub โ†” ai)

GitHub๋Š” webhook์ด ์•„๋‹ˆ๋ผ Server๊ฐ€ ์‚ฌ์šฉ์ž ์š”์ฒญ ์‹œ ๋Œ์–ด์˜ค๋Š”(pull) ๋ฐฉ์‹์ด๋‹ค.

  1. ์‚ฌ์šฉ์ž๊ฐ€ GitHub ํ† ํฐ์„ ๋“ฑ๋กํ•˜๋ฉด Server๊ฐ€ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•ด ์•”ํ˜ธํ™” ์ €์žฅํ•œ๋‹ค. ํ† ํฐ์ด 401์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด(๋งŒ๋ฃŒ) Server๊ฐ€ ์ฆ‰์‹œ ํ๊ธฐํ•œ๋‹ค.
  2. ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋™๊ธฐํ™” ์‹œ Server๊ฐ€ GitHub REST API๋กœ ๋งˆ์ง€๋ง‰ ๋™๊ธฐํ™” ์ดํ›„์˜ ์ปค๋ฐ‹๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋ฏธ ์ €์žฅ๋œ ํ•ด์‹œ๋Š” ๊ฑด๋„ˆ๋›ฐ๊ณ , ๋จธ์ง€ ์ปค๋ฐ‹(๋ถ€๋ชจ 2๊ฐœ ์ด์ƒ)์€ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. ์ƒˆ๋กœ ์ €์žฅ๋œ ์ปค๋ฐ‹(๊ณผ ์ด์ „์— ์ž„๋ฒ ๋”ฉ์ด ์•ˆ ๋๋‚œ ์ปค๋ฐ‹)๋งˆ๋‹ค Server๊ฐ€ ๋ณ€๊ฒฝ ํŒŒ์ผ ๋ชฉ๋ก๊ณผ ํ•จ๊ป˜ ai์— ๋ถ„์„์„ ์š”์ฒญํ•œ๋‹ค. ai๊ฐ€ Gemini๋กœ ์š”์•ฝยท์ž„๋ฒ ๋”ฉ์„ ๋งŒ๋“ค์–ด ChromaDB์— ์ €์žฅํ•œ๋‹ค.
  4. ์ด ํŒŒ์ดํ”„๋ผ์ธ์ด ๋๋‚˜์•ผ(์ž„๋ฒ ๋”ฉ ์™„๋ฃŒ) "ํ๋ฆ„ 2"์˜ ์ปค๋ฐ‹ ์ž๋™ ๋งค์นญ์ด ๊ทธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์ปค๋ฐ‹์„ ํ›„๋ณด๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค โ€” ๋ ˆํฌ ๋™๊ธฐํ™”๊ฐ€ ํšŒ์˜ ๋ถ„์„๋ณด๋‹ค ๋จผ์ € ๋˜์–ด ์žˆ์–ด์•ผ ๋งค์นญ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.

์„œ๋น„์Šค ํ๋ฆ„ 4 โ€” ์‚ฌ์šฉ์ž์˜ ์ˆ˜๋™ ์ปค๋ฐ‹ ์—ฐ๊ฒฐ (Web โ†” Server)

AI ์ถ”์ฒœ ๋งค์นญ๊ณผ ๋ณ„๊ฐœ๋กœ, Web์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ ์šฉ์‚ฌํ•ญ์— ์ปค๋ฐ‹์„ ์ง์ ‘ ํ™•์ • ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํ™•์ • ์—ฐ๊ฒฐ์€ ์žฌ๋ถ„์„์œผ๋กœ๋„ ์ง€์›Œ์ง€์ง€ ์•Š์œผ๋ฉฐ, ์ดํ›„ ์ถ”์ฒœ ๋งค์นญ ๊ณ„์‚ฐ ์‹œ ๊ทธ ์ปค๋ฐ‹์„ ํ›„๋ณด์—์„œ ์ œ์™ธํ•œ๋‹ค. ๋‘ ๊ด€๊ณ„์˜ ์ฐจ์ด๋Š” docs/domain.md์˜ "์ถ”์ฒœ ๋งค์นญ vs ํ™•์ • ์—ฐ๊ฒฐ" ์ฐธ์กฐ.

๊ฒฝ๊ณ„์™€ ์†Œ์œ ๊ถŒ

  • ai๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์€ Server ์•ˆ์˜ ํ•œ ๊ฒฝ๊ณ„ ๋ฟ์ด๋‹ค. ๋„๋ฉ”์ธ ์„œ๋น„์Šค๊ฐ€ ai SDK๋‚˜ HTTP ํ˜ธ์ถœ์„ ์ง์ ‘ ๋“ค๊ณ  ์žˆ์ง€ ์•Š๊ณ , ์ „์šฉ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์“ด๋‹ค. LiveKitยทS3ยทGitHub ์—ฐ๋™๋„ ๊ฐ™์€ ์›์น™์œผ๋กœ ๋ณ„๋„ ๊ฒฝ๊ณ„์— ๋ชจ์—ฌ ์žˆ๋‹ค.
  • ai๋Š” ๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ์˜ ์ •๋ณธ์„ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค. ChromaDB ์ž„๋ฒ ๋”ฉ์€ ๋งค์นญ ๊ณ„์‚ฐ์šฉ ํŒŒ์ƒ ๋ฐ์ดํ„ฐ์ผ ๋ฟ, ๊ฒฐ์ •ยท์ ์šฉ์‚ฌํ•ญยท์ปค๋ฐ‹ ์—ฐ๊ฒฐ์˜ ์ •๋ณธ์€ ํ•ญ์ƒ Server DB๋‹ค.
  • ai ์ชฝ์—์„œ ํ”„๋กฌํ”„ํŠธยท๋งค์นญ ๊ฐ€์ค‘์น˜ยทChromaDB ์Šคํ‚ค๋งˆ๋ฅผ ๋ฐ”๊พธ๋ฉด Server๊ฐ€ ํŒŒ์‹ฑํ•˜๋Š” ์‘๋‹ต ํ˜•ํƒœ๋„ ํ•จ๊ป˜ ๊นจ์งˆ ์ˆ˜ ์žˆ์–ด ๋‹ด๋‹น์ž ํ™•์ธ์ด ํ•„์š”ํ•˜๋‹ค.
  • ์™ธ๋ถ€ ํ˜ธ์ถœ(S3, ai, LiveKit, GitHub)์€ Server์˜ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ปค๋ฐ‹ ์ดํ›„ ์‹คํ–‰์ด ํ•„์š”ํ•˜๋ฉด afterCommit ์‹œ์ ์œผ๋กœ ๋ฏธ๋ฃฌ๋‹ค.