2026년 장애인 분야 해커톤 대회 「장애 플러스 기술」 · 분야 1 디지털 포용 · 팀 룸룸(LUMLUM)
보호자가 자연어로 입력한 일과를 AI가 아동 맞춤형 행동 카드(AI 생성 삽화 · 음성 안내 · 체크리스트)로 변환해, 발달장애 아동이 스스로 다음 행동을 이해하고 수행하도록 돕는 서비스.
발달장애 아동에게 일상은 단순한 일정이 아니라 여러 행동을 순서대로 이해하고 실행해야 하는 과제다.
- "외출 준비해", "병원에 갈 준비를 하자" 같은 말에는 옷 입기 → 가방 챙기기 → 신발 신기 → 이동 → 기다리기처럼 여러 단계가 숨어 있다.
- 아동은 이런 지시를 한 번에 이해하거나 다음 행동을 스스로 예측하기 어렵다.
- 기존 종이 그림 카드·고정 일정표로는 커버되지 않는다 — "가방을 챙겨요" 카드가 있어도 병원 갈 땐 진료카드, 등교할 땐 필통처럼 준비물이 상황마다 다르기 때문이다.
- 이 세부 정보는 보호자의 생활 맥락 안에만 있어서, 결국 보호자가 매번 직접 단계를 나누고 이미지를 찾아야 한다.
보호자가 자연어로 일과 입력
↓
AI DLP Gateway — 암호화 통신 · 민감정보 탐지·마스킹
↓
AI가 아동이 수행 가능한 작은 행동 단위로 분해
↓
맥락이 부족하면 AI가 보호자에게 먼저 질문
↓
단계별 삽화를 AI가 실시간 생성 (아이가 고른 캐릭터가 매 장면에 등장)
↓
보호자가 카드를 검토 · 수정 · 승인
↓
아동 화면: 삽화 + 짧은 문장 + TTS + 체크리스트 → 완료 시 별 보상
보호자용과 아동용은 별도 앱이 아니라 하나의 앱에서 PIN으로 모드를 전환한다.
진단명이나 장애 유형을 묻지 않아도, 아이에게 필요한 도움 방식만 선택하면 AI가 행동 카드의 구성 방식을 맞춘다.
민감정보를 더 수집해서 개인화하는 것이 아니라 최소한의 정보로 개인화한다.
개인화에 쓰는 값은 보호자가 고른 supportGoals(도움 목표) 4종뿐이다.
아이를 이해하기 위해, 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 모델·프롬프트 조합을 수십 차례 반복 테스트해 선정했다
- 감사 로그에도 원문을 남기지 않는다. 탐지 유형·건수만 기록
- 데모에서는 마스킹 전·후 문장을 나란히 보여줘 보호 과정을 눈으로 확인시킨다
카드 이미지는 미리 그려둔 그림이 아니다. 일과가 만들어질 때마다 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 runserver (Spring Boot)
cd server
./gradlew bootRun세부 구현은 바뀔 수 있지만, 아래는 서비스의 정체성이므로 유지한다.
- 진단명·장애 유형을 수집하지 않는다. 개인화는
supportGoals로만 한다. - 보호자 입력 원문을 생성형 AI에 그대로 보내지 않는다. DLP에서 마스킹 후 최소 정보만 전달한다.
- AI 생성 결과는 보호자 승인 후에만 아동 화면에 노출한다.
- 한 카드에는 하나의 행동만 담는다.
- 원문을 감사 로그에 저장하지 않는다. 탐지 유형·건수만 저장한다.
- 어떤 실패 상황에서도 아이의 화면은 멈추지 않는다.
- 보상(강화물)은 보호자가 설정하고, 앱은 그것을 보여주고 상기시키기만 한다. 앱이 보상을 결정하지 않는다. 앱 내 별(⭐)은 성취 연출이고, 강화물은 보호자가 정한 현실의 보상(간식·놀이·산책)이다 — 둘은 다른 것이다.
초기 기획·설계 과정이 궁금하다면 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 구현 범위, 데모 시나리오 |
3인이 기획 → 설계 → 구현 → 테스트 → 배포를 함께 맡고 있다.
| 팀원 | 역할 |
|---|---|
| 서새찬 | PM · Frontend |
| 백지훈 | Backend · AI |
| 이예람 | UX/UI |