ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿ“˜ SaaS ํ”„๋กœ์ ํŠธ ๊ธฐ์ˆ  ๋ฌธ์„œ(Architecture Document) ์™„์„ฑํŽธ

– ์‹ค์ œ ํšŒ์‚ฌ์—์„œ ์“ฐ๋Š” ์ˆ˜์ค€์œผ๋กœ ์ „์ฒด ์‹œ์Šคํ…œ์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ• –
(NestJS + Next.js + Terraform + K8s + Stripe + AI + RAG ๊ธฐ๋ฐ˜ SaaS ๊ธฐ์ค€)


์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๊ธฐํš → ๊ฐœ๋ฐœ → ์ธํ”„๋ผ → ๋ฐฐํฌ → ์šด์˜ → AI → ๊ตฌ๋… ๊ฒฐ์ œ → Observability๊นŒ์ง€
์‹ค์ œ SaaS ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ „ ๊ณผ์ •์„ ๋๋ƒˆ๋‹ค.

์ด์ œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋Š” **“๋ฌธ์„œํ™””**๋‹ค.

์ฝ”๋“œ๊ฐ€ ์•„๋ฌด๋ฆฌ ํ›Œ๋ฅญํ•ด๋„ ๋ฌธ์„œ๊ฐ€ ์—†์œผ๋ฉด
ํŒ€์›์ด ๋“ค์–ด์˜ฌ ์ˆ˜๋„ ์—†๊ณ ,
๋ฒ„๊ทธ ๋Œ€์‘๋„ ์–ด๋ ต๊ณ ,
ํˆฌ์ž์ž/ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์„ค๋ช…์กฐ์ฐจ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š”
์‹ค์ œ ์Šคํƒ€ํŠธ์—… / ๊ธฐ์—…์—์„œ ์“ฐ๋Š” ๊ธฐ์ˆ  ๋ฌธ์„œ ํ…œํ”Œ๋ฆฟ๊ณผ ํ•จ๊ป˜
์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  SaaS ์ „์ฒด ์‹œ์Šคํ…œ์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

์ด ๊ธ€์„ ๋๋‚ด๋ฉด
๋‚ด ์„œ๋น„์Šค์˜ ๊ธฐ์ˆ  ๋ฌธ์„œ ํ•œ ๋ฒˆ ๋ณด์—ฌ์ค„๊ฒŒ์š”.
๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์˜ ์™„์„ฑํ˜• ๋ฌธ์„œ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.


๐Ÿงญ ์ด๋ฒˆ ๊ธ€์—์„œ ๋งŒ๋“ค ๋ฌธ์„œ ์ข…๋ฅ˜

์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•  ๋ฌธ์„œ๋Š” ์ด 6์ข…๋ฅ˜๋‹ค.

  1. ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์„œ (System Architecture Document)
  2. ERD + ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ฌธ์„œ
  3. API ์ŠคํŽ™ ๋ฌธ์„œ (Backend API Documentation)
  4. ์ธํ”„๋ผ ๋ฌธ์„œ (Infra / DevOps Architecture)
  5. ์šด์˜ ๋ฌธ์„œ (Monitoring · Alerting · Security Policy)
  6. ์žฅ์•  ๋Œ€์‘ Runbook (Incident Response Guide)

์ด 6๊ฐœ๋งŒ ์žˆ์œผ๋ฉด
๋ˆ„๊ฐ€ ์™€๋„ ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ ,
๊ฐœ๋ฐœ์ž ์˜จ๋ณด๋”ฉ๋„ ํ›จ์”ฌ ๋นจ๋ผ์ง„๋‹ค.


1๏ธโƒฃ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์„œ (System Architecture)

๋ฐ˜์‘ํ˜•

1. ๊ฐœ์š”

๋ณธ ๋ฌธ์„œ๋Š” Next.js + NestJS ๊ธฐ๋ฐ˜์˜ AI SaaS ํ”Œ๋žซํผ ์ „์ฒด ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.
API ์„œ๋ฒ„, ํ”„๋ก ํŠธ์—”๋“œ, AI ์—”์ง„, Vector DB, Stripe Billing, Kubernetes ๊ธฐ๋ฐ˜ ์ธํ”„๋ผ ๋ฐ DevOps ์ „์ฒด ์ฒด๊ณ„๋ฅผ ํฌํ•จํ•œ๋‹ค.

2. ์ „์ฒด ์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ

              [Browser]
                  โ”‚
                  โ–ผ
       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
       โ”‚   Next.js (CDN SSR)   โ”‚
       โ”‚  Cloudflare Pages     โ”‚
       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                   โ”‚ REST/HTTPS
                   โ–ผ
       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
       โ”‚     NestJS API       โ”‚
       โ”‚  Auth / Billing / AI โ”‚
       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                   โ”‚
       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
       โ”‚  Vector DB (Qdrant)   โ”‚
       โ”‚  Redis Cache          โ”‚
       โ”‚  R2 Storage           โ”‚
       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                   โ”‚
       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
       โ”‚   Kubernetes (EKS)    โ”‚
       โ”‚  Prometheus/Grafana   โ”‚
       โ”‚  ArgoCD (GitOps CI/CD)โ”‚
       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2๏ธโƒฃ ERD + ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ฌธ์„œ

1. ํ•ต์‹ฌ ํ…Œ์ด๋ธ”

User

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…

id int PK
email string unique
password string bcrypt hash
plan enum(FREE, PRO, ENT) ๊ตฌ๋… ํ”Œ๋žœ
ai_limit int AI ์ผ์ผ ์ œํ•œ
createdAt datetime ๊ฐ€์ž…์ผ

Subscription

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…

id string Stripe subscription id
userId int FK
status active/canceled Stripe ์ƒํƒœ
currentPeriodEnd datetime ๊ฐฑ์‹ ์ผ

AiUsage

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…

id int PK
userId int FK
count int ํ˜ธ์ถœ 1ํšŒ ์‹œ +1
createdAt datetime ์‚ฌ์šฉ์ผ

Document / Vector

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…

id string Qdrant vector id
text string ๋ณธ๋ฌธ
embedding float[] ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ

3๏ธโƒฃ API ์ŠคํŽ™ ๋ฌธ์„œ (OpenAPI ํ˜น์€ Markdown)

์˜ˆ: POST /auth/login

์š”์ฒญ:
{
  "email": "test@example.com",
  "password": "1234"
}

์‘๋‹ต:
{
  "token": "JWT",
  "user": {
    "id": 1,
    "plan": "PRO",
    "ai_limit": 200
  }
}

์˜ˆ: POST /ai/chat (์š”๊ธˆ์ œ์— ๋”ฐ๋ผ Guard ์ ์šฉ)

์š”์ฒญ:
{
  "prompt": "์‹๋ฌผ ์žŽ์ด ๋…ธ๋ž—๊ฒŒ ๋ณ€ํ–ˆ์–ด. ์ด์œ  ์•Œ๋ ค์ค˜."
}

์‘๋‹ต:
{
  "answer": "...",
  "tokens": 221
}

์˜ˆ: /billing/create-checkout-session

์š”์ฒญ:
{
  "priceId": "price_abc123"
}

์‘๋‹ต:
{
  "checkoutUrl": "https://checkout.stripe.com/..."
}

4๏ธโƒฃ ์ธํ”„๋ผ ๋ฌธ์„œ (Infra Architecture)

๊ตฌ์„ฑ ๋ชฉ๋ก

์˜์—ญ ๊ธฐ์ˆ 

Compute AWS EKS + EC2 NodeGroup
Networking VPC, ALB, SecurityGroup
Storage RDS(MySQL), Redis, R2
Containers Docker + Kubernetes
CD ArgoCD (GitOps)
CI GitHub Actions
IaC Terraform
CDN Cloudflare
Image Registry ECR

IaC ๊ตฌ์กฐ

/terraform
  /modules
     /vpc
     /eks
     /rds
     /redis
     /cloudflare
  main.tf
  variables.tf
  outputs.tf

CI/CD ํ๋ฆ„

Developer → Git Push(main)
 ↓
GitHub Actions (Docker Build)
 ↓
ECR Push
 ↓
k8s manifest ์—…๋ฐ์ดํŠธ
 ↓
ArgoCD ์ž๋™ ๋ฐฐํฌ
 ↓
EKS API ์„œ๋ฒ„ ๋ฐ˜์˜
 ↓
Cloudflare CDN ์ถœ๋ ฅ

5๏ธโƒฃ ์šด์˜ ๋ฌธ์„œ (Monitoring & Alerting)

Sentry Alerts

์กฐ๊ฑด ์•Œ๋ฆผ

500 ์—๋Ÿฌ ๋ฐœ์ƒ Slack #alert
์˜ค๋ฅ˜์œจ > 5% Slack + Email
์„ฑ๋Šฅ ์ €ํ•˜(trace slow) Slack

Prometheus Alerts

๋ฉ”ํŠธ๋ฆญ ์•Œ๋ฆผ ๊ทœ์น™

CPU > 80% (5๋ถ„ ์ง€์†) scale-out ํ•„์š”
Memory > 85% ๋…ธ๋“œ ์ฆ์„ค
RPS ๊ธ‰๊ฐ ์„œ๋ฒ„ ๋ฌธ์ œ
5xx ์ฆ๊ฐ€ API ์žฅ์• 

Slack ์•Œ๋ฆผ ํ…œํ”Œ๋ฆฟ

๐Ÿšจ *์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ*
- ์„œ๋น„์Šค: NestJS API
- ๋ฉ”์‹œ์ง€: {{error}}
- ๊ฒฝ๋กœ: {{url}}
- ์‹œ๊ฐ„: {{timestamp}}

6๏ธโƒฃ ์žฅ์•  ๋Œ€์‘ Runbook (Incident Response Guide)

์šด์˜์—์„œ ์ง„์งœ ์ค‘์š”ํ•œ ๋ฌธ์„œ๋Š” ๋ฐ”๋กœ ์ด๊ฒƒ.


์žฅ์•  1: AI API ์‘๋‹ต ์—†์Œ

1. OpenAI ์ƒํƒœ ํŽ˜์ด์ง€ ํ™•์ธ
2. Circuit Breaker fallback ์ž‘๋™ ์—ฌ๋ถ€ ํ™•์ธ
3. Redis ์บ์‹œ fallback ์‹คํ–‰
4. ์š”์ฒญ ์ œํ•œ(Rate-limit) ํ™•์ธ
5. Sentry trace๋ฅผ ๋”ฐ๋ผ๊ฐ€ ์›์ธ ํ™•์ธ

์žฅ์•  2: ๊ตฌ๋… ๊ฒฐ์ œ ๋ฐ˜์˜ ์•ˆ๋จ

1. Stripe Webhook ๋กœ๊ทธ ํ™•์ธ
2. /stripe/webhook NestJS ๋กœ๊ทธ ํ™•์ธ
3. Subscription ํ…Œ์ด๋ธ” ์—…๋ฐ์ดํŠธ ๋ˆ„๋ฝ ์—ฌ๋ถ€ ํ™•์ธ
4. Stripe Dashboard → event resend

์žฅ์•  3: API 500 ํญ์ฆ

1. Sentry Error message ํ˜•ํƒœ ๋ถ„์„
2. ์ตœ๊ทผ ๋ฐฐํฌ ์—ฌ๋ถ€ ํ™•์ธ → ArgoCD rollback
3. Redis / DB ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ
4. Cloudflare WAF ๋กœ๊ทธ ํ™•์ธ
5. Prometheus๋กœ CPU/Memory ์ƒํƒœ ์ ๊ฒ€

์žฅ์•  4: ํ”„๋ก ํŠธ ํ™”๋ฉด ์•ˆ ๋œธ

1. Cloudflare Pages ๋นŒ๋“œ ๋กœ๊ทธ ํ™•์ธ
2. Next.js API route ํ™•์ธ
3. env ๊ฐ’ ๋ˆ„๋ฝ ์—ฌ๋ถ€ ๊ฒ€์‚ฌ
4. Cloudflare DNS propagation ํ™•์ธ

7๏ธโƒฃ ๋ฌธ์„œ๋ฅผ ์–ด๋””์— ์ €์žฅํ•ด์•ผ ํ• ๊นŒ?

์ถ”์ฒœ ๊ตฌ์กฐ:

/docs
  /architecture
  /infra
  /api
  /database
  /operating
  /runbook

๋˜๋Š” Notion, GitHub Wiki๋กœ ๊ด€๋ฆฌํ•ด๋„ ๋œ๋‹ค.


๐ŸŽ‰ ์ด๋ฒˆ ๊ธ€ ์š”์•ฝ

ํ•ญ๋ชฉ ์™„๋ฃŒ

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์„œ โœ”๏ธ
๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ฌธ์„œ โœ”๏ธ
API ์ŠคํŽ™ ์ •๋ฆฌ โœ”๏ธ
์ธํ”„๋ผ DT ๋ฌธ์„œ โœ”๏ธ
๋ชจ๋‹ˆํ„ฐ๋ง/์šด์˜ ๋ฌธ์„œ โœ”๏ธ
์žฅ์•  ๋Œ€์‘ Runbook โœ”๏ธ

์ด์ œ ์ด ์‹œ๋ฆฌ์ฆˆ ์ „์ฒด๊ฐ€
**“์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ → ์ง„์งœ ์„œ๋น„์Šค๋กœ ์„ฑ์žฅํ•˜๋Š” ์ „์ฒด ๊ณผ์ •”**์ด ๋ฌธ์„œ๋กœ ๋‚จ์•˜๋‹ค.


๐Ÿ”ฎ ๋‹ค์ŒํŽธ ์˜ˆ๊ณ  (์‹ค์ œ ๋งˆ์ง€๋ง‰ ์‹ค๋ฌด ๋‹จ๊ณ„)

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ๊ธฐ์ˆ  ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํŒ€ ์˜จ๋ณด๋”ฉ(Onboarding) ๊ฐ€์ด๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.

“์‹ ์ž…/์ฃผ๋‹ˆ์–ด/์™ธ์ฃผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด ํ”„๋กœ์ ํŠธ์— ๋“ค์–ด์˜ค๋ฉด
๋ฌด์—‡๋ถ€ํ„ฐ ์ฝ๊ณ , ์–ด๋–ค ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜๊ณ , ์–ด๋–ค ์ˆœ์„œ๋กœ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š”๊ฐ€?”

๊ธฐ์—… ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฌธ์„œ์ด๋ฉฐ
ํŒ€ ํšจ์œจ์„ ๊ฐ€์žฅ ๊ทน์ ์œผ๋กœ ์˜ฌ๋ ค์ฃผ๋Š” ๋ฌธ์„œ๋‹ค.


 

SaaS๋ฌธ์„œํ™”, ์‹œ์Šคํ…œ์•„ํ‚คํ…์ฒ˜, DevOps๋ฌธ์„œ, NestJS, Next.js, Stripe, Observability, VectorDB, Terraform, Kubernetes, Runbook

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2026/01   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•