콘텐츠로 이동

2. 아키텍처 (Architecture)

2.1 시스템 아키텍처 다이어그램

전체 시스템 구조

graph TD
    Internet((Internet))
    Nginx[Nginx Proxy<br/>Port 4040]
    Static[Static Files<br/>React SPA]
    API["/api/*<br/>Proxy Pass"]
    Help["/help/*<br/>Static HTML"]
    FastAPI[FastAPI App<br/>Port 9040]
    PG[(PostgreSQL<br/>Shared, 5432)]
    Chroma[(ChromaDB<br/>Vector DB)]
    ExtAPI[External APIs<br/>PubMed, etc.]

    Internet --> Nginx
    Nginx --> Static
    Nginx --> API
    Nginx --> Help
    API --> FastAPI
    FastAPI --> PG
    FastAPI --> Chroma
    FastAPI --> ExtAPI

컨테이너 구성

graph TB
    subgraph allergyinsight-network
        FE[frontend<br/>Nginx :4040]
        BE[backend<br/>FastAPI :9040]
        SC[scheduler<br/>APScheduler]
    end

    subgraph database-network [database-network - external]
        PG[(PostgreSQL<br/>shared :5432)]
    end

    FE -->|proxy| BE
    BE --> PG
    SC --> PG

주요 특징

  • PostgreSQL은 database-network를 통해 공유 (외부 컨테이너)
  • 내부 통신은 allergyinsight-network (bridge)
  • ChromaDB는 backend 볼륨에 내장 (chromadb_data)
  • Scheduler는 별도 컨테이너로 분리 (backend 이미지 재사용)

2.2 서비스 구조 (4-App Architecture)

프론트엔드 앱 구조

┌─────────────────────────────────────────────────────────────────┐
│                         Frontend (React)                         │
├──────────┬──────────┬──────────┬────────────────────────────────┤
│  Admin   │Profession│ Consumer │     Public Apps                │
│ /admin/* │ /pro/*   │ /app/*   │ /analytics/* /ai/* /subscribe  │
├──────────┼──────────┼──────────┼────────────────────────────────┤
│Dashboard │Dashboard │MyDiagnosis│AllergenAnalysis               │
│Users     │Diagnosis │FoodGuide │PaperCollection                │
│Allergens │Patients  │Lifestyle │AllergenNews                   │
│Papers    │Search/QA │Emergency │ComprehensiveTrend             │
│Orgs      │Papers    │KitRegister│AIConsult / AIInsight         │
│News      │Clinical  │          │Subscribe / Report             │
│Subscribers│Report   │          │ClinicalTrials                 │
│Analytics │          │          │                                │
├──────────┴──────────┴──────────┴────────────────────────────────┤
│                      Shared Components                           │
│        (AuthContext, apiClient, Header, Modal, hooks)            │
└─────────────────────────────────────────────────────────────────┘

백엔드 API 구조

graph TB
    subgraph "Backend (FastAPI)"
        subgraph "API Layer"
            Admin["/api/admin"]
            Pro["/api/pro"]
            Consumer["/api/consumer"]
            Public["/api/public/analytics<br/>/api/ai/consult<br/>/api/ai/insight<br/>/api/subscribe<br/>/api/report<br/>/api/clinicaltrials"]
        end
        subgraph "Core Modules"
            Auth["Auth<br/>JWT/Google/Email"]
            AllergenDB["Allergen DB"]
            PrescEngine["Prescription Engine"]
            ActivityLog["Activity Logger"]
            RateLimit["Rate Limiter (slowapi)"]
        end
        subgraph "Service Layer (39+ services)"
            PaperSearch["Paper Search"]
            QA["QA Engine / RAG"]
            NewsPipe["News Pipeline"]
            Analytics["Analytics / Trend"]
            SubEmail["Subscription / Email"]
            Scheduler["Scheduler"]
        end
        subgraph "Data Layer"
            SQLAlchemy["SQLAlchemy 2.0<br/>asyncpg + psycopg2"]
            ChromaDB["ChromaDB (Vector)"]
        end
    end

    Admin --> Auth
    Pro --> Auth
    Consumer --> Auth
    Auth --> PrescEngine
    PrescEngine --> SQLAlchemy
    PaperSearch --> SQLAlchemy
    QA --> ChromaDB

라우팅 구조

URL 패턴 대상 서비스 접근 권한
/login Public 모두
/admin/login Admin Login 모두
/auth/callback OAuth Callback 모두
/admin/* Admin Console super_admin
/pro/* Professional App doctor, nurse, lab_tech, hospital_admin
/app/* Consumer App 인증된 사용자
/analytics/* Analytics Dashboard 모두 (공개)
/ai/consult AI 상담 모두 (공개)
/ai/insight AI 인사이트 모두 (공개)
/subscribe 뉴스레터 구독 모두 (공개)
/report 알러지 리포트 모두 (공개)

2.3 데이터 흐름도 (Data Flow)

진단 → 처방 → 임상 보고서 흐름

sequenceDiagram
    participant 의료진
    participant Frontend
    participant Backend
    participant Database

    의료진->>Frontend: 1. 진단 입력
    Frontend->>Backend: 2. POST /api/pro/diagnosis
    Backend->>Backend: 3. 처방 엔진 + GRADE 평가
    Backend->>Database: 4. 저장
    Backend->>Frontend: 5. 처방 권고 + 임상 보고서
    Frontend->>의료진: 6. 결과 표시

뉴스 파이프라인 흐름

sequenceDiagram
    participant Scheduler as Scheduler (APScheduler)
    participant News as News Service
    participant DB as Database

    Scheduler->>News: 1. CRON 트리거
    News->>News: 2. Google/Naver News 크롤링
    News->>News: 3. Gemini/LLM 관련도 분석
    News->>DB: 4. 뉴스 저장
    News->>News: 5. 뉴스레터 생성
    News-->>DB: 6. Email 발송 기록

RAG 기반 AI 상담 흐름

sequenceDiagram
    participant 사용자
    participant Frontend
    participant Backend
    participant ChromaDB

    사용자->>Frontend: 1. 질문 입력
    Frontend->>Backend: 2. POST /api/ai/consult/ask
    Backend->>ChromaDB: 3. 벡터 검색
    ChromaDB->>Backend: 4. 관련 논문
    Backend->>Backend: 5. Gemini 답변 생성
    Backend->>Frontend: 6. 답변 + 출처
    Frontend->>사용자: 7. 결과 표시

2.4 기술 스택 (Tech Stack)

계층 기술 버전 용도 선택 이유
Runtime Python 3.10+ 서버 런타임 생산성, AI/ML 생태계
Framework FastAPI 0.115 Web API 비동기, 타입 힌트, 자동 문서화
ORM SQLAlchemy 2.0 DB 접근 유연성, 성숙도
Validation Pydantic 2.9 데이터 검증 FastAPI 통합
Auth PyJWT 2.9 JWT 토큰 표준, 간편함
Auth google-auth 2.0+ Google OAuth ID 토큰 검증
HTTP HTTPX 0.27 외부 API 호출 비동기 지원
Vector DB ChromaDB 0.5+ RAG 임베딩 검색 경량, 내장 가능
AI OpenAI 1.12 GPT API 텍스트 분석
AI Gemini API - 뉴스 분석, RAG 답변 비용 효율
AI Local LLM - 번역, 알러젠 추출 비용 절감, 프라이버시
Scheduler APScheduler 3.10+ 주기적 작업 Python 네이티브
Email aiosmtplib 3.0+ 뉴스레터 발송 비동기 이메일
Template Jinja2 3.1+ 이메일 템플릿 표준
Rate Limit slowapi 0.1.9 API 제한 FastAPI 통합
PDF PyMuPDF 1.23 PDF 파싱 속도, 품질
계층 기술 버전 용도 선택 이유
Framework React 18 UI 라이브러리 생태계, 컴포넌트 기반
Build Vite 5 번들러 빌드 속도, HMR
Routing React Router 6 클라이언트 라우팅 표준
HTTP Axios 1.6+ API 통신 인터셉터, 에러 처리
Charts Recharts 2.10 차트/시각화 React 네이티브
State Context API - 전역 상태 단순함, 내장
기술 버전 용도 선택 이유
PostgreSQL 15+ 주 데이터베이스 ACID, JSON 지원, 확장성
ChromaDB 0.5+ 벡터 DB (RAG) 내장 가능, Python 네이티브
기술 용도 비고
Docker Compose 컨테이너 오케스트레이션 3 서비스 (frontend, backend, scheduler)
Nginx 리버스 프록시 + SPA 타임아웃/버퍼링 최적화
GitHub Actions CI/CD Self-hosted Runner (macOS)

2.5 LLM 이중 아키텍처

구성

graph LR
    subgraph "Gemini API (Cloud, High Quality)"
        G1["뉴스 분석<br/>관련도 평가"]
        G2["RAG 답변 생성"]
        G3["AI 상담 답변"]
        G4["인사이트 생성"]
    end

    subgraph "Local LLM (Self-hosted, Fast)"
        L1["한→영 번역"]
        L2["알러젠 코드 추출"]
        L3["텍스트 정규화"]
    end

    App[AllergyInsight Backend] --> G1
    App --> G2
    App --> G3
    App --> G4
    App --> L1
    App --> L2
    App --> L3

환경 변수

변수 설명 기본값
GEMINI_API_KEY Gemini API 키 -
NEWS_LLM_PROVIDER 뉴스 분석 제공자 gemini
RAG_LLM_PROVIDER RAG 답변 제공자 gemini
LLM_API_URL Local LLM 엔드포인트 http://host.docker.internal:11435/v1
LLM_MODEL Local LLM 모델명 mlx-community/EXAONE-3.5-7.8B-Instruct-4bit

환경 변수 보안

API 키와 엔드포인트 정보는 .env 파일에만 저장하고, 소스코드에 하드코딩하지 마세요.


2.6 인프라 구성

운영 환경

graph TB
    subgraph "Production Server (MacBook Docker) 172.30.1.72"
        FE[Frontend :4040]
        BE[Backend :9040]
        SC[Scheduler<br/>background]

        subgraph "database-network (외부 공유)"
            PG[(PostgreSQL<br/>shared)]
        end

        FE --> BE
        BE --> PG
        SC --> PG
    end

    VOL[/"Volumes:<br/>backend_downloads<br/>chromadb_data"/]
    BE --- VOL

네트워크 구성

네트워크 타입 용도
database-network external PostgreSQL 공유 (다른 서비스와 공유)
allergyinsight-network bridge 내부 서비스 간 통신

2.7 보안 아키텍처

인증 방식

방식 용도 엔드포인트
Google OAuth 소셜 로그인 (ID 토큰) /api/auth/google/verify
Simple Auth 간편 로그인 (이름 + PIN) /api/auth/simple/login
Email Auth 이메일 + 비밀번호 로그인 /api/auth/email/login
Admin Auth 관리자 전용 로그인 /api/auth/admin/login
JWT Token API 인증 Authorization: Bearer <token>

인가 (Authorization)

역할 Professional Consumer Admin Public APIs
비인증 ❌ ❌ ❌ ✅
patient ❌ ✅ ❌ ✅
doctor ✅ ✅ ❌ ✅
nurse ✅ ✅ ❌ ✅
lab_tech ✅ (제한적) ✅ ❌ ✅
hospital_admin ✅ ✅ ✅ (병원) ✅
admin ✅ ✅ ✅ ✅
super_admin ✅ ✅ ✅ ✅

보안 기능

기능 구현
Rate Limiting slowapi (60/min 기본, API별 개별 설정)
CORS 허용 Origin 명시 (allow_origins=["*"] 금지)
PII Masking 활동 로그에서 개인정보 마스킹
Activity Logging 미들웨어 기반 사용자 행동 추적
JWT Expiry 1440분 (24시간)

2.8 확장성 고려사항

현재 (Modular Monolith)

graph TB
    subgraph "AllergyInsight"
        Pro[Pro]
        Consumer[Consumer]
        Admin[Admin]
        Analytics[Analytics]
        AI[AI Portal]
        Newsletter[Newsletter]

        Core["Shared Core + Services"]

        Pro --> Core
        Consumer --> Core
        Admin --> Core
        Analytics --> Core
        AI --> Core
        Newsletter --> Core
    end

    Core --> PG[(PostgreSQL)]
    Core --> Chroma[(ChromaDB)]

Scheduler 분리 패턴

Scheduler 분리 전략

  • backend와 동일한 이미지를 사용하되, command 오버라이드로 스케줄러 모드 실행
  • API 서버의 부하와 스케줄러 작업을 분리
  • 독립적인 restart 정책

← 프로젝트 개요 | 다음: 도메인 모델 →