์ฑ„๋„ํ†ก ์•„์ด์ฝ˜

์šด์˜ ๊ฐ€๋Šฅํ•œ AI ์ฑ—๋ด‡ MVP ๊ตฌํ˜„: ์นด์นด์˜ค 1:1 ยท Firebase ยท Firestore ยท appId ๋ฉ€ํ‹ฐ์•ฑ

์ฑ—๋ด‡์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€๋งŒ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด ๋ฐฐํฌ๊นŒ์ง€ ๋ชป ๊ฐ€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ•์˜์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ•์˜๋Š” ๊ธฐ๋Šฅ ํ™•์žฅ๋ณด๋‹ค ์šด์˜ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ๊ตฌ์กฐ(MVP)์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. ์นด์นด์˜ค 1:1 Webhook ๋‹จ์ผ ํ•จ์ˆ˜, Firestore appId ๋ถ„๋ฆฌ ๊ตฌ์กฐ, app_auth_keys/app_allowed_users ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•ด ์‹ค์ œ ์„œ๋น„์Šค์— ๋ฐ”๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๊ฐ•์ƒ์€ ์ˆ˜๊ฐ• ๊ธฐ๊ฐ„ ์ค‘ private repository ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค(๊ฐœ๋ณ„ ์•ˆ๋‚ด). ๊ณต๊ฐœ ์‹ค์Šต ํ…œํ”Œ๋ฆฟ: https://github.com/tac0de/vibe-coding-coach-template ๋ฐ๋ชจ ์•ฑ: https://github.com/tac0de/kakao-ai-demo-app

4๋ช… ์ด ์ˆ˜๊ฐ•ํ•˜๊ณ  ์žˆ์–ด์š”.

๋‚œ์ด๋„ ์ค‘๊ธ‰์ด์ƒ

์ˆ˜๊ฐ•๊ธฐํ•œ 6๊ฐœ์›”

์‹ค์Šต ์ค‘์‹ฌ
์‹ค์Šต ์ค‘์‹ฌ
AI ์ฝ”๋”ฉ
AI ์ฝ”๋”ฉ
AI ํ™œ์šฉ๋ฒ•
AI ํ™œ์šฉ๋ฒ•
์ฒ˜์Œํ•˜๋Š”๋ฐฐํฌ
์ฒ˜์Œํ•˜๋Š”๋ฐฐํฌ
ํ† ์ดํ”„๋กœ์ ํŠธ
ํ† ์ดํ”„๋กœ์ ํŠธ
์‹ค์Šต ์ค‘์‹ฌ
์‹ค์Šต ์ค‘์‹ฌ
AI ์ฝ”๋”ฉ
AI ์ฝ”๋”ฉ
AI ํ™œ์šฉ๋ฒ•
AI ํ™œ์šฉ๋ฒ•
์ฒ˜์Œํ•˜๋Š”๋ฐฐํฌ
์ฒ˜์Œํ•˜๋Š”๋ฐฐํฌ
ํ† ์ดํ”„๋กœ์ ํŠธ
ํ† ์ดํ”„๋กœ์ ํŠธ

์ˆ˜๊ฐ• ํ›„ ์ด๋Ÿฐ๊ฑธ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”

  • ์นด์นด์˜ค 1:1 AI ์ฑ—๋ด‡์„ ์šด์˜ ๊ฐ€๋Šฅํ•œ MVP๋กœ ์ง์ ‘ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. apps/app_settings/user_sessions๋ฅผ appId ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌํ•ด ๋‹จ์ผ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฉ€ํ‹ฐ์•ฑ ๊ตฌ์กฐ๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๊ฐ• ๊ธฐ๊ฐ„ ์ค‘ private repo ์ ‘๊ทผ์œผ๋กœ ์‹ค์Šต ์ฝ”๋“œ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๊ณต๊ฐœ ์‹ค์Šต ํ…œํ”Œ๋ฆฟ(https://github.com/tac0de/vibe-coding-coach-template)๊ณผ ๋ฐ๋ชจ ์•ฑ(https://github.com/tac0de/kakao-ai-demo-app)์„ ํ†ตํ•ด ์šด์˜ํ˜• ์ ‘๊ทผ ์ œ์–ด์™€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ๋ฆ„์„ ๋ฐ”๋กœ ์ฒดํ—˜ํ•˜๊ณ  ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ ๋ฐฐํฌํ•˜๊ณ , ๋ฐ”๋กœ ํ†ต์ œ ๊ฐ€๋Šฅํ•œ

์นด์นด์˜ค 1:1 AI ์ฑ—๋ด‡ ์šด์˜ํ˜• MVP

์ฒ˜์Œ ์ฑ—๋ด‡์„ ๋งŒ๋“ค ๋•Œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹™๋‹ˆ๋‹ค.

"๋ˆ„๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š”๊ฐ€"์™€ "์–ด๋–ป๊ฒŒ ์šด์˜ํ•  ๊ฒƒ์ธ๊ฐ€"๊ฐ€ ๋น ์ง„ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.


์ด ๊ฐ•์˜๋Š” ๋ณต์žกํ•œ ์ž๋™ํ™”๋ณด๋‹ค ๋จผ์ €, ์šด์˜ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ๊ตฌ์กฐ๋ฅผ ์™„์„ฑํ•˜๋„๋ก ๋ฆฌ๋“œํ•ฉ๋‹ˆ๋‹ค.

Firebase Functions + Firestore + ์นด์นด์˜ค 1:1 webhook ์กฐํ•ฉ์œผ๋กœ,

์‹ค์ œ ์„œ๋น„์Šค์—์„œ ํ•„์š”ํ•œ ์ธ์ฆ/๊ถŒํ•œ/์„ธ์…˜/์šด์˜์ž ์ œ์–ด๊นŒ์ง€ ํ•œ ๋ฒˆ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.


์ฝ”๋“œ ํ•œ ์ค„ ํ•œ ์ค„๋ณด๋‹ค ์ค‘์š”ํ•œ ํ๋ฆ„์„ ๋จผ์ € ์žก์Šต๋‹ˆ๋‹ค.

์š”์ฒญ ์ˆ˜์‹  -> ์•ฑ ์‹๋ณ„(appId) -> ์ธ์ฆ/๊ถŒํ•œ ๊ฒ€์‚ฌ -> AI ํ˜ธ์ถœ -> ์‘๋‹ต ๋ถ„๊ธฐ

์ด ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๋ฉด ์•ฑ์ด ๋Š˜์–ด๋‚˜๋„ ์šด์˜์ด ๋ฌด๋„ˆ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ด ๊ฐ•์˜์—์„œ ์–ป์–ด๊ฐ€๋Š” ๊ฒƒ

๋ฌธ์„œํ˜• ํŠœํ† ๋ฆฌ์–ผ๋กœ ์™„์„ฑํ•˜๋Š” ์šด์˜ํ˜• ์ฑ—๋ด‡ ๊ตฌ์กฐ

์ˆ˜๊ฐ• ํ›„ ๋ฐ”๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ

1) ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ(kakaobot) ๊ธฐ๋ฐ˜ ์นด์นด์˜ค 1:1 AI ์ฑ—๋ด‡ MVP ๋ฐฐํฌ

2) appId ๊ธฐ์ค€ ๋ฉ€ํ‹ฐ์•ฑ ์ „ํ™˜ ๋ฐ user_sessions ์—ฐ๋™

3) app_auth_keys + app_allowed_users ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด ์šด์˜

4) ๋ฏธํ—ˆ์šฉ/๋งŒ๋ฃŒ/์ค‘์ง€ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์•ˆ์ „ํ•œ ์‘๋‹ต ๋ถ„๊ธฐ

5) ADMIN_USER_IDS ๊ธฐ๋ฐ˜ ์šด์˜์ž ๋ช…๋ น ์‹คํ–‰ ์ฒด๊ณ„ ๊ตฌ์ถ•

6) app_settings๋กœ ํ‹ฐ์–ด/ํ”„๋กฌํ”„ํŠธ/๋Ÿฐํƒ€์ž„ ์ •์ฑ… ๋ถ„๋ฆฌ ์šด์˜

7) ์žฅ์•  ์‹œ ์›์ธ ํŒŒ์•…๊ณผ ๋ณต๊ตฌ๊ฐ€ ์‰ฌ์šด ๋‹จ์ˆœ ์•„ํ‚คํ…์ฒ˜ ํ™•๋ณด

์Šคํƒ€ํŠธ์—…์—์„œ ๋ฐฐ์šด '์ƒํƒœ๊ณ„' ์„ค๊ณ„ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ, ๊ธฐ์ˆ ๋ณด๋‹ค ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ์žก์•„๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ํ™•์žฅ ์—†์ด๋„ ์ฆ‰์‹œ ํŒ๋งค ๊ฐ€๋Šฅํ•œ MVP๋ฅผ ์™„์„ฑํ•˜๋Š” ๋น„๊ฒฐ์„ ์ตํžˆ์„ธ์š”.

๋‹จ์ˆœํ•œ '๋ฐ๋ชจ'๊ฐ€ ์•„๋‹Œ, ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ AI ์ฑ—๋ด‡ MVP๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. Firestore ๊ถŒํ•œ ์ œ์–ด๋ฅผ ํ†ตํ•ด ์ˆ˜๊ฐ•์ƒ/๊ฒฐ์ œ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•˜๊ณ , ํ—ˆ์šฉ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ AI ์‘๋‹ต์„ ์ œ๊ณตํ•˜๋Š” ์•ˆ์ •์ ์ธ ์šด์˜ ํ๋ฆ„์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ๊ตฌํ˜„์—๋งŒ ๋งค๋ชฐ๋˜์–ด ๋ฐฐํฌ๋ฅผ ๋ชป ํ•ด๋ณธ ๊ฒฝํ—˜, ํ˜น์€ ์ ‘๊ทผ ์ œ์–ด ๋ถ€์žฌ๋กœ ์šด์˜์ด ๋ฌด๋„ˆ์ง„ ๊ฒฝํ—˜์ด ์žˆ๋‹ค๋ฉด, ์ด์ œ ์‹ค๋ฌด ์šด์˜์ด ๊ฐ€๋Šฅํ•œ ์ฑ—๋ด‡์„ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ˆ์šฉ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ, ์ด์šฉ ์ƒํƒœ ์ œ์–ด ๋“ฑ
์‹ค์ œ ์„œ๋น„์Šค ์šด์˜์— ํ•„์š”ํ•œ ํ•ต์‹ฌ ๋กœ์ง์„ ์Šค์Šค๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์šด์˜ ์ ๊ฒ€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

- ์ธ์ฆ/๊ถŒํ•œ ๊ฒ€์‚ฌ๊ฐ€ AI ํ˜ธ์ถœ๋ณด๋‹ค ์•ž์— ์žˆ๋Š”๊ฐ€?

- appId๋ณ„ ์„ค์ •/ํ‚ค/๊ถŒํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š”๊ฐ€?

- ๋ฏธํ—ˆ์šฉ ์‚ฌ์šฉ์ž๋Š” ์ฆ‰์‹œ ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋กœ ์ข…๋ฃŒ๋˜๋Š”๊ฐ€?

- ์šด์˜์ž ๋ช…๋ น์€ ADMIN_USER_IDS๋กœ ์ œํ•œ๋˜๋Š”๊ฐ€?

- ์Šน์ธ/์ค‘์ง€/๋งŒ๋ฃŒ ์ •์ฑ… ๋ณ€๊ฒฝ์ด Firestore ๋ฐ์ดํ„ฐ๋งŒ์œผ๋กœ ๋ฐ˜์˜๋˜๋Š”๊ฐ€?

- ์žฅ์•  ์‹œ ๋‹จ์ผ ํ•จ์ˆ˜ ๋กœ๊ทธ๋กœ ๋น ๋ฅด๊ฒŒ ์›์ธ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€?

์ง„์งœ ์šด์˜ ๊ฐ€๋Šฅํ•œ AI ์ฑ—๋ด‡ MVP๋ฅผ ์Šค์Šค๋กœ ์„ค๊ณ„ํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
AI ์‹œ๋Œ€์— ํ•„์š”ํ•œ ๊ฒƒ์€
๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜๊ณ  ์ฑ…์ž„์ง€๋Š” ์„ค๊ณ„ ๋Šฅ๋ ฅ์ž…๋‹ˆ๋‹ค.

LaaS ์šด์˜ ๊ธฐ์ค€์„ ์ดํ•ดํ•˜๋ฉด, ๋‹จ์ˆœํžˆ ์ฑ—๋ด‡์„ '๋งŒ๋“œ๋Š”' ๋‹จ๊ณ„์—์„œ ๋ฒ—์–ด๋‚˜ ์ฑ—๋ด‡ ์„œ๋น„์Šค๋ฅผ '๊ด€๋ฆฌํ•˜๊ณ  ์„ฑ์žฅ์‹œํ‚ค๋Š”' ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ•์˜๋Š” ์‹ค๋ฌด์—์„œ ๋ฐ”๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์šด์˜ ๊ตฌ์กฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ๋ชจ ์™„์„ฑ์ด ์•„๋‹ˆ๋ผ ์šด์˜ ์•ˆ์ •์„ฑ์„ ๋ชฉํ‘œ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

์Šคํƒ€ํŠธ์—…์—์„œ ๊ธฐ์ˆ ์€ ์ƒํƒœ๊ณ„๋กœ ์ž‘๋™ํ•จ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.


๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ์ž˜ ์งœ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋ฏธ๋ž˜๋ฅผ ๋‚ด๋‹ค๋ณด๋Š” ๊ตฌ์กฐ ์„ ํƒ์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ๊ฒฝํ—˜๊ณผ ํ•จ๊ป˜ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ยท์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์„ ์ง์ ‘ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. 100๋งŒ ๊ฐœ ์ด์ƒ์˜ ํŒจ์…˜ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ํฌ๋กค๋งํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋‹ด๋‹นํ–ˆ์ฃ .

์ด ๊ณผ์ •์—์„œ ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ์ฑ…์ž„์ง€๋Š” ์„ค๊ณ„ ๋Šฅ๋ ฅ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ํ™•์‹ ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์™„์ „ํ•œ ๋น„์ „๊ณต์ž๋กœ์„œ ์ˆ˜๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์—ˆ๊ธฐ์—, ์—ฌ๋Ÿฌ๋ถ„์˜ ์–ด๋ ค์›€์„ ๋ˆ„๊ตฌ๋ณด๋‹ค ์ž˜ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.


AI ์‹œ๋Œ€, ์—ฌ๋Ÿฌ๋ถ„๋„ ์ƒํƒœ๊ณ„์˜ ์ผ์›์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ, ๋‹จ์ˆœํ•˜๊ฒŒ, ํ•ต์‹ฌ๋งŒ ๋‹ด์•„ ์—ฌ๋Ÿฌ๋ถ„์˜ AI ์ฑ—๋ด‡์„ ์™„์„ฑํ•˜์„ธ์š”.

๊ฐ•์˜ ๊ฐœ์š”

KAKAO-AI ํ”„๋กœ์ ํŠธ๋กœ ์™„์„ฑํ•˜๋Š” ์šด์˜ํ˜• ์ฑ—๋ด‡ ํŠœํ† ๋ฆฌ์–ผ

Section 1

์šด์˜ํ˜• MVP ์„ค๊ณ„ ์›์น™๊ณผ ์ „์ฒด ๋กœ๋“œ๋งต


์™œ ๋งŽ์€ ์ฑ—๋ด‡์ด ๋ฐฐํฌ ์ „์— ๋ฉˆ์ถ”๋Š”์ง€๋ถ€ํ„ฐ ์งš์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ๊ณผ๋‹ค๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์šด์˜ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„น์…˜์—์„œ ์ „์ฒด ๊ตฌํ˜„ ์ˆœ์„œ์™€ ์„ฑ๊ณต ๊ธฐ์ค€(์šด์˜ ๊ฐ€๋Šฅ์„ฑ)์„ ๋จผ์ € ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜ 1์—์„œ๋Š” ๋ชฉํ‘œ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค. "์™„์„ฑ"์˜ ๊ธฐ์ค€์„ ๊ธฐ๋Šฅ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์šด์˜ ๊ฐ€๋Šฅ ์ƒํƒœ๋กœ ๋ฐ”๊พธ๊ณ , ์ดํ›„ ์‹ค์Šต์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ํ™•์ •ํ•ฉ๋‹ˆ๋‹ค.

Section 2

์š”์ฒญ-๊ฒ€์ฆ-์‘๋‹ต ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ๋ฉ€ํ‹ฐ์•ฑ ๊ตฌ์กฐ


์นด์นด์˜ค 1:1 ์š”์ฒญ์ด ๋“ค์–ด์˜จ ๋’ค ์–ด๋–ค ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ์•ˆ์ „ํ•œ์ง€,

๋‹จ์ผ ํ•จ์ˆ˜์—์„œ appId ๊ธฐ๋ฐ˜์œผ๋กœ ์•ฑ์„ ๋ถ„๋ฆฌ ์šด์˜ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

user_sessions, app_settings, app_allowed_users๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ํ•œ ๋ฒˆ์— ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜ 2์—์„œ๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ทธ๋ฆผ์ด ์•„๋‹ˆ๋ผ ์‹คํ–‰ ํ๋ฆ„์œผ๋กœ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ/๊ถŒํ•œ ์„ ๊ฒ€์ฆ, ์•ฑ ์ „ํ™˜, ์˜ˆ์™ธ ์‘๋‹ต ๋ถ„๊ธฐ๊นŒ์ง€ ์šด์˜ ๊ด€์ ์œผ๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Section 3

Firebase Functions + Firestore ์‹ค์ „ ๊ตฌํ˜„


์‹ค์ œ kakao-ai ์ฝ”๋“œ๋ฒ ์ด์Šค ๊ธฐ์ค€์œผ๋กœ ๋‹จ์ผ webhook ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์ปฌ๋ ‰์…˜(apps, app_settings, app_auth_keys, app_allowed_users, user_sessions)์„ ์ƒ์„ฑํ•˜๊ณ ,

์‚ฌ์šฉ์ž ๋ช…๋ น(/์•ฑ์ „ํ™˜, /์ธ์ฆ)๊ณผ ์šด์˜์ž ๋ช…๋ น(/ํ‚ค์ƒ์„ฑ, /๊ถŒํ•œ์ค‘์ง€ ๋“ฑ)์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜ 3์—์„œ๋Š” ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ ์งํ›„๋ถ€ํ„ฐ ์šด์˜ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋„๋ก, ๊ธฐ๋Šฅ๋ณด๋‹ค ์šด์˜ ํ†ต์ œ ๋กœ์ง์„ ๋จผ์ € ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ปค๋ฆฌํ˜๋Ÿผ ํ๋ฆ„ (๋ฌธ์„œํ˜• ํŠœํ† ๋ฆฌ์–ผ)

1. ์šด์˜ ๊ธฐ์ค€ ์ •์˜: ๋ฌด์—‡์„ ๋งŒ๋“ค๊ณ  ๋ฌด์—‡์„ ๋ฒ„๋ฆด์ง€ ๊ฒฐ์ •

2. ์ „์ฒด ์•„ํ‚คํ…์ฒ˜: ์š”์ฒญ ์ˆ˜์‹  -> appId ์‹๋ณ„ -> ๊ถŒํ•œ ์ฒดํฌ -> AI ํ˜ธ์ถœ

3. Firestore ์Šคํ‚ค๋งˆ ๊ตฌ์„ฑ: ์•ฑ/์„ค์ •/ํ‚ค/๊ถŒํ•œ/์„ธ์…˜

4. ์‚ฌ์šฉ์ž ํ”Œ๋กœ์šฐ ๊ตฌํ˜„: /์•ฑ์ „ํ™˜, /์ธ์ฆ, ๋ฏธํ—ˆ์šฉ ์‚ฌ์šฉ์ž ์ฒ˜๋ฆฌ

5. ์šด์˜์ž ํ”Œ๋กœ์šฐ ๊ตฌํ˜„: ํ‚ค ๋ฐœ๊ธ‰/๋น„ํ™œ์„ฑ, ๊ถŒํ•œ ํ™•์ธ/์ค‘์ง€/์—ฐ์žฅ

6. app_settings ๊ธฐ๋ฐ˜ ๋Ÿฐํƒ€์ž„ ์ •์ฑ… ๋ถ„๋ฆฌ(basic/pro/max)

7. ์žฅ์•  ๋Œ€์‘: ๋‹จ์ˆœ ๋กœ๊ทธ ์ถ”์ ๊ณผ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ ์ ๊ฒ€

8. ์šด์˜ ํ™•์žฅ: appId ์ถ”๊ฐ€ ์‹œ ๋ณ€๊ฒฝ ๋ฒ”์œ„ ์ตœ์†Œํ™” ์ „๋žต

๊ฐ•์˜ ์ถ”์ฒœ ๋Œ€์ƒ

์ด๋Ÿฐ ๋ถ„๋“ค์ด ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์„ฑ๊ณผ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค

์ฑ—๋ด‡ ๊ธฐ๋Šฅ์€ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ์ธ์ฆ/๊ถŒํ•œ/์šด์˜ ํ†ต์ œ ๊ตฌ์กฐ๊ฐ€ ์—†์–ด ์‹ค์ œ ์„œ๋น„์Šคํ™”๊ฐ€ ๋ง‰ํžŒ ๊ฐœ๋ฐœ์ž

๋‹จ์ผ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์—ฌ๋Ÿฌ AI ์•ฑ(appId)์„ ์šด์˜ํ•ด์•ผ ํ•˜๋Š” 1์ธ ๊ฐœ๋ฐœ์ž, ์ž‘์€ ํŒ€, ์ดˆ๊ธฐ ์Šคํƒ€ํŠธ์—…

์ถ”์ฒœ ๋Œ€์ƒ

- ์ฑ—๋ด‡์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€๋งŒ ๋ฒ”์œ„๊ฐ€ ์ปค์ ธ ๋ฐฐํฌ๋ฅผ ๋๋‚ด์ง€ ๋ชปํ•œ ๋ถ„

- ์ˆ˜๊ฐ•์ƒ/๊ฒฐ์ œ์ž๋Š” ์žˆ๋Š”๋ฐ ์ ‘๊ทผ ์ œ์–ด๊ฐ€ ์—†์–ด ์šด์˜์ด ํ”๋“ค๋ฆฌ๋Š” ๋ถ„

- ๊ธฐ๋Šฅ๋ณด๋‹ค ์šด์˜ ์•ˆ์ •์„ฑ์„ ์šฐ์„ ํ•˜๋Š” MVP๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋ถ„

- appId ๊ธฐ๋ฐ˜ ๋ฉ€ํ‹ฐ์•ฑ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์šด์˜ํ•˜๊ณ  ์‹ถ์€ ๋ถ„

์ˆ˜๊ฐ• ์ „ ์ฐธ๊ณ  ์‚ฌํ•ญ


์‹ค์Šต ํ™˜๊ฒฝ

- Node.js 18+ / npm

- Firebase ํ”„๋กœ์ ํŠธ 1๊ฐœ

- ์นด์นด์˜ค 1:1 ์ฑ—๋ด‡ ์ฑ„๋„ ๋ฐ webhook ์—ฐ๊ฒฐ ๊ถŒํ•œ

- VS Code ๋˜๋Š” ๋™๊ธ‰ ์ฝ”๋“œ ์—๋””ํ„ฐ


์•Œ๊ณ  ์˜ค๋ฉด ์ข‹์€ ์ตœ์†Œ ์„ ์ˆ˜ ์ง€์‹

- JavaScript ๊ธฐ๋ณธ ๋ฌธ๋ฒ•(ํ•จ์ˆ˜, async/await)

- JSON ์š”์ฒญ/์‘๋‹ต ๊ตฌ์กฐ ์ฝ๊ธฐ

- Firestore ์ปฌ๋ ‰์…˜/๋ฌธ์„œ/ํ•„๋“œ ๊ฐœ๋…


๊ฐ•์˜์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ

- kakao-ai(vibe-coding-coach) ๊ธฐ์ค€ ์‹ค์Šต ํ๋ฆ„

- ํ•ต์‹ฌ ๋ช…๋ น์–ด์™€ ์šด์˜ ์‹œ๋‚˜๋ฆฌ์˜ค ์ฒดํฌ๋ฆฌ์ŠคํŠธ

- ๋ฐฐํฌ ํ›„ ๋ฐ”๋กœ ์ ๊ฒ€ ๊ฐ€๋Šฅํ•œ ์šด์˜ ๊ธฐ์ค€ํ‘œ


์ด ๊ฐ•์˜๋Š” "AI๋ฅผ ์ž˜ ํ˜ธ์ถœํ•˜๋Š” ๋ฒ•"๋ณด๋‹ค "์„œ๋น„์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์šด์˜ํ•˜๋Š” ๋ฒ•"์— ์ดˆ์ ์„ ๋‘ก๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜
์ถ”์ฒœ๋“œ๋ ค์š”

ํ•™์Šต ๋Œ€์ƒ์€
๋ˆ„๊ตฌ์ผ๊นŒ์š”?

  • ์ฑ—๋ด‡์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€๋งŒ ๋ฒ”์œ„๊ฐ€ ๊ณ„์† ์ปค์ ธ ๋ฐฐํฌ๋ฅผ ๋๋‚ด์ง€ ๋ชปํ•œ ๋ถ„. ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ณด๋‹ค ๋จผ์ € ์šด์˜ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ๊ตฌ์กฐ๋ฅผ ์„ธ์›Œ ์„œ๋น„์Šค ์ถœ์‹œ๊นŒ์ง€ ์™„๋ฃŒํ•˜๊ณ  ์‹ถ์€ ๋ถ„.

  • ์•ฑ์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๊ณ„์ •ยท๊ถŒํ•œยท์„ธ์…˜ ๊ด€๋ฆฌ๊ฐ€ ๊ผฌ์—ฌ ์šด์˜์ด ์–ด๋ ค์šด ๋ถ„. appId ๊ธฐ์ค€ ๋ถ„๋ฆฌ ์šด์˜๊ณผ ์šด์˜์ž ์ˆ˜๋™ ํ†ต์ œ๋กœ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ์‹ถ์€ ๋ถ„.

์„ ์ˆ˜ ์ง€์‹,
ํ•„์š”ํ• ๊นŒ์š”?

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ์ดˆ: ๋ณ€์ˆ˜, ํ•จ์ˆ˜, async/await

  • JSON ์ฝ๊ธฐ/์ˆ˜์ •: ์š”์ฒญ/์‘๋‹ต body ๊ตฌ์กฐ ์ดํ•ด

  • Firebase ๊ธฐ์ดˆ: Functions ๋ฐฐํฌ 1ํšŒ ๊ฒฝํ—˜ ๋˜๋Š” ์ฝ˜์†” ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ˆ˜์ค€

  • Firestore ๊ธฐ์ดˆ: ์ปฌ๋ ‰์…˜/๋ฌธ์„œ/ํ•„๋“œ ๊ฐœ๋… ์ดํ•ด

  • ์นด์นด์˜ค ์ฑ—๋ด‡ ๊ธฐ์ดˆ: ์Šคํ‚ฌ webhook URL ์—ฐ๊ฒฐ ๊ฒฝํ—˜(์ดˆ๊ธ‰ ์ˆ˜์ค€์ด๋ฉด ์ถฉ๋ถ„)

์•ˆ๋…•ํ•˜์„ธ์š”
์ตœ์›์˜์ž…๋‹ˆ๋‹ค.

https://github.com/tac0de
์ด์ „์— ๋ชธ๋‹ด์•˜๋˜ ์Šคํƒ€ํŠธ์—…์—์„œ ์ €๋Š” ๋‹จ์ˆœํžˆ โ€œ์ฝ”๋“œ๋ฅผ ์ž˜ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•โ€์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์ˆ ์ด ํ•˜๋‚˜์˜ ์„œ๋น„์Šค์™€ ์ƒํƒœ๊ณ„๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ํŒ€์ด์—ˆ์ง€๋งŒ, ๊ฐœ๋ณ„ ๊ธฐ์ˆ  ์Šคํƒ๋ณด๋‹ค๋„ ๋ฏธ๋ž˜๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๋ผ๋ณด๊ณ  ์–ด๋–ค ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ๋” ์ค‘์š”ํ•˜๊ฒŒ ๊ณ ๋ฏผํ•˜๋Š” ํ™˜๊ฒฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ์—ญํ• ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ด์—ˆ์œผ๋ฉฐ, ์„œ๋น„์Šค์˜ ์•ˆ์ •์„ฑ๊ณผ ํ•ต์‹ฌ ํ๋ฆ„์„ ๋‹ค๋ฃจ๋Š” ๋ฐฑ์—”๋“œ ์˜์—ญ์—๋„ ํ•จ๊ป˜ ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์›น ํ™˜๊ฒฝ์—์„œ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์ด๊ณ  ํ•ฉ๋ฒ•์ ์œผ๋กœ ์ˆ˜์ง‘ยท์ฒ˜๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์„ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•œ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
FTP/SFTP ๋ฐ Web ๊ธฐ๋ฐ˜ ์ˆ˜์ง‘ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด 100๋งŒ ๊ฐœ ์ด์ƒ์˜ ํŒจ์…˜ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ํฌ๋กค๋งยท๊ด€๋ฆฌํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์„ ๋‹ด๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์ €๋Š” ํŠน์ • ์–ธ์–ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค, ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ฑ…์ž„์ง€๋Š” ์„ค๊ณ„ ์—ญ๋Ÿ‰์ด ์žฅ๊ธฐ์ ์œผ๋กœ ํ›จ์”ฌ ์ค‘์š”ํ•˜๋‹ค๋Š” ํ™•์‹ ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ์›น ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ์—์„œ AI๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„์™€ ๊ฐœ๋ฐœ ๋ฐฉ์‹์— ์ง‘์ค‘ํ•˜๋ฉฐ, AI ์‹œ๋Œ€์— ์ ํ•ฉํ•œ ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

AI ๊ธฐ์ˆ ์ด ๋น ๋ฅด๊ฒŒ ๋ฐœ์ „ํ•˜๋Š” ์ง€๊ธˆ, ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ ๋„๊ตฌ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ์—ญํ• ์— ๋จธ๋ฌผ๋Ÿฌ์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์‰ฝ๊ฒŒ, ๋‹จ์ˆœํ•˜๊ฒŒ, ํšจ์œจ์ ์œผ๋กœ, ๊ทธ๋ฆฌ๊ณ  ํ•ต์‹ฌ๋งŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ.
์ด๊ฒƒ์ด ์ œ๊ฐ€ ๊ฐ•์˜๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ธฐ์ค€์ด์ž ์ฒ ํ•™์ž…๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ

์ปค๋ฆฌํ˜๋Ÿผ

์ „์ฒด

23๊ฐœ โˆ™ (1๋ถ„)

๊ฐ•์˜ ๊ฒŒ์‹œ์ผ: 
๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ์ผ: 

์ˆ˜๊ฐ•ํ‰

์•„์ง ์ถฉ๋ถ„ํ•œ ํ‰๊ฐ€๋ฅผ ๋ฐ›์ง€ ๋ชปํ•œ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค.
๋ชจ๋‘์—๊ฒŒ ๋„์›€์ด ๋˜๋Š” ์ˆ˜๊ฐ•ํ‰์˜ ์ฃผ์ธ๊ณต์ด ๋˜์–ด์ฃผ์„ธ์š”!

์ตœ์›์˜๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜

์ง€์‹๊ณต์œ ์ž๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

๋น„์Šทํ•œ ๊ฐ•์˜

๊ฐ™์€ ๋ถ„์•ผ์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

๋น„๊ณต๊ฐœ ๊ฐ•์˜๋กœ
์ˆ˜๊ฐ•์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.