| 항목 | 내용 |
| 기능 ID | FEAT-EMOTION |
| 연결 시스템 | 마스터 시스템⑦ 정서존엄 · ① 아리 대화(d01) 위에 구축 |
| 한 줄 정의 | 매일의 감정을 기록하고, 아리와의 대화에서 인생 이야기를 모아 자서전으로 엮는다 |
| 관련 액터 | PWA실벗서버아리 |
설계 철학 — 어르신의 인생은 한 권의 책입니다. 아리는 말벗이 되어주는 동시에, 대화 속 추억을 모아 자서전으로 남겨 존엄을 지킵니다.
▍설계 7계층 체크리스트
| 계층 | 이 문서의 섹션 |
| ① UI | 감정 기록 / 자서전 화면 SCR-EMO-01·02 |
| ② Flow | 감정 체크 → 말벗 대화 → 자서전 챕터 생성 |
| ③ Data | mood_logs / autobiography (확장) |
| ④ API | 감정 기록·자서전 조회·챕터 생성 |
| ⑤ Seq | 대화 → 추억 추출 → 자서전 챕터 집필 시퀀스 |
| ⑥ Comp | 감정·자서전 서비스 구조 |
| ⑦ Test | 검수 체크리스트 |
② Flow · 감정→대화→자서전
감정 체크→
아리 말벗 대화(d01)→
추억 신호 감지→
자서전 소재 적립→
챕터 자동 집필
아리는 대화 중 "옛날에…", "내가 젊을 때…" 같은 추억 신호를 감지하면 ari_memory(d01)에 mem_type=story로 적립. 일정량 모이면 챕터로 엮는다.
③ Data · DB 스키마
기존 mood_logs·autobiography 재활용. 자서전은 ari_memory(d01)의 story 타입을 원천으로 한다.
MariaDB · UTF8MB4 · InnoDB
CREATE TABLE mood_logs (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
mood TINYINT NOT NULL, -- 1(😢)~5(😊)
note VARCHAR(255),
logged_on DATE NOT NULL,
UNIQUE KEY uq_day (user_id, logged_on), -- 하루 1건
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE autobiography (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
chapter VARCHAR(80), -- '어린 시절','결혼'
body TEXT, -- 아리가 엮은 본문
photo_url VARCHAR(255),
source JSON, -- 근거가 된 대화/기억 id 목록
status ENUM('draft','published') DEFAULT 'draft',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
설계 포인트 — 챕터는 draft로 먼저 생성되고 어르신이 확인·수정 후 published. AI가 임의로 사실을 확정하지 않는다(존엄·정확성).
⑤ Seq · 대화 → 챕터 집필
아리
말벗 대화 중 추억 신호 감지 → ari_memory(mem_type=story) 적립
실벗 워커
story 기억이 임계치 도달 → POST autobiography/draft 트리거
DeepSeek
기억들을 따뜻한 1인칭 챕터로 집필 → draft 저장
실벗
"인생 이야기 한 편이 만들어졌어요" 알림
어르신
확인·수정 → published, 가족 공유/인쇄 주문
폴백 — LLM 집필 실패 시 기억은 그대로 보관되고 다음 주기에 재시도. 데이터 유실 없음.
⑥ Comp · 컴포넌트 / 모듈 구조
프론트엔드 (PWA)
features/emotion/
├─ MoodCheck.js # 이모지 기분 기록
├─ MoodChart.js # 주간 흐름
├─ BookView.js # 자서전 책
└─ ChapterEditor.js # 챕터 확인·수정
백엔드 (PHP)
app/
├─ Controllers/EmotionController.php
├─ Services/
│ ├─ MoodService.php
│ └─ AutobiographyWriter.php # ari_memory→챕터 집필(LLM)
└─ Jobs/ ChapterDraftJob.php # 임계치 도달 시 초안 생성
| 모듈 | 책임 |
AutobiographyWriter | d01의 ari_memory(story)를 입력으로 따뜻한 챕터를 집필. 항상 draft로만 생성(사실 확정 금지). |
⑦ Test · 검수 체크리스트
| ID | 시나리오 | 기대 결과 |
| T-01 | 오늘 기분 😊 탭 | mood_logs 하루 1건 저장, 주간 그래프 반영 |
| T-02 | 같은 날 기분 다시 기록 | upsert(덮어쓰기), 중복 행 없음 |
| T-03 | 대화에서 추억 언급 | ari_memory에 story 적립 |
| T-04 | story 임계치 도달 | 자서전 draft 챕터 자동 생성 + 알림 |
| T-05 | LLM 집필 실패 | 기억 보존, 다음 주기 재시도(유실 0) |
| T-06 | 챕터 수정 후 published | 가족 공유·인쇄 가능 상태로 전환 |
완료 판정 — T-01~T-06 통과 시 FEAT-EMOTION 완료. T-05(유실 0)와 draft-우선 원칙이 핵심.
기능설계 ⑥ 완성 — 말벗과 자서전을 7계층으로 설계했습니다. d01의 ari_memory를 그대로 재활용해 인생을 한 권의 책으로 남깁니다.