ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ SaaS ํ๋ก์ ํธ ๊ธฐ์ ๋ฌธ์(Architecture Document) ์์ฑํธ
octo54 2025. 12. 11. 13:27๐ SaaS ํ๋ก์ ํธ ๊ธฐ์ ๋ฌธ์(Architecture Document) ์์ฑํธ
– ์ค์ ํ์ฌ์์ ์ฐ๋ ์์ค์ผ๋ก ์ ์ฒด ์์คํ
์ ๋ฌธ์ํํ๋ ๋ฐฉ๋ฒ –
(NestJS + Next.js + Terraform + K8s + Stripe + AI + RAG ๊ธฐ๋ฐ SaaS ๊ธฐ์ค)
์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง ๊ธฐํ → ๊ฐ๋ฐ → ์ธํ๋ผ → ๋ฐฐํฌ → ์ด์ → AI → ๊ตฌ๋
๊ฒฐ์ → Observability๊น์ง
์ค์ SaaS ์๋น์ค๋ฅผ ๋ง๋๋ ์ ๊ณผ์ ์ ๋๋๋ค.
์ด์ ๋ง์ง๋ง ๋จ๊ณ๋ **“๋ฌธ์ํ”**๋ค.
์ฝ๋๊ฐ ์๋ฌด๋ฆฌ ํ๋ฅญํด๋ ๋ฌธ์๊ฐ ์์ผ๋ฉด
ํ์์ด ๋ค์ด์ฌ ์๋ ์๊ณ ,
๋ฒ๊ทธ ๋์๋ ์ด๋ ต๊ณ ,
ํฌ์์/ํด๋ผ์ด์ธํธ์๊ฒ ์ค๋ช ์กฐ์ฐจ ๋ถ๊ฐ๋ฅํ๋ค.
์ด๋ฒ ๊ธ์์๋
์ค์ ์คํํธ์
/ ๊ธฐ์
์์ ์ฐ๋ ๊ธฐ์ ๋ฌธ์ ํ
ํ๋ฆฟ๊ณผ ํจ๊ป
์ฐ๋ฆฌ๊ฐ ๋ง๋ SaaS ์ ์ฒด ์์คํ
์ ์ ๋ฆฌํด๋ณธ๋ค.
์ด ๊ธ์ ๋๋ด๋ฉด
“๋ด ์๋น์ค์ ๊ธฐ์ ๋ฌธ์ ํ ๋ฒ ๋ณด์ฌ์ค๊ฒ์.”
๋ผ๊ณ ํ ์ ์๋ ์์ค์ ์์ฑํ ๋ฌธ์๋ฅผ ๊ฐ๊ฒ ๋๋ค.
๐งญ ์ด๋ฒ ๊ธ์์ ๋ง๋ค ๋ฌธ์ ์ข ๋ฅ
์ฐ๋ฆฌ๊ฐ ์์ฑํ ๋ฌธ์๋ ์ด 6์ข ๋ฅ๋ค.
- ์์คํ ์ํคํ ์ฒ ๋ฌธ์ (System Architecture Document)
- ERD + ๋ฐ์ดํฐ ๋ชจ๋ธ ๋ฌธ์
- API ์คํ ๋ฌธ์ (Backend API Documentation)
- ์ธํ๋ผ ๋ฌธ์ (Infra / DevOps Architecture)
- ์ด์ ๋ฌธ์ (Monitoring · Alerting · Security Policy)
- ์ฅ์ ๋์ 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 |
| 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
'study > ๋ฐฑ์๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- CI/CD
- ai์ฒ ํ
- node.js
- DevOps
- Express
- seo ์ต์ ํ 10๊ฐ
- ํ๋ก ํธ์๋๊ฐ๋ฐ
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- Prisma
- NestJS
- Redis
- Next.js
- fastapi
- flax
- SEO์ต์ ํ
- REACT
- JWT
- ์๋ฐ๋ฉด์
- ๋ฅ๋ฌ๋
- PostgreSQL
- rag
- Python
- kotlin
- ์ฟ ๋ฒ๋คํฐ์ค
- JAX
- ๋ฐฑ์๋๊ฐ๋ฐ
- llm
- nextJS
- Docker
- ์น๊ฐ๋ฐ
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 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 |

