Skip to content

Latest commit

Β 

History

History
255 lines (201 loc) Β· 10.4 KB

File metadata and controls

255 lines (201 loc) Β· 10.4 KB

BeMore Backend Architecture - Ultrathink Engineering

🧠 Ultrathink Engineering μ² ν•™ 적용

섀계 원칙

  1. 첫 원리 사고: "μ™œ 이 방식인가?"λ₯Ό 반볡 μ§ˆλ¬Έν•˜λ©° 근본적 μž¬κ΅¬μ„±
  2. 3κ°€μ§€ λŒ€μ•ˆ 비ꡐ: λͺ¨λ“  κ΅¬μ‘°λŠ” μ΅œμ†Œ 3κ°€μ§€ 섀계 λŒ€μ•ˆμ„ 비ꡐ 뢄석
  3. AI cognitive expansion: κΉŠμ€ 섀계 검증과 좩돌 μ‹€ν—˜μ„ ν†΅ν•œ μ΅œμ ν™”
  4. 심측적 μ•„ν‚€ν…μ²˜: λ‹¨μˆœ κ΅¬ν˜„μ΄ μ•„λ‹Œ ν™•μž₯ κ°€λŠ₯ν•œ ꡬ쑰 μ§€ν–₯

πŸ—οΈ μ•„ν‚€ν…μ²˜ κ°œμš”

μ„ νƒλœ μ•„ν‚€ν…μ²˜: Domain-Driven Design (DDD) + Clean Architecture

선택 이유:

  • 감정 뢄석 λ„λ©”μΈμ˜ λ³΅μž‘μ„±: VAD, CBT, AI 상담 λ“± λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
  • ν™•μž₯μ„± μš”κ΅¬μ‚¬ν•­: μƒˆλ‘œμš΄ AI λͺ¨λΈ, 뢄석 방식 μΆ”κ°€ 용이
  • ν…ŒμŠ€νŠΈ 주도 개발: 도메인 둜직과 인프라 λΆ„λ¦¬λ‘œ ν…ŒμŠ€νŠΈ 용이
  • 미래 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ „ν™˜: μ„œλΉ„μŠ€ 뢄리 μ‹œ 독립적 배포 κ°€λŠ₯

πŸ“ λ ˆμ΄μ–΄ ꡬ쑰

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Presentation Layer                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚   User      β”‚ β”‚  Emotion    β”‚ β”‚    Chat     β”‚           β”‚
β”‚  β”‚ Controller  β”‚ β”‚ Controller  β”‚ β”‚ Controller  β”‚           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Application Layer                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚   User      β”‚ β”‚  Emotion    β”‚ β”‚    Chat     β”‚           β”‚
β”‚  β”‚   Service   β”‚ β”‚   Service   β”‚ β”‚   Service   β”‚           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Domain Layer                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚   User      β”‚ β”‚  Emotion    β”‚ β”‚    Chat     β”‚           β”‚
β”‚  β”‚   Domain    β”‚ β”‚   Domain    β”‚ β”‚   Domain    β”‚           β”‚
β”‚  β”‚   Service   β”‚ β”‚   Service   β”‚ β”‚   Service   β”‚           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  Infrastructure Layer                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚   Prisma    β”‚ β”‚   External  β”‚ β”‚   File      β”‚           β”‚
β”‚  β”‚ Repository  β”‚ β”‚    APIs     β”‚ β”‚   Storage   β”‚           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”„ μ˜μ‘΄μ„± λ°©ν–₯

Dependency Inversion Principle 적용

  • κ³ μˆ˜μ€€ λͺ¨λ“ˆ (Domain, Application)은 μ €μˆ˜μ€€ λͺ¨λ“ˆ (Infrastructure)에 μ˜μ‘΄ν•˜μ§€ μ•ŠμŒ
  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•œ μ˜μ‘΄μ„± μ—­μ „
  • μ˜μ‘΄μ„± μ£Όμž…μ„ ν†΅ν•œ λŸ°νƒ€μž„ κ²°ν•©
// μΈν„°νŽ˜μ΄μŠ€ μ •μ˜
interface IUserRepository {
  create(data: CreateUserData): Promise<User>;
  findByEmail(email: string): Promise<User | null>;
}

// κ΅¬ν˜„μ²΄
class PrismaUserRepository implements IUserRepository {
  // Prisma κ΅¬ν˜„
}

// 도메인 μ„œλΉ„μŠ€
class UserDomainService {
  constructor(private userRepository: IUserRepository) {}
}

πŸ“¦ λͺ¨λ“ˆ ꡬ쑰

1. Common Module

src/common/
β”œβ”€β”€ dto/                    # Data Transfer Objects
β”œβ”€β”€ guards/                 # Authentication Guards
β”œβ”€β”€ strategies/             # JWT Strategy
β”œβ”€β”€ services/               # Shared Services (Prisma)
β”œβ”€β”€ interfaces/             # Repository & Service Interfaces
└── constants/              # Provider Tokens

2. Domain Module

src/domain/
└── services/               # Domain Business Logic
    β”œβ”€β”€ user-domain.service.ts
    β”œβ”€β”€ emotion-analysis-domain.service.ts
    β”œβ”€β”€ chat-domain.service.ts
    └── history-domain.service.ts

3. Infrastructure Module

src/infrastructure/
└── repositories/           # Data Access Layer
    β”œβ”€β”€ prisma-user.repository.ts
    β”œβ”€β”€ prisma-emotion-analysis.repository.ts
    └── prisma-chat.repository.ts

4. Feature Modules

src/
β”œβ”€β”€ user/                   # User Management
β”œβ”€β”€ emotion/                # Emotion Analysis
β”œβ”€β”€ chat/                   # AI Chat
└── history/                # Session History

πŸ”§ 핡심 μ»΄ν¬λ„ŒνŠΈ

Repository Pattern

  • μΈν„°νŽ˜μ΄μŠ€: IUserRepository, IEmotionAnalysisRepository, IChatRepository
  • κ΅¬ν˜„μ²΄: PrismaUserRepository, PrismaEmotionAnalysisRepository, PrismaChatRepository
  • λͺ©μ : 데이터 μ ‘κ·Ό 둜직 μΊ‘μŠν™”, ν…ŒμŠ€νŠΈ μš©μ΄μ„±

Domain Services

  • UserDomainService: μ‚¬μš©μž 생성, 인증, ν”„λ‘œν•„ 관리
  • EmotionAnalysisDomainService: 감정 뢄석, CBT ν”Όλ“œλ°± 생성
  • ChatDomainService: Gemini AI λŒ€ν™”, λ©”μ‹œμ§€ 관리
  • HistoryDomainService: μ„Έμ…˜ μ €μž₯, νžˆμŠ€ν† λ¦¬ 쑰회

External Service Integration

  • Python Analysis Server: TensorFlow, Whisper 기반 감정 뢄석
  • Google Gemini API: AI λŒ€ν™” μ„œλΉ„μŠ€
  • File Storage: 이미지, μ˜€λ””μ˜€, PDF μ €μž₯

πŸ§ͺ ν…ŒμŠ€νŠΈ μ „λž΅

ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œ

        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚   E2E       β”‚  (10%)
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚   Integration      β”‚  (20%)
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         Unit               β”‚  (70%)
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

ν…ŒμŠ€νŠΈ ꡬ쑰

test/
β”œβ”€β”€ unit/                     # 도메인 둜직 λ‹¨μœ„ ν…ŒμŠ€νŠΈ
β”œβ”€β”€ integration/              # Repository 톡합 ν…ŒμŠ€νŠΈ
└── e2e/                      # API μ—”λ“œν¬μΈνŠΈ ν…ŒμŠ€νŠΈ

πŸš€ ν™•μž₯μ„± 고렀사항

λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ „ν™˜ μ€€λΉ„

  • μ„œλΉ„μŠ€ 경계: User, Emotion, Chat, History 독립적 뢄리 κ°€λŠ₯
  • API Gateway: 톡합 μ—”λ“œν¬μΈνŠΈ 관리
  • Event-Driven: μ„œλΉ„μŠ€ κ°„ 비동기 톡신

μ„±λŠ₯ μ΅œμ ν™”

  • Caching: Redis 기반 μ„Έμ…˜, 뢄석 κ²°κ³Ό 캐싱
  • Database: 읽기/μ“°κΈ° 뢄리, 인덱슀 μ΅œμ ν™”
  • Async Processing: λŒ€μš©λŸ‰ 파일 처리, PDF 생성

πŸ”’ λ³΄μ•ˆ μ•„ν‚€ν…μ²˜

인증 & 인가

  • JWT: Stateless 인증, 토큰 기반 κΆŒν•œ 관리
  • Rate Limiting: API 호좜 μ œν•œ
  • Input Validation: DTO 기반 μž…λ ₯ 검증

데이터 보호

  • Encryption: 민감 데이터 μ•”ν˜Έν™”
  • GDPR Compliance: κ°œμΈμ •λ³΄ λ³΄ν˜Έλ²• μ€€μˆ˜
  • Audit Logging: μ‚¬μš©μž ν™œλ™ 좔적

πŸ“Š λͺ¨λ‹ˆν„°λ§ & λ‘œκΉ…

Observability

  • Structured Logging: JSON ν˜•νƒœ 둜그
  • Metrics: μ„±λŠ₯ μ§€ν‘œ μˆ˜μ§‘
  • Tracing: λΆ„μ‚° 좔적 (OpenTelemetry)

Health Checks

  • Database: μ—°κ²° μƒνƒœ 확인
  • External APIs: Gemini, Python μ„œλ²„ μƒνƒœ
  • File Storage: μ €μž₯μ†Œ μ ‘κ·Όμ„± 확인

πŸ”„ 배포 μ•„ν‚€ν…μ²˜

CI/CD Pipeline

Code β†’ Test β†’ Build β†’ Deploy β†’ Monitor

Environment Strategy

  • Development: 둜컬 개발 ν™˜κ²½
  • Staging: 톡합 ν…ŒμŠ€νŠΈ ν™˜κ²½
  • Production: 운영 ν™˜κ²½

πŸ“ˆ μ„±λŠ₯ μ§€ν‘œ

KPI (Key Performance Indicators)

  • Response Time: API 응닡 μ‹œκ°„ < 500ms
  • Throughput: μ΄ˆλ‹Ή μš”μ²­ μ²˜λ¦¬λŸ‰
  • Error Rate: μ—λŸ¬μœ¨ < 1%
  • Availability: κ°€μš©μ„± > 99.9%

🎯 결둠

Ultrathink Engineering 철학을 μ μš©ν•œ BeMore λ°±μ—”λ“œλŠ”:

  1. ν™•μž₯ κ°€λŠ₯ν•œ ꡬ쑰: DDD + Clean Architecture
  2. ν…ŒμŠ€νŠΈ μš©μ΄μ„±: μΈν„°νŽ˜μ΄μŠ€ 기반 μ˜μ‘΄μ„± 뢄리
  3. μœ μ§€λ³΄μˆ˜μ„±: λͺ…ν™•ν•œ λ ˆμ΄μ–΄ 뢄리
  4. μ„±λŠ₯ μ΅œμ ν™”: 캐싱, 비동기 처리 μ€€λΉ„
  5. λ³΄μ•ˆ κ°•ν™”: JWT, μž…λ ₯ 검증, μ•”ν˜Έν™”

이 κ΅¬μ‘°λŠ” ν˜„μž¬ μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±ν•˜λ©΄μ„œλ„ 미래의 ν™•μž₯κ³Ό λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ „ν™˜μ„ κ³ λ €ν•œ 심측적 μ„€κ³„μž…λ‹ˆλ‹€.