1. 설계 배경 및 개요
1.1. 왜 상태(Statement)를 테이블화하여 관리하는가?
1.
유연한 확장성
•
출석 체크, 수업도입, 수업마무리, 액티비티 피드백 등 “세션 유형”별로 관리해야 하는 데이터가 계속해서 늘어나고, 각각이 서로 다른 속성을 가질 수 있습니다.
•
고정 스키마 테이블을 계속 확장(예: 새로운 상태 키마다 컬럼 추가)하면 릴리스와 마이그레이션 리스크가 큽니다.
•
따라서, 상태(Statement)를 정의하는 구조(예: StatementDefinitionEntity)를 두면, 새로운 상태(키)만 등록해도 기존 시스템에 큰 영향 없이 확장 가능해집니다.
2.
다양한 ‘적용 범위(Scope)’
•
예: “유저 단위” 정보(name, grade), “그룹별” 정보(user_id + group_id), “특정 세션 인스턴스” 정보(user_id + session_instance_id) 등.
•
이러한 범위가 유연하게 바뀌고, 중첩·공존할 수 있으므로, StatementDefinition으로 개념을 관리하고, 실제 값은 나중에 별도 로직(또는 테이블)에 저장·조회하는 편이 낫습니다.
3.
AI/LLM 응답 결과와의 연동
•
세션 운영 중(attendance_check, lesson_introduction, activity_feedback 등) AI가 동적으로 생성·업데이트하는 상태(예: attendance_status, category_reason)가 있을 수 있습니다.
•
상태 키/값 구조로 관리하면, AI가 새로운 키를 제안하거나 기존 키에 값을 갱신하더라도 DB 구조 변경 없이 대응하기 수월합니다.
1.2. 왜 특정 세션부터 도입하는가?
•
일반적인 자동화 시나리오에서는 출석확인 → 수업도입 → 수업진행안내 → 유닛피드백 → 액티비티피드백 → 수업마무리 순으로 진행됩니다.
•
이번 개발 범위에서는 출석확인과 수업도입, 액티비티피드백만 우선 적용될 예정이며, 실제 선생님 화면에서는 출석확인과 액티비티피드백만 ON/OFF 선택이 가능하고, 수업도입은 출석확인이 ON인 경우 자동으로 실행됩니다.
2. 엔티티 설계
이번 범위에서는 StatementDefinitionEntity만 구체적으로 다루고,
AI가 실제 생성·저장하는 값(StatementValueEntity 등)은 이후 확장 시점에 문서를 별도로 작성할 예정입니다.
2.1. StatementDefinitionEntity
•
역할: 각 상태(Statement)에 대한 “메타 정보”를 정의하는 테이블.
◦
어떤 키인지(예: attendance_status), 어떤 데이터 타입인지, 어느 범위(세션 유형 등)에서 쓰이는지를 관리.
컬럼명 | 자료형 | 설명 |
key | VARCHAR(100) PRIMARY KEY | 상태 키 (예: attendance_status) |
description | TEXT NOT NULL | 이 키가 어떤 역할을 하는지에 대한 설명 |
data_type | VARCHAR(50) NOT NULL | 데이터 타입 (String, Boolean, Object, Array 등) |
data_source | VARCHAR(50) NOT NULL | 데이터 소스 (MILDANG, AI, CRM 등) |
update_frequency | VARCHAR(50) NOT NULL | 업데이트 빈도 (실시간, 필요 시, 매 수업 종료 후 등) |
scope | VARCHAR(50) NOT NULL | 적용 범위 (ALL, SESSION_TYPE, USER_ID, GROUP_ID 등) |
created_at | DATETIME NOT NULL | 레코드 생성 시각 |
updated_at | DATETIME NOT NULL | 레코드 갱신 시각 |
•
현재 단계에서는 “어떤 상태 키들이 필요할지”를 정의해두고, 실제 값은 코드 구현 레벨에서 필요할 때 저장·조회하는 방식을 취합니다.
3. “수업시작” 세션 시나리오 개요
출석체크 + 수업진행 안내
1.
출석 시간 도달
•
시스템이 “출석하세요!”라는 메시지를 보낼 수 있고, 학생이 “출석했어요”라고 응답.
•
출석 예정 시간과 실제 응답 시간 차이를 비교해 정시/지각/결석 등을 파악(예: attendance_status).
2.
정상 출석 시
•
“어, 정훈아 일찍 왔네 그럼 수업 시작할까?” 같은 대화를 진행.
•
오늘 학습할 피드 목록(강의, 문제)에 대한 안내: 예) “오늘 강의 2개, 문제 10개 풀어야 해요.”
3.
일찍 출석 or 결석 변경 이슈
•
“출석 예정 시간을 바꾸고 싶어요”, “결석 사유가 없어졌어요” 등 변동 사항이 있으면, Statement를 업데이트(예: today_attendance_time, attendance_status).
4.
실제 문제 풀기/강의 듣기 유도
•
수업도입(lesson_introduction)과 수업진행 안내(lesson_guide)가 합쳐져 있다고 가정하기 때문에,
•
“강의 먼저 듣고 알려달라, 문제 풀고 알려달라” 등의 대화 흐름을 수업시작 세션에서 처리함.
향후
현재는 출석체크와 수업진행이 하나로 뭉쳐 있는 “수업시작” 세션을 우선 구현하기로 함.
4. 기존 기능: 액티비티(피드백) 개요
•
액티비티: 문제를 풀다가 “이 문제 모르겠어요”라고 요청할 때 세션이 발동.
◦
학생이 특정 문제(예: 1번, 8번)를 지목하거나, AI가 “어떤 문제인지 알려줄래?”라고 물어봐서 식별.
◦
나중에 “어려워요” 기능 등으로 확장 가능.
•
이번 범위에는 액티비티 피드백 세션도 포함되긴 하지만, 출석체크+수업시작만큼은 아니고, 간단히 문제/활동 메타데이터 등을 활용할 수 있는 상태 키만 우선 검토합니다.