Skip to content

Repository files navigation

이룸 (ELUM)

최신 버전 : v2.11.0 (2026-10-01)

2026년 장애인 분야 해커톤 대회 「장애 플러스 기술」 · 분야 1 디지털 포용 · 팀 룸룸(LUMLUM)

보호자가 자연어로 입력한 일과를 AI가 아동 맞춤형 행동 카드(AI 생성 삽화 · 음성 안내 · 체크리스트)로 변환해, 발달장애 아동이 스스로 다음 행동을 이해하고 수행하도록 돕는 서비스.


우리가 푸는 문제

발달장애 아동에게 일상은 단순한 일정이 아니라 여러 행동을 순서대로 이해하고 실행해야 하는 과제다.

  • "외출 준비해", "병원에 갈 준비를 하자" 같은 말에는 옷 입기 → 가방 챙기기 → 신발 신기 → 이동 → 기다리기처럼 여러 단계가 숨어 있다.
  • 아동은 이런 지시를 한 번에 이해하거나 다음 행동을 스스로 예측하기 어렵다.
  • 기존 종이 그림 카드·고정 일정표로는 커버되지 않는다 — "가방을 챙겨요" 카드가 있어도 병원 갈 땐 진료카드, 등교할 땐 필통처럼 준비물이 상황마다 다르기 때문이다.
  • 이 세부 정보는 보호자의 생활 맥락 안에만 있어서, 결국 보호자가 매번 직접 단계를 나누고 이미지를 찾아야 한다.

솔루션

보호자가 자연어로 일과 입력
  ↓
AI DLP Gateway — 암호화 통신 · 민감정보 탐지·마스킹
  ↓
AI가 아동이 수행 가능한 작은 행동 단위로 분해
  ↓
맥락이 부족하면 AI가 보호자에게 먼저 질문
  ↓
단계별 삽화를 AI가 실시간 생성 (아이가 고른 캐릭터가 매 장면에 등장)
  ↓
보호자가 카드를 검토 · 수정 · 승인
  ↓
아동 화면: 삽화 + 짧은 문장 + TTS + 체크리스트 → 완료 시 별 보상

보호자용과 아동용은 별도 앱이 아니라 하나의 앱에서 PIN으로 모드를 전환한다.


핵심 차별점

1. 진단명 없는 개인화

진단명이나 장애 유형을 묻지 않아도, 아이에게 필요한 도움 방식만 선택하면 AI가 행동 카드의 구성 방식을 맞춘다.

민감정보를 더 수집해서 개인화하는 것이 아니라 최소한의 정보로 개인화한다. 개인화에 쓰는 값은 보호자가 고른 supportGoals(도움 목표) 4종뿐이다.

2. AI DLP Gateway — 2계층 입력 보호

아이를 이해하기 위해, AI가 아이의 개인정보까지 알 필요는 없습니다.

보호자의 입력이 생성형 AI에 도달하기까지 두 겹의 보호 계층을 통과한다. 데모용 연출이 아니라, 실제 프로덕션 수준의 암호화 프로토콜로 구현했다.

1계층 — 전송 구간 암호화 (클라이언트 ↔ 서버)

일과 입력처럼 민감할 수 있는 요청은 HTTPS 위에 한 겹 더, 요청 본문 자체를 암호화한다.

  • AES-256-GCM 본문 암호화 + HKDF-SHA256 요청별 키 파생 (RFC 5869)
  • HMAC-SHA256 서명 검증 · 타임스탬프 허용오차 검증 · Nonce 재사용(리플레이) 차단
  • Flutter 클라이언트가 암호화 봉투를 만들고, Spring 필터가 검증·복호화 후에만 통과시킨다

2계층 — 민감정보 탐지·마스킹 (서버 → 생성형 AI)

복호화된 원문은 외부 AI로 바로 가지 않는다. 팀 GPU 서버에서 직접 운영하는 Ollama 기반 내부 LLM이 이름 · 전화번호 · 주소 · 이메일 · 주민등록번호 · 계좌번호 · 생년월일 · 진단명 8개 카테고리를 탐지해 마스킹하고, 외부 AI에는 마스킹된 최소 정보만 전달한다.

  • 민감정보 판별 자체를 팀 내부 인프라 안에서 수행 — 원문은 외부로 나가지 않는다
  • 민감정보 판별 정확도를 높이기 위해 내부 LLM 모델·프롬프트 조합을 수십 차례 반복 테스트해 선정했다
  • 감사 로그에도 원문을 남기지 않는다. 탐지 유형·건수만 기록
  • 데모에서는 마스킹 전·후 문장을 나란히 보여줘 보호 과정을 눈으로 확인시킨다

3. 캐릭터 일관성 있는 AI 삽화 실시간 생성

카드 이미지는 미리 그려둔 그림이 아니다. 일과가 만들어질 때마다 AI가 단계별 삽화를 실시간 생성하며, 온보딩에서 아이가 고른 캐릭터(고양이 루루 · 여우 포포)의 참조 이미지를 매 요청에 첨부해 모든 카드에 같은 캐릭터가 등장하도록 만들었다.

  • 단계별 이미지는 Java 21 가상 스레드로 병렬 생성 — 카드가 여러 장이어도 빠르게 완성
  • 카드 텍스트는 JSON 스키마를 강제(responseSchema)해 파싱 오류를 원천 차단
  • 아이 입장에서는 "내 친구 루루가 우산을 쓰고 학교에 가는" 나만의 그림책이 된다

시스템 아키텍처

┌─────────────────────────────────────────────────────────┐
│  Flutter 앱 (Android · iOS)                              │
│  보호자 모드 ⇄ 아동 모드 (PIN 전환)                       │
│  · 요청 본문 AES-256-GCM 암호화 + HMAC 서명               │
│  · TTS: 기기 내장 우선, 서버 TTS 자동 전환                │
└──────────────────────┬──────────────────────────────────┘
                       │ 암호화 봉투 (ciphertext · iv · salt · nonce · signature)
┌──────────────────────▼──────────────────────────────────┐
│  Spring Boot 서버 — AI DLP Gateway 내장                  │
│  ① 복호화 필터: HMAC 검증 · 타임스탬프 · Nonce 차단        │
│  ② 민감정보 가드: 자체 호스팅 LLM이 8개 카테고리 마스킹     │
│  ③ 프롬프트 관리: DB 저장 + 관리자 페이지에서 실시간 튜닝   │
└───────┬──────────────────────────────┬──────────────────┘
        │                              │ 마스킹된 최소 정보만
┌───────▼───────────┐      ┌───────────▼─────────────────┐
│  내부 LLM (Ollama) │      │  Gemini API                  │
│  팀 GPU 서버 운영  │      │  · 행동 카드 생성 (JSON 스키마) │
│  민감정보 탐지 전담 │      │  · 추가 질문 생성              │
└───────────────────┘      │  · 단계별 삽화 생성            │
                           │    (캐릭터 참조 이미지 첨부,    │
                           │     가상 스레드 병렬 처리)      │
                           └─────────────────────────────┘
        ↓
  보호자 검토·승인 후에만 아동 화면 노출

생성형 AI와 맞닿는 지점은 Spring 내부의 AI DLP Gateway 하나뿐 — 우회 경로가 구조적으로 없다.

관리자 페이지 — 운영 도구까지 구현

Thymeleaf + daisyUI 기반 관리자 콘솔을 함께 구축했다. 회원·일과 조회는 물론, AI 프롬프트를 DB에서 관리하며 관리자 페이지에서 실시간 편집 → 실제 LLM 호출 테스트 → 반영까지 가능하다. 프롬프트 품질을 빠르게 반복 개선하는 핵심 도구다.


어떤 상황에서도 멈추지 않는다 — 안정성 설계

모든 기능이 실제로 동작하는 것을 전제로, 어떤 실패 상황에서도 아이의 화면이 깨지지 않도록 전 구간에 방어 계층을 더했다.

구간 안정성 설계
카드 생성 JSON 스키마 강제 + 응답 검증. 실패 시 명확한 에러 코드와 재시도 UI 제공
삽화 생성 실패 시 자동 재시도. 그래도 실패하면 해당 단계만 이미지 없이 진행 — 일과 전체를 살린다
추가 질문 AI 응답 이상 시 도움 목표 기반 대체 질문으로 즉시 전환
TTS 기기 내장 음성 우선, 한국어 음성이 없는 기기는 서버 TTS로 자동 전환
네트워크 오류 빈 화면·무한 로딩 금지. 상태 안내 + 재시도 버튼 + 에러 코드 노출

데모 시나리오

항목 값
아이 호칭 하늘이 (실명 아님)
도움 목표 PREPARE_ITEMS, PREPARE_NEW_SITUATIONS
입력 "내일 비가 많이 올 예정이야. 아이가 학교에 갈 수 있게 준비해야 해."
결과 "비 오는 날 학교 가기" 행동 카드 — 루루가 등장하는 AI 생성 삽화와 함께

핵심 장면 — AI DLP가 아동 이름과 학교명을 탐지·마스킹하고, 전송 전·후 문장을 나란히 보여준 뒤 최소화된 문장만 생성형 AI에 전달한다. 이어서 아이가 고른 캐릭터가 매 단계에 등장하는 삽화 카드가 실시간으로 생성된다.


품질 · 운영 현황

테스트

기능 구현으로 끝내지 않고 핵심 로직에 테스트를 붙였다. 서버 20개 + 클라이언트 43개 = 63개.

  • DLP 암호화·복호화 (AES-GCM · HKDF · Nonce 저장소)
  • 민감정보 가드, 프롬프트 템플릿, Gemini 요청·응답 계약
  • AI 파이프라인, 이미지 저장, 요청 쿨다운 가드
  • 클라이언트 화면·모델·API 계약 검증
  • 여기에 더해 내부 LLM(Ollama) 모델·프롬프트 조합을 반복 실측 테스트하며 민감정보 판별 품질을 끌어올렸다

배포 — 지금 실제로 돌아가고 있다

구성 상태
API 서버 https://api.elum.chuseok22.com — Docker Swarm 운영, 헬스체크 기반 무중단 관리
API 문서 Swagger 공개 (/docs/swagger) — 전체 엔드포인트 문서화 완료
앱 Android APK · iOS TestFlight 빌드 파이프라인 가동
DB PostgreSQL + Flyway 마이그레이션 (스키마 버전 관리)

기술 스택

영역 스택 비고
앱 Flutter · Dart · Riverpod · go_router 보호자 + 아동을 하나의 앱에서 PIN 모드 전환
서버 Spring Boot 4 · Java 21 AI DLP Gateway · 가상 스레드 병렬 이미지 생성
카드·삽화 생성 Gemini API JSON 스키마 강제 · 캐릭터 참조 이미지 기반 일관성 유지
민감정보 탐지 Ollama 내부 LLM (팀 GPU 서버) 원문이 외부로 나가지 않는 구조의 핵심
요청 보호 AES-256-GCM · HKDF · HMAC-SHA256 클라이언트-서버 간 본문 암호화 + 리플레이 차단
DB PostgreSQL · Flyway 사용자 · 일과 · 카드 · 프롬프트 템플릿
음성 안내 Flutter TTS + 서버 TTS 폴백 기기 음성 미지원 시 자동 전환
관리자 Thymeleaf · daisyUI 프롬프트 실시간 편집·테스트 콘솔
인프라 Docker Swarm · GitHub Actions · AWS EC2 워크플로우 18개 · 릴리스마다 자동 배포

프로젝트 구조

elum/
├── client/   # Flutter 앱 (보호자 모드 + 아동 모드)
├── server/   # Spring Boot 서버 (AI DLP Gateway · 관리자 페이지 포함)
└── docs/     # 기획 · 설계 문서

시작하기

client (Flutter)

cd client
cp .env.example .env    # 환경변수 설정
flutter pub get
flutter run

server (Spring Boot)

cd server
./gradlew bootRun

서비스 원칙

세부 구현은 바뀔 수 있지만, 아래는 서비스의 정체성이므로 유지한다.

  1. 진단명·장애 유형을 수집하지 않는다. 개인화는 supportGoals로만 한다.
  2. 보호자 입력 원문을 생성형 AI에 그대로 보내지 않는다. DLP에서 마스킹 후 최소 정보만 전달한다.
  3. AI 생성 결과는 보호자 승인 후에만 아동 화면에 노출한다.
  4. 한 카드에는 하나의 행동만 담는다.
  5. 원문을 감사 로그에 저장하지 않는다. 탐지 유형·건수만 저장한다.
  6. 어떤 실패 상황에서도 아이의 화면은 멈추지 않는다.
  7. 보상(강화물)은 보호자가 설정하고, 앱은 그것을 보여주고 상기시키기만 한다. 앱이 보상을 결정하지 않는다. 앱 내 별(⭐)은 성취 연출이고, 강화물은 보호자가 정한 현실의 보상(간식·놀이·산책)이다 — 둘은 다른 것이다.

문서

초기 기획·설계 과정이 궁금하다면 01번부터 순서대로 볼 것을 추천한다.

자문·회의 기록은 docs/meetings/, 대회 일정·제출 요건은 docs/hackathon/.

문서 내용
01-overview.md 서비스 개요, 페인포인트, 타겟, 핵심 가치
02-architecture.md 시스템 구성, 기술 스택, 저장소 구조
03-screens.md 전체 화면 플로우 + 페이지별 명세
04-ai-card-generation.md 도움 목표 기반 개인화, 프롬프트, 카드 형식
05-ai-dlp-gateway.md AI DLP Gateway 보안 설계
06-api-spec.md REST API 명세, 안정성 전략
07-mvp-scope.md MVP 구현 범위, 데모 시나리오

팀 룸룸 (LUMLUM)

3인이 기획 → 설계 → 구현 → 테스트 → 배포를 함께 맡고 있다.

팀원 역할
서새찬 PM · Frontend
백지훈 Backend · AI
이예람 UX/UI