Polaryx는 교육기관을 위한 멀티테넌트 학습관리시스템(Learning Management System)입니다. Slack과 유사한 직관적인 인터페이스를 제공하며, 교육기관별 독립적인 데이터 관리와 확장 가능한 아키텍처를 통해 효율적인 온라인 교육 환경을 구축합니다.
서비스 주소: https://polaryx.net기술 문서: 📚 기술 문서 참조
- 멀티테넌트 아키텍처: 교육기관별 비즈니스 로직, 데이터 분리
- 역할 기반 접근 제어(RBAC): 개인/그룹 단위의 세분화된 권한 관리
- 확장 가능한 시스템 설계: DDD 기반 레이어드 아키텍처 적용
- 실시간 협업: Slack 스타일의 직관적인 사용자 경험
- 자동화된 배포: CI/CD 파이프라인을 통한 안정적인 서비스 운영
- 워크스페이스: 교육기관별 독립적인 학습 공간
- 탭: 카테고리 (Anouncements / Courses / Channels / DirectMessage)별 구분 단위
- 서브탭: 탭 내 세부 분류 (추후 도입 예정)
- 실시간 채팅: WebSocket 기반 실시간 메시지 전송/수신
- 리치 텍스트 에디터: TipTap 기반 다양한 형식 지원 (굵게, 기울임, 링크 등)
- 파일 업로드: 이미지, 문서 첨부 기능 (AWS S3 연동)
- 이모지 반응: 체크, 박수, 좋아요, 기도, 반짝 이모지로 빠른 피드백
- 메시지 편집/삭제: 실시간 메시지 수정 및 삭제 기능
- 무한 스크롤: 페이지네이션 기반 메시지 히스토리 로딩
- 4단계 권한 체계:
- Admin: 시스템 전반에 대한 관리 및 설정
- Instructor: 공지, 학습자료 관리 및 협업 활동
- Student: 학습자료 열람, 과제 제출 및 협업 활동
- Guest: 미등록 사용자에 대한 제한적 접근
- 그룹 관리: 그룹별 권한 설정
- 세분화된 접근 제어: 페이지/기능별 권한 설정
- 사용자 관리: 회원 등록, 역할 할당, 프로필 관리
- 그룹 관리: 교육생 등록, 탭 초대 등 그룹 단위 관리 가능
- 역할 관리: 커스텀 역할 생성 및 권한 설정
- Excel 일괄 업로드: 사용자 정보 대량 등록 기능
- Canvas (Notion 연동): 외부 Notion 페이지 임베딩
- 링크 저장소: 중요 링크 수집 및 공유
- 검색 기능: 메시지, 사용자, 콘텐츠 통합 검색
- 저장된 메시지: 중요 메시지 북마크 기능 (추후 도입 예정)
- 실시간 알림: SSE(Server-Sent Events) 기반 워크스페이스별/탭별 신규 메세지 즉시 알림
- 푸시 알림: PWA 기반 브라우저 푸시 알림
- 활동 분석: 사용자별 참여도 및 메시지 통계
- 워크스페이스 현황: 전체 활동 현황 대시보드
- WebSocket 연결: 실시간 메시지 송수신
- 자동 재연결: 연결 끊김 시 자동 재연결
- 출석 상태: 출석 시 컬러 화면으로 활성화 (추후 도입 예정)
- 온라인 상태: 사용자 접속 상태 표시 (추후 도입 예정)
Frontend
TypeScript- 타입 안정성 보장Next.js- Node.js 백엔드 없이 FastAPI 직접 연동, App Router 기반 파일 시스템 라우팅으로 개발 생산성 향상Tailwind CSS- 일관된 디자인 시스템과 빠른 UI 개발Zustand- 워크스페이스, 탭 상태와 실시간 메시지 상태에 대한 효율적 관리
Backend
Python- 빠른 프로토타이핑에 최적화FastAPI- WebSocket 실시간 통신 및 비동기 처리 지원Redis- Pub/Sub 기반 메시지 큐, 멀티 서버 환경에서 실시간 메시지 동기화 및 세션 관리
Database
MySQL- ACID 트랜잭션 보장으로 멀티테넌트 환경에서 데이터 정합성 확보, JOIN 기반 복잡한 관계형 데이터 처리에 최적화
Infrastructure & DevOps
Docker&Docker Compose- 멀티 서비스 컨테이너화를 통한 로컬 개발환경과 프로덕션 환경 일관성 보장- AWS
EC2- ECS 대신 직접 서버를 관리하며 인프라 전반에 대한 학습ECR- 도커 이미지 버전 관리 및 저장소ALB- HTTP/HTTPS 트래픽 처리에 최적화된 L7 로드밸런서ASG- 스텝 스케일링 정책 기반 리소스 관리S3- 정적 파일 저장소
GitHub Actions- 브랜치 전략 기반 자동화된 CI/CD 파이프라인
├── BE/ # 백엔드 (FastAPI)
│ ├── app/
│ │ ├── core/ # 핵심 설정 및 유틸리티
│ │ ├── domain/ # 도메인 모델 (DDD)
│ │ ├── repository/ # 데이터 접근 계층
│ │ ├── service/ # 비즈니스 로직 계층
│ │ ├── router/ # API 라우터 (인터페이스 계층)
│ │ └── schema/ # API 스키마 정의
│ └── sql/ # 데이터베이스 스키마
├── FE/ # 프론트엔드 (Next.js)
│ ├── app/ # App Router
│ ├── components/ # 재사용 컴포넌트
│ ├── hooks/ # 커스텀 훅
│ ├── store/ # 상태 관리
│ └── apis/ # API 클라이언트
└── .github/workflows/ # CI/CD 파이프라인
📑 2. API 명세서 링크
🔄 3. 시퀀스 다이어그램 (BE/docs/sequence/)
- WebSocket 핸드셰이크: 클라이언트 연결 및 세션 등록 과정
- 메시지 브로드캐스트: Redis Pub/Sub 기반 다중 서버 메시지 동기화
🧪 4. WebSocket 성능 테스트 결과 (BE/docs/test/)
- 테스트 도구: K6
- 프로토콜: WebSocket (실시간 메시징)
- 서버 구성: Redis Pub/Sub 기반 멀티 서버 아키텍처
-
1️⃣ Smoke 테스트
- 동시 사용자: 20 VUS
- 총 세션 수: 39개
- 연결 성공률: 100% (39/39)
- 평균 연결 지연시간: 64ms
- 메시지 처리: 756개 송신, 10,419개 수신
- 검증 목적: 기본적인 WebSocket 연결 및 메시지 송수신 안정성
- 테스트 결과
-
2️⃣ Load 테스트
- 동시 사용자: 400 VUS
- 총 세션 수: 15,598개
- 연결 성공률: 99.9% (15,587/15,598)
- 평균 연결 지연시간: 1,083ms
- 검증 목적: 일반적인 사용자 부하를 가정하여 빈번한 연결/해제 상황에서의 시스템 안정성
- 테스트 결과
-
3️⃣ Soak 테스트
- 동시 사용자: 1,200 VUS
- 총 세션 수: 9,636개
- 테스트 시간: 842초 (약 14분)
- 연결 성공률: 100% (9,636/9,636)
- 메시지 처리: 278,118개 송신, 5,435,263개 수신
- 검증 목적: 고부하 상황에서의 장시간 안정성 검증
- 테스트 결과
| 유형 | 동시 사용자 (VUS) |
연결 성공률 |
평균 지연시간 |
p(95) 지연시간 |
메시지 처리량 |
|---|---|---|---|---|---|
| Smoke | 20 | 100% | 64ms | 187ms | 송신: 756 수신: 10,419 |
| Load | 400 | 99.9% | 61ms | 89ms | 송신: 15,695 수신: - |
| Soak | 1,200 | 100% | 3,020ms | 9,790ms | 송신: 278,118 수신: 5,435,263 |
- Domain-Driven Design 원칙을 적용한 모듈화된 백엔드 구조 설계
- Router, Service, Domain, Repository 계층 분리로 관심사 분리 및 유지보수성 향상
- 팀 공통 개발 방식 표준화를 위한 코드 템플릿 및 컨벤션 구축
- Docker 컨테이너화를 통한 환경 일관성 보장
- 로드 밸런싱 및 오토 스케일링 고려한 인프라 설계
- GitHub Actions를 활용한 빌드/배포 자동화
- 워크스페이스별 데이터 및 비즈니스로직 분리 구현
- 교육기관 증가에 따른 수평적 확장 가능한 구조 설계
- RBAC(Role-Based Access Control) 모델 기반 개인 및 그룹별 세분화된 권한 체계 설계
- 페이지 단위 접근 제어 시스템 구축
- 동적 권한 할당
- 백엔드 API와 프론트엔드 연동 이슈 해결