B2B 화상 회의 + AI 요약 + 알림 서비스 (MSA w/ Spring Boot 3 & Kotlin)
Current Version: v0.4.9 | Deployed: api.onmeet.cloud
- Language: Kotlin (Auth/Gateway), Java (AI/Video/Notification/Email), Go (File)
- Framework: Spring Boot 3.3.5, Spring Cloud 2023.x, Gin (Go)
- Build Tool: Gradle (Kotlin DSL), Go Modules
- Shared Libraries:
onmeet-common,common-security(Kotlin)
- Architecture: 마이크로서비스 아키텍처 (MSA)
- Gateway: Spring Cloud Gateway (WebFlux)
- Communication: REST API, Kafka (이벤트 기반)
- Database: MySQL 9.0 (대부분), PostgreSQL 16 (File Service), Redis (인증/캐싱)
- File Storage: MinIO (S3 호환) + Nginx 프록시 서빙
- Deployment: GCP VM (e2-standard-4) + Docker Compose + GitHub Actions CI/CD
- DNS/CDN: Cloudflare (DNS 프록시, Pages)
| 항목 (Metric) | 이전 (Kotlin/Spring) | 이후 (Go/Gin) | 개선율 (Improvement) |
|---|---|---|---|
| 빌드 속도 (Build Time) | 31.5s | 8.5s (Gradle 캐시 적용 시) | 73% 단축 |
| 이미지 크기 (Image Size) | ~450MB | ~25MB | 94% 감소 |
| 메모리 점유 (Memory) | ~512MB (JVM 최소) | ~20MB | 96% 감소 |
| API 응답 (Health Check) | 10ms ~ 50ms | 39µs ~ 300µs | 약 100배 이상 빨라짐 |
| 파일 처리 방식 | Blocking/Thread-pool | Goroutine 기반 비동기 | 동시 처리 용량 대폭 상승 |
| 데이터베이스 (DB) | MySQL 9.0 | PostgreSQL 16 (JSONB) | 유연한 메타데이터 구조 확보 |
- Gradle 빌드 최적화: Parallel Build, Configuration Cache 적용 (기본 31.5s -> 8.5s로 약 73% 개선)
- Google Jib 도입: Dockerfile 없이 변경된 레이어만 효율적으로 빌드하여 이미지 생성 시간을 혁신적으로 단축
- Go & PostgreSQL 전환: I/O 집약적인
file-service를 Go로 전환하고, PostgreSQL JSONB를 통해 비정형 메타데이터를 효율적으로 관리합니다. - Cache: Redis (인증, 세션 관리)
- Authentication: JWT (Access/Refresh Token) + Cookie (HttpOnly)
- Authorization: 역할 기반 접근 제어 (Admin, User)
| 서비스 (Service) | 포트 (Port) | 언어 (Language) | 설명 (Description) | DB |
|---|---|---|---|---|
| Gateway Service | 8080 |
Kotlin | API 진입점, 라우팅, JWT 검증 | - |
| Auth Service | 8081 |
Kotlin | 사용자 인증, 토큰 관리, 팀/기업 관리 | MySQL, Redis |
| AI Service | 8082 |
Java | AI 요약 생성 (STT/LLM) | MySQL |
| Video Service | 8083 |
Java | 화상 회의 관리, WebRTC 시그널링 | MySQL |
| Notification Service | 8085 |
Java | 실시간 알림 (SSE) | MySQL |
| File Service | 8086 |
Go | 파일 업로드/다운로드, S3, 프로필 이미지 | PostgreSQL |
| Email Service | 8087 |
Java | 이메일 발송 (Gmail SMTP OAuth2) | - |
참고: File Service는 성능 최적화를 위해 Kotlin에서 Go로 전환되었으며, 약 100배 이상 빠른 API 응답 속도를 달성했습니다.
- Auth Service API: 인증, 사용자, 팀, 기업 관리 API
- AI Service API: AI 요약 생성 API
- Video Service API: 화상 회의 관리 API
- Notification Service API: 실시간 알림 API
- File Service API: 파일 업로드/다운로드 API
- Email Service API: 이메일 발송 API
- 로그인 & 테스트 가이드: 로컬 인증 테스트 방법
- File Service 사용 가이드: 파일 업로드/다운로드 사용법
- 공통 모듈 가이드:
onmeet-common사용법 - Gateway 라우팅 설정: API Gateway 라우팅 규칙
- Git 워크플로우: 브랜치 전략 및 배포 프로세스
- JDK 21 이상
- Docker & Docker Compose
최신 빌드 방식(Jib)이 적용되어, 이미지 빌드 후 실행해야 합니다.
# 1. Docker 이미지 빌드 (Jib) - 약 30초 소요
./gradlew jibDockerBuild --parallel
# 2. 전체 서비스 실행 (이미지 Pull 없이 로컬 이미지 사용)
docker compose up -d
# 3. 로그 확인
docker compose logs -f auth-service gateway-service특정 서비스만 실행할 때도 이미지 빌드가 선행되어야 합니다.
# 1. 특정 서비스만 빌드 (예: Auth Service)
./gradlew :auth-service:jibDockerBuild
# 2. 필요한 서비스 실행 (의존성 포함 자동 실행)
docker compose up -d gateway-service auth-serviceIntelliJ에서 개발할 때는 인프라만 Docker로 띄우고, 서비스는 IDE에서 실행하는 것이 디버깅에 유리합니다.
1. 기반 인프라 실행 데이터베이스, Kafka, Redis 등 필수 인프라를 실행합니다.
docker compose up -d mysql-auth redis-auth kafka zookeeper mysql-ai mysql-video mysql-notification postgres-file2. 서비스 실행 (IntelliJ)
- 프로젝트 창에서 각 서비스의
Application.kt(예:AuthApplication.kt)를 우클릭하여 **Run 'AuthApplication'**을 선택합니다. - 환경 변수(
EnvFile플러그인 또는 Run Configuration)가 필요한 경우 설정합니다.
3. (선택) IntelliJ에서 Docker 이미지 빌드 터미널 명령어 대신 IDE UI를 사용할 수 있습니다.
- 우측 Gradle 탭 > Tasks > jib > jibDockerBuild 더블 클릭
이 프로젝트는 민감한 정보와 환경별 설정을 위해 **환경 변수(Environment Variables)**를 사용합니다.
application.yml의 기본값은 로컬 개발 환경에 맞춰져 있습니다.
루트 디렉토리에 .env 파일을 생성하여 관리할 수 있습니다. (로컬 개발 시 선택 사항)
# 전역 설정
SERVER_PORT=8080
SPRING_PROFILES_ACTIVE=local
# 보안 (Security)
JWT_SECRET_KEY=your-secret-key-must-be-long-enough
AUTH_ENCRYPTION_KEY=encryption-key
GATEWAY_SHARED_SECRET=shared-secret-for-internal-auth
# 쿠키 설정
COOKIE_SAMESITE=Lax # 크로스사이트 환경(프로덕션)에서는 None으로 설정
COOKIE_SECURE=true
# 데이터베이스 (전역 또는 서비스별)
DB_ROOT_PASSWORD=root
DB_USERNAME=root
# AWS (S3/CloudFront - file-service)
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
# Gmail OAuth2 (email-service)
GMAIL_CLIENT_ID=...
GMAIL_CLIENT_SECRET=...
GMAIL_REFRESH_TOKEN=...
SPRING_MAIL_USERNAME[email protected]각 서비스의 상세한 API 명세는 아래 링크 및 Swagger UI를 참조하세요.
| 서비스 (Service) | 경로 접두사 (Path Prefix) | API 명세서 (Reference) | Swagger UI |
|---|---|---|---|
| Gateway | / |
GATEWAY_ROUTES.md | Link |
| Auth | /auth/** |
API_REFERENCE.md | Link |
| AI | /ai/** |
API_REFERENCE.md | Link |
| Video | /video/** |
API_REFERENCE.md | Link |
| Notification | /notification/** |
API_REFERENCE.md | Link |
| File | /file/** |
API_REFERENCE.md | Link |
/email/v1/** |
API_REFERENCE.md | - |
GET /actuator/health(모든 서비스 공통)
- fix(auth): 비밀번호 변경 500 에러 수정 (DTO 필드명 불일치)
- fix(gateway): 비밀번호 찾기 API 화이트리스트 추가
- fix(video): 회의 생성/예약 500 에러 수정 (
@EnableJpaAuditing누락, auth URL config 키 수정) - fix(notification): actuator 경로 이중화 해소, Gateway 라우트 추가
- fix(notification): 미읽음 알림 수 응답을 타입별 분류 Map으로 변경
- 전 서비스 응답 포맷 통일 (
{ success: true, data: T }) - GCP VM 업그레이드 (e2-standard-4)
- AI 회의록 요약 기능
- STT 연동
- 화상 회의 기능 (LiveKit WebRTC)
- 실시간 채팅
- 초기 MVP (인증, 기업/팀 관리)