플랫폼
GRAMA
여러 기관의 교사 연수를 위한 AI 중심 학습 엔진이자 LMS로, Industrias Roland Print S.A.C.를 위해 개발했으며 2026년 6월부터 운영 중입니다. Google Gemini 기반 RAG 학습 어시스턴트, MCP 연동, 강의 콘텐츠 자동 생성 기능을 갖추었고, Row Level Security로 보호되는 멀티테넌트 PostgreSQL 스키마와 헥사고날/DDD 모듈러 모놀리스 위에 구축했습니다.
문제
Industrias Roland Print는 여러 기관의 교사를 위한 단일 연수 플랫폼이 필요했습니다. Moodle 같은 범용 LMS는 설정이 많이 필요했고, 그래도 고객이 원하는 맞춤 진도 규칙, 기관별 분석, AI 지원이 없었습니다. 과제는 하나의 배포로 여러 기관을 지원하고, 테넌트별 데이터를 분리하며, 제한된 인프라 예산으로 수만 명의 사용자까지 확장할 수 있는 운영 수준의 플랫폼을 만드는 것이었습니다.
주요 결정
12개의 바운디드 컨텍스트로 구성한 헥사고날 아키텍처와 DDD
강의, 진도, 평가, 분석, AI, 테넌시는 각각 다른 이유로 변경됩니다. 이를 모듈러 모놀리스 안의 바운디드 컨텍스트로 모델링하면 포트와 어댑터 뒤에서 도메인 로직이 Next.js와 Supabase로부터 독립적으로 유지되어, 마이크로서비스의 운영 비용 없이 각 컨텍스트를 따로 테스트하고 발전시킬 수 있습니다.
애플리케이션 코드만이 아닌 Row Level Security로 보장하는 멀티테넌시
여러 기관과 역할이 하나의 데이터베이스를 공유하면 WHERE 절 하나만 빠져도 테넌트 간에 데이터가 새어 나갈 수 있습니다. Row Level Security 정책은 호출자의 기관과 역할 밖에 있는 행을 PostgreSQL 자체가 거부하게 만들고, 모든 서버 액션은 클라이언트가 보낸 값을 믿지 않고 세션에서 역할을 다시 확인합니다. 스키마는 사용자 30,000명, 동시 접속 최대 8,000명 규모로 설계했고 k6 부하 테스트로 검증했습니다.
RAG 어시스턴트를 위해 같은 Postgres 인스턴스에서 pgvector 사용
별도의 벡터 데이터베이스를 쓰면 프로비저닝하고 보안을 관리하고 비용을 내야 하는 서비스가 하나 더 늘어납니다. 임베딩은 항상 수강 정보나 테넌트 같은 관계형 데이터와 함께 조회되므로, Postgres에 두면 어시스턴트가 유사도 검색과 권한 확인을 같은 RLS 정책 아래에서 하나의 쿼리로 처리할 수 있습니다.
PostgreSQL 집계와 RPC 기반 분석
기관별 대시보드는 많은 사용자의 이수 및 진도 데이터를 집계합니다. 이 집계를 데이터베이스 안에서 계산하고 RPC로 노출하면 원시 행을 서버로 보내지 않아도 되고, 무거운 쿼리를 데이터 가까이에서 플랫폼의 나머지 부분과 같은 접근 규칙 아래 실행할 수 있습니다.
읽기는 Server Components로, 클라이언트 상태는 꼭 필요한 곳에만
서버에서 이미 데이터를 가져온 상태로 페이지를 렌더링하면 로딩 폭포가 생기지 않아 교사들이 완성된 페이지를 바로 볼 수 있습니다. 클라이언트 상태는 퀴즈 제출, 진도 업데이트, 스트리밍 어시스턴트처럼 상호작용이 필요한 흐름에만 사용했습니다.
결과
GRAMA는 2026년 6월부터 운영 중이며 여러 기관의 교사 연수를 지원하고 있습니다. 기능을 넘어, 이 프로젝트를 통해 신뢰성이 초기에 내린 결정에서 얼마나 많이 나오는지 배웠습니다. 명확한 도메인 경계, 데이터베이스에서 적용하는 보안, 실제 트래픽이 오기 전의 부하 테스트가 그것입니다.
기능
아키텍처
- 12개의 바운디드 컨텍스트로 구성된 헥사고날 / DDD 모듈러 모놀리스
- 역할 기반 접근과 Row Level Security를 갖춘 멀티테넌트 스키마
- 사용자 30,000명, 동시 접속 최대 8,000명 규모로 설계, k6로 부하 테스트
- 멱등성 있는 로더로 기존 데이터 이전
AI 계층
- 스트리밍과 도구 호출을 지원하는 Google Gemini 기반 RAG 학습 어시스턴트
- 수강 정보와 테넌트 범위로 제한된 pgvector 시맨틱 검색
- MCP 연동
- 강의 콘텐츠 자동 생성
학습 엔진
- 여러 콘텐츠 유형을 지원하는 강의 → 모듈 → 레슨 → 항목 구조
- 순차 진행: 이전 레슨을 마쳐야 다음 레슨이 열림
- 진도 업데이트와 연동된 자동 채점
분석 및 인프라
- PostgreSQL 집계와 RPC 기반 분석 모듈
- Supabase(PostgreSQL, Auth, Storage)와 함께 Vercel에 배포
- Cloudflare DNS 및 엣지 캐싱