Lumie 플랫폼의 전체 기술 스택을 레이어별로 정리합니다.
GitOps 워크플로우
레이어별 기술 스택
백엔드
| 항목 | 기술 | 비고 |
|---|
| 언어 | Java 21 | Eclipse Temurin, Virtual Threads |
| 프레임워크 | Spring Boot 3.4.13 | WebMVC |
| 모듈화 | Spring Modulith 1.4.4 | JDBC outbox 이벤트 발행 |
| 빌드 | Gradle (Kotlin DSL) | 멀티 모듈 |
| ORM | Spring Data JPA / Hibernate | 멀티테넌트 스키마 분리 |
| 아키텍처 | 모듈러 모놀리스 | libs/internal-api 인-프로세스 호출 |
| 보안 | Spring Security | JWT 검증, CORS, 인가 |
| 메시징 | Spring AMQP (RabbitMQ) | 비동기 이벤트 |
| 캐시/세션 | Spring Data Redis | Redis Sentinel |
| 파일 저장 | AWS S3 SDK | MinIO 엔드포인트 |
| API 문서 | SpringDoc OpenAPI 2.7.0 | /v3/api-docs |
| 스케줄러 잠금 | ShedLock 5.16.0 | 멀티파드 안전 스케줄링 |
| 헬스 체크 | Spring Actuator | Liveness / Readiness |
| 배포 단위 | lumie-backend.jar | lumie-backend NS, 3 replicas |
프론트엔드
| 항목 | 기술 | 비고 |
|---|
| 프레임워크 | Next.js 16.2 (App Router) | 로컬 npm run dev 전용, 클러스터 배포 금지 |
| 언어 | TypeScript 5 | strict mode |
| 서버 상태 | TanStack Query (React Query) | 캐시, 낙관적 업데이트 |
| 클라이언트 상태 | Zustand | 전역 UI 상태 |
| 스키마 검증 | Zod | Form 검증, API 타입 안전성 |
| API 클라이언트 | orval (OpenAPI codegen) | BE openapi.json → 타입 자동 생성 |
| 스타일 | Tailwind CSS | 커스텀 브레이크포인트 (smalltablet, tablet, desktop) |
| 아키텍처 | Feature-Sliced Design (FSD) | shared → entities → features → widgets → app |
Worker 서비스
| 서비스 | 기술 | 역할 |
|---|
grading-svc | FastAPI, Python 3.11, OpenCV, NumPy | OMR 이미지 채점 (KEDA RabbitMQ 오토스케일링) |
report-svc | FastAPI, Python 3.11, Playwright | 성적표 PDF 생성 |
analysis-svc | FastAPI, Python 3.11 | 학습 데이터 LLM 코멘터리 |
chatbot-svc | FastAPI, Python 3.11, LangGraph 0.3.5, Gemini 2.5 Flash | AI 챗봇 (대화 그래프 + Postgres checkpoint) |
데이터베이스 / 메시징
| 컴포넌트 | 기술 | 비고 |
|---|
| 주 데이터베이스 | PostgreSQL (CloudNativePG Operator) | 멀티테넌트 스키마 분리 |
| 커넥션 풀 | CNPG Pooler (PgBouncer 기반) | CNPG operator-native Pooler CRD |
| 캐시/세션 | Redis Sentinel | mymaster |
| 메시지 브로커 | RabbitMQ (RabbitMQ Operator) | 비동기 이벤트, topology User CR |
| 오토스케일링 | KEDA | RabbitMQ 큐 길이 기반 파드 스케일링 |
| 파일 저장소 | MinIO | S3 호환 오브젝트 스토리지 |
인프라 / 오케스트레이션
| 컴포넌트 | 기술 | 비고 |
|---|
| 컨테이너 오케스트레이션 | K3s | 1 master + 3 workers on OCI (0213/0214) |
| GitOps | ArgoCD | lumie-infra 레포 단일 진실 공급원 |
| CI/CD | Tekton Pipelines | 단일 백엔드 파이프라인, worker 경로별 파이프라인 |
| 이미지 레지스트리 | Zot | zot.lumie-infra.com, OCI 표준, CF proxy off |
| Ingress | Traefik | K3s 내장, StripPrefix Middleware |
| TLS | cert-manager + Let's Encrypt | 자동 발급/갱신 |
| 시크릿 관리 | HashiCorp Vault + VSO | Vault Secrets Operator로 K8s Secret 동기화 |
| 접근 제어 | Teleport | SSH, K8s API, 앱 접근 제어 (mTLS) |
| SSO | Keycloak | OAuth2 / OIDC Provider |
| 백업 | Velero | PVC 정기 백업 (MinIO 대상) |
관측성
| 컴포넌트 | 역할 |
|---|
| OpenTelemetry Collector | 메트릭·트레이스·로그 수집 |
| Prometheus | 메트릭 수집, 알림 규칙 |
| Thanos | 장기 메트릭 저장 (MinIO 백엔드) |
| Grafana | 대시보드, 시각화 |
| Loki | 로그 집계 |
| Tempo | 분산 트레이싱 |
| Alertmanager | 알림 라우팅 |
| 컴포넌트 | 역할 |
|---|
| Traefik | TLS 종단, 외부 트래픽 제어 |
| Spring Security | JWT 검증, CORS, 애플리케이션 인가 |
| HashiCorp Vault | 시크릿 중앙 관리 |
| Kyverno | K8s 정책 엔진 |
| Falco | 런타임 이상 행위 탐지 |
| Trivy | 컨테이너 이미지 취약점 스캔 |
| cert-manager | TLS 인증서 자동 관리 |
설계 원칙
1. Everything as Code
모든 인프라와 설정은 Git에서 관리됩니다.
- 인프라: Kubernetes YAML (Kustomize)
- 설정:
common-values.yaml
- 시크릿: External Secrets Operator (Vault 연동)
- 모니터링: Prometheus Rules as Code
2. GitOps First
lumie-infra 레포지토리가 단일 진실 공급원입니다. 직접 kubectl apply를 사용하지 않으며, 모든 변경은 PR → merge → ArgoCD 자동 동기화 흐름을 따릅니다.
3. 멀티테넌시
PostgreSQL 스키마 기반 멀티테넌시를 사용합니다. 테넌트별 스키마가 격리되며 PgBouncer가 커넥 션을 관리합니다.
4. 관측성 우선
모든 서비스는 OpenTelemetry SDK를 통해 트레이스를 내보냅니다. Spring Boot Actuator 엔드포인트로 Liveness/Readiness를 제공합니다.
기술 선택 배경
| 결정 | 이유 |
|---|
| 마이크로서비스 → 모듈러 모놀리스 | 10개 서비스 운영 복잡성 감소, 배포 단순화, in-process 호출로 gRPC 제거 |
| Kong → Traefik | K3s 내장 컴포넌트 활용, 별도 Kong 운영 비용 제거, JWT/CORS를 애플리케이션 레벨로 통합 |
| 10개 파이프라인 → 단일 파이프라인 | 백엔드 전체가 하나의 JAR로 빌드되므로 파이프라인도 통합 |
gRPC → libs/internal-api | 모놀리스 내 in-process 호출로 네트워크 오버헤드 제거, protobuf 의존성 제거 |