Skip to content

Latest commit

Β 

History

History
303 lines (247 loc) Β· 10.5 KB

File metadata and controls

303 lines (247 loc) Β· 10.5 KB

Nebula AI μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

κ°œμš”

Nebula AIλŠ” AI 기반 뢁마크 μ €μž₯ 및 μ‚¬μš©μž ν”„λ‘œν•„ 관리 μ‹œμŠ€ν…œμœΌλ‘œ, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜μ™€ CQRS νŒ¨ν„΄μ„ 기반으둜 κ΅¬μΆ•λœ ν™•μž₯ κ°€λŠ₯ν•œ ν”Œλž«νΌμž…λ‹ˆλ‹€.

μ‹œμŠ€ν…œ ꡬ성

전체 μ•„ν‚€ν…μ²˜ κ°œμš”

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    HTTP API    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Spring Boot   β”‚ ──────────────► β”‚   AI Server     β”‚
β”‚    μ„œλ²„         β”‚                β”‚  (FastAPI)      β”‚
β”‚                 β”‚                β”‚                 β”‚
β”‚ - μ‚¬μš©μž 인증   β”‚                β”‚ - ν”„λ‘œν•„ 뢄석   β”‚
β”‚ - μ›Ή μΈν„°νŽ˜μ΄μŠ€ β”‚                β”‚ - μΆ”μ²œ μ—”μ§„     β”‚
β”‚ - 데이터 관리   β”‚                β”‚ - 벑터 처리     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                            β”‚
                                            β”‚ RabbitMQ
                                            β–Ό
                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                   β”‚           λ©”μ‹œμ§€ 큐 μ‹œμŠ€ν…œ                   β”‚
                   β”‚                                             β”‚
                   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚
                   β”‚  β”‚  뢁마크     β”‚  β”‚   ν”„λ‘œν•„    β”‚          β”‚
                   β”‚  β”‚  μ €μž₯ 큐    β”‚  β”‚  μ—…λ°μ΄νŠΈν β”‚          β”‚
                   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                            β”‚
                                            β”‚ Celery
                                            β–Ό
                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                   β”‚         λ°±κ·ΈλΌμš΄λ“œ μž‘μ—… 처리                β”‚
                   β”‚                                             β”‚
                   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚
                   β”‚  β”‚  벑터 생성  β”‚  β”‚  μœ μ‚¬λ„     β”‚          β”‚
                   β”‚  β”‚   μž‘μ—…      β”‚  β”‚  계산 μž‘μ—…  β”‚          β”‚
                   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                            β”‚
                                            β–Ό
                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                   β”‚            데이터 μ €μž₯μ†Œ                    β”‚
                   β”‚                                             β”‚
                   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚
                   β”‚  β”‚ PostgreSQL  β”‚  β”‚    Redis    β”‚          β”‚
                   β”‚  β”‚  (메인 DB)  β”‚  β”‚   (μΊμ‹œ)    β”‚          β”‚
                   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

핡심 μ•„ν‚€ν…μ²˜ νŒ¨ν„΄

1. CQRS (Command Query Responsibility Segregation)

μ‚¬μš©μž ν”„λ‘œν•„ μ‹œμŠ€ν…œμ€ CQRS νŒ¨ν„΄μ„ 톡해 읽기와 μ“°κΈ°λ₯Ό λΆ„λ¦¬ν•˜μ—¬ μ„±λŠ₯κ³Ό ν™•μž₯성을 보μž₯ν•©λ‹ˆλ‹€.

Command Side (μ“°κΈ°)

Spring Boot β†’ RabbitMQ β†’ AI Server β†’ 비동기 처리 β†’ 데이터 μ €μž₯

νŠΉμ§•:

  • λͺ¨λ“  μ—…λ°μ΄νŠΈ μž‘μ—…μ€ λ©”μ‹œμ§€ 큐λ₯Ό 톡해 비동기 처리
  • μ›μžμ  μ—°μ‚°κ³Ό 이벀트 μ†Œμ‹± 지원
  • 높은 μ²˜λ¦¬λŸ‰κ³Ό μ•ˆμ •μ„± 보μž₯

Query Side (읽기)

Spring Boot β†’ FastAPI 직접 호좜 β†’ μ¦‰μ‹œ 응닡

νŠΉμ§•:

  • μ‹€μ‹œκ°„ 쑰회 API 제곡
  • μΊμ‹œ 기반 λΉ λ₯Έ 응닡
  • 읽기 μ „μš© μ΅œμ ν™”λœ 데이터 ꡬ쑰

2. 이벀트 기반 μ•„ν‚€ν…μ²˜

이벀트 ν”Œλ‘œμš°

μ‚¬μš©μž 행동 β†’ 이벀트 λ°œμƒ β†’ λ©”μ‹œμ§€ 큐 β†’ 이벀트 처리 β†’ μƒνƒœ μ—…λ°μ΄νŠΈ

μ£Όμš” 이벀트:

  • 뢁마크 μ €μž₯ 이벀트
  • μ±„νŒ… μ„Έμ…˜ μ™„λ£Œ 이벀트
  • ν”„λ‘œν•„ ν’ˆμ§ˆ 체크 이벀트
  • μΆ”μ²œ κ°±μ‹  이벀트

3. λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ νŒ¨ν„΄

Spring Boot μ„œλ²„ (μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€)

  • μ—­ν• : μ›Ή μΈν„°νŽ˜μ΄μŠ€, 인증, μ„Έμ…˜ 관리
  • 기술: Java, Spring Boot, MySQL
  • μ±…μž„: μ‚¬μš©μž κ²½ν—˜, 데이터 무결성

AI μ„œλ²„ (데이터 처리)

  • μ—­ν• : AI 뢄석, 벑터 처리, μΆ”μ²œ μ—”μ§„
  • 기술: Python, FastAPI, PostgreSQL
  • μ±…μž„: λ¨Έμ‹ λŸ¬λ‹, μžμ—°μ–΄ 처리, 벑터 μ—°μ‚°

데이터 ν”Œλ‘œμš°

1. 뢁마크 μ €μž₯ ν”Œλ‘œμš°

sequenceDiagram
    participant U as μ‚¬μš©μž
    participant S as Spring Boot
    participant Q as RabbitMQ
    participant A as AI μ„œλ²„
    participant C as Celery
    participant D as PostgreSQL

    U->>S: 뢁마크 μ €μž₯ μš”μ²­
    S->>Q: λ©”μ‹œμ§€ λ°œν–‰
    Q->>A: Consumer μˆ˜μ‹ 
    A->>C: Task νμž‰
    C->>C: 벑터 생성
    C->>D: 데이터 μ €μž₯
    C->>Q: μ™„λ£Œ μ•Œλ¦Ό
    Q->>S: κ²°κ³Ό μˆ˜μ‹ 
    S->>U: μ™„λ£Œ 응닡
Loading

2. μ‹€μ‹œκ°„ ν”„λ‘œν•„ μ—…λ°μ΄νŠΈ ν”Œλ‘œμš°

sequenceDiagram
    participant E as 이벀트
    participant L as EventListener
    participant P as ProfileProcessor
    participant R as Redis
    participant A as APIAdapter
    participant Q as RabbitMQ
    participant D as Database

    E->>L: μ‚¬μš©μž 행동 감지
    L->>P: 이벀트 처리
    P->>R: μž„μ‹œ μΊμ‹œ
    P->>A: API μ–΄λŒ‘ν„° 호좜
    A->>Q: λ©”μ‹œμ§€ λ°œν–‰
    Q->>P: λ°±κ·ΈλΌμš΄λ“œ 처리
    P->>D: ν”„λ‘œν•„ μ—…λ°μ΄νŠΈ
Loading

기술 μŠ€νƒ

λ°±μ—”λ“œ μ„œλΉ„μŠ€

AI μ„œλ²„ (Python)

  • ν”„λ ˆμž„μ›Œν¬: FastAPI
  • 비동기 처리: Celery + Redis
  • λ©”μ‹œμ§€ 큐: RabbitMQ (aio-pika)
  • ML/AI: OpenAI API, NLTK, scikit-learn
  • 벑터 DB: Chroma, PostgreSQL + pgvector

Spring Boot μ„œλ²„ (Java)

  • ν”„λ ˆμž„μ›Œν¬: Spring Boot
  • λ°μ΄ν„°λ² μ΄μŠ€: MySQL
  • 인증: Spring Security
  • API 톡신: RestTemplate/WebClient

인프라 κ΅¬μ„±μš”μ†Œ

λ©”μ‹œμ§€ 큐 μ‹œμŠ€ν…œ

# μ£Όμš” 큐 ꡬ성
QUEUES = {
    "bookmark.save": "뢁마크 μ €μž₯ 처리",
    "profile.update": "ν”„λ‘œν•„ μ‹€μ‹œκ°„ μ—…λ°μ΄νŠΈ", 
    "profile.refresh": "ν”„λ‘œν•„ 배치 κ°±μ‹ ",
    "recommendation.refresh": "μΆ”μ²œ μ‹œμŠ€ν…œ κ°±μ‹ ",
    "analytics": "뢄석 μž‘μ—…"
}

λ°μ΄ν„°λ² μ΄μŠ€ ꡬ성

  • PostgreSQL: 메인 데이터 μ €μž₯μ†Œ (벑터 데이터 포함)
  • Redis: μΊμ‹œ 및 μ„Έμ…˜ μ €μž₯μ†Œ
  • MySQL: Spring Boot μ„œλ²„ 데이터
  • Chroma: 벑터 μœ μ‚¬λ„ 검색

λ³΄μ•ˆ 및 μ„±λŠ₯

λ³΄μ•ˆ μ•„ν‚€ν…μ²˜

인증/κΆŒν•œ

  • Spring Boot: JWT 기반 인증
  • AI μ„œλ²„: API ν‚€ 기반 μ ‘κ·Ό μ œμ–΄
  • λ‚΄λΆ€ 톡신: λ©”μ‹œμ§€ 큐λ₯Ό ν†΅ν•œ μ•ˆμ „ν•œ 톡신

데이터 보호

  • κ°œμΈμ •λ³΄ λ§ˆμŠ€ν‚Ή: μ±„νŒ… 데이터 μžλ™ λ§ˆμŠ€ν‚Ή
  • μ•”ν˜Έν™”: μ€‘μš” 데이터 μ•”ν˜Έν™” μ €μž₯
  • μ ‘κ·Ό μ œμ–΄: μ‚¬μš©μžλ³„ 데이터 μ ‘κ·Ό κΆŒν•œ

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

캐싱 μ „λž΅

# λ‹€μΈ΅ 캐싱 ꡬ쑰
CACHE_LAYERS = {
    "L1": "Redis (λΉ λ₯Έ μ ‘κ·Ό)",
    "L2": "PostgreSQL (영ꡬ μ €μž₯)",
    "L3": "벑터 DB (μœ μ‚¬λ„ 검색)"
}

비동기 처리

  • μ‹€μ‹œκ°„: μ€‘μš”ν•œ μ—…λ°μ΄νŠΈ μ¦‰μ‹œ 처리
  • 배치: λŒ€λŸ‰ 데이터 효율적 처리
  • μŠ€μΌ€μ€„λ§: μ‹œμŠ€ν…œ λΆ€ν•˜ λΆ„μ‚°

ν™•μž₯μ„± 및 λͺ¨λ‹ˆν„°λ§

μˆ˜ν‰ ν™•μž₯

  • Celery Worker: 독립적 μŠ€μΌ€μΌλ§
  • AI μ„œλ²„: Load Balancerλ₯Ό ν†΅ν•œ 닀쀑 μΈμŠ€ν„΄μŠ€
  • λ°μ΄ν„°λ² μ΄μŠ€: 읽기 볡제본 ν™œμš©

λͺ¨λ‹ˆν„°λ§ 도ꡬ

  • RabbitMQ Management: 큐 μƒνƒœ λͺ¨λ‹ˆν„°λ§
  • Flower: Celery μž‘μ—… λͺ¨λ‹ˆν„°λ§
  • Prometheus + Grafana: μ‹œμŠ€ν…œ λ©”νŠΈλ¦­
  • 둜그 집계: μ€‘μ•™ν™”λœ 둜그 관리

μž₯μ•  볡ꡬ

  • Circuit Breaker: μ„œλΉ„μŠ€ μž₯μ•  격리
  • Retry Logic: μžλ™ μž¬μ‹œλ„ λ©”μ»€λ‹ˆμ¦˜
  • Dead Letter Queue: μ‹€νŒ¨ν•œ λ©”μ‹œμ§€ 처리
  • Health Check: μ„œλΉ„μŠ€ μƒνƒœ μžλ™ 감지

데이터 λͺ¨λΈ

핡심 μ—”ν‹°ν‹°

UserProfile (μ‚¬μš©μž ν”„λ‘œν•„)

{
    "user_id": "μ‚¬μš©μž μ‹λ³„μž",
    "profile_vector": "768차원 벑터",
    "last_updated": "λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ μ‹œκ°„",
    "quality_score": "ν”„λ‘œν•„ ν’ˆμ§ˆ 점수",
    "metadata": "μΆ”κ°€ 메타데이터"
}

Bookmark (뢁마크)

{
    "bookmark_id": "뢁마크 μ‹λ³„μž",
    "user_id": "μ†Œμœ μž",
    "title": "제λͺ©",
    "url": "URL",
    "vector_embedding": "μ½˜ν…μΈ  벑터",
    "keywords": "ν‚€μ›Œλ“œ 리슀트",
    "similarity_score": "μœ μ‚¬λ„ 점수"
}

개발 및 배포

개발 ν™˜κ²½

# 둜컬 개발 ν™˜κ²½ ꡬ성
make local                    # 전체 μ„œλΉ„μŠ€ μ‹œμž‘
make test-all                # 톡합 ν…ŒμŠ€νŠΈ
make dev-setup               # 개발 ν™˜κ²½ μ„€μ •

배포 μ „λž΅

  • 개발: Docker Compose 기반
  • μŠ€ν…Œμ΄μ§•: Kubernetes ν΄λŸ¬μŠ€ν„°
  • ν”„λ‘œλ•μ…˜: ν΄λΌμš°λ“œ λ„€μ΄ν‹°λΈŒ 배포

CI/CD νŒŒμ΄ν”„λΌμΈ

  1. μ½”λ“œ 컀밋 β†’ GitHub
  2. μžλ™ ν…ŒμŠ€νŠΈ β†’ pytest, 톡합 ν…ŒμŠ€νŠΈ
  3. λΉŒλ“œ β†’ Docker 이미지
  4. 배포 β†’ ν™˜κ²½λ³„ μžλ™ 배포

ν–₯ν›„ λ°œμ „ λ°©ν–₯

단기 κ³„νš (3κ°œμ›”)

  • μΆ”μ²œ μ—”μ§„ 고도화
  • μ„±λŠ₯ λ©”νŠΈλ¦­ λŒ€μ‹œλ³΄λ“œ
  • A/B ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬

쀑기 κ³„νš (6κ°œμ›”)

  • λ¨Έμ‹ λŸ¬λ‹ νŒŒμ΄ν”„λΌμΈ μžλ™ν™”
  • 닀쀑 ν…Œλ„ŒνŠΈ 지원
  • κ³ κΈ‰ 뢄석 κΈ°λŠ₯

μž₯κΈ° κ³„νš (1λ…„)

  • AI λͺ¨λΈ 자체 ν›ˆλ ¨
  • μ‹€μ‹œκ°„ κ°œμΈν™”
  • κΈ€λ‘œλ²Œ ν™•μž₯

이 μ•„ν‚€ν…μ²˜λŠ” ν™•μž₯μ„±, μ•ˆμ •μ„±, μ„±λŠ₯을 λͺ¨λ‘ κ³ λ €ν•˜μ—¬ μ„€κ³„λ˜μ—ˆμœΌλ©°, 지속적인 κ°œμ„ μ„ 톡해 λ”μš± μ •κ΅ν•œ μ‹œμŠ€ν…œμœΌλ‘œ λ°œμ „ν•  μ˜ˆμ •μž…λ‹ˆλ‹€.