Learning 바운디드 컨텍스트
1. 컨텍스트 정의
Learning 도메인은 수면탐구 콘텐츠 관리, 학습 진행, 하이라이트, 사용자 입력, 퀴즈를 담당하는 바운디드 컨텍스트입니다.
1.1 주요 책임
- 수면탐구 콘텐츠 관리 (Sleep Exploration Content Management)
- 콘텐츠 해금 관리 (Content Unlock Management)
- 하이라이트 관리 (Highlight Management)
- 사용자 입력 관리 (User Input Management)
- 진행률 관리 (Progress Management)
- 텍스트 설정 관리 (Text Settings Management)
- 미디어 관리 (Media Management)
- 퀴즈 관리 (Quiz Management)
1.2 도메인 용어
- 수면탐구(Sleep Exploration): 수면 관련 학습 콘텐츠를 제공하는 46일 과정
- 콘텐츠 해금(Content Unlock): 사용자의 진행에 따라 학습 콘텐츠에 접근 권한이 부여되는 과정
- 학습 경로(Learning Path): 미리 정의된 수면탐구 콘텐츠의 해금 순서
- 하이라이트(Highlight): 사용자가 학습 내용 중 중요하다고 표시한 텍스트
- 진행률(Progress): 사용자의 수면탐구 콘텐츠 학습 완료 비율
- 퀴즈(Quiz): 학습한 내용을 확인하는 질문 형태의 평가
- 사용자 입력(User Input): 학습 과정에서 사용자가 입력하는 텍스트 또는 미디어
- 텍스트 설정(Text Settings): 학습 콘텐츠 텍스트의 표시 방식을 조절하는 기능
- TTS(Text-to-Speech): 텍스트를 음성으로 변환하여 읽어주는 기능
- 이미지 오버레이(Image Overlay): 이미지 확대 보기를 위한 전체화면 표시 기능
2. 하위 컨텍스트
2.1 콘텐츠 관리 컨텍스트 (Content Management Context)
수면탐구 콘텐츠 관리와 해금을 담당합니다.
책임
- 수면탐구 레슨 관리
- 레슨 콘텐츠 제공
- 콘텐츠 해금 처리
- 추천 콘텐츠 제공
- 미디어 자원 관리
정책 및 규칙
-
콘텐츠 해금 정책
- 시작일로부터 1일차부터 45일차까지 매일 새로운 콘텐츠 해금
- 마지막 1개 레슨은 90일차에 해금됨
- 하루에 해금되는 콘텐츠는 최대 1개
- 해금된 콘텐츠는 영구적으로 이용 가능
- 해금 순서는 미리 정의된 학습 경로를 따름
- 해금되지 않은 콘텐츠는 접근 제한됨
- 새로운 레슨은 매일 자정(00:00:00 UTC+1, 서버타임에는 UTC+2)에 해금됨
-
콘텐츠 추천 정책
- 기본적으로 최근 해금된 콘텐츠부터 추천
- 진도가 느린 사용자에게는 완료되지 않은 콘텐츠 먼저 추천
- 모든 콘텐츠 완료 시 복습 퀴즈 제공
2.2 학습 진행 컨텍스트 (Learning Progress Context)
사용자의 학습 진행 상태 관리를 담당합니다.
책임
- 레슨 완료 처리
- 진행률 계산 및 관리
- 학습 활동 기록
- 학습 통계 제공
- 레슨 상태 관리
정책 및 규칙
-
진행률 관리 정책
- 전체 진행률 = (완료한 콘텐츠 수 / 전체 콘텐츠 수) × 100%
- 진행률은 실시간으로 업데이트
- 진행률은 0%에서 100% 사이 값으로 표시
- 진행률은 해금 여부와 관계없이 전체 콘텐츠 기준으로 계산
- 진행률은 소수점 2자리까지 표시 (예: 23.81%)
-
콘텐츠 완료 정책
- 사용자가 콘텐츠 끝까지 스크롤하거나 [다음] 버튼을 눌렀을 때 학습 완료로 기록
- 부분적인 콘텐츠 열람은 완료로 처리되지 않음
- 학습 완료된 콘텐츠도 재열람 가능
- 학습 완료 상태는 서버에 저장되며 기기 변경 시에도 유지
- 한 번 완료된 레슨은 취소할 수 없음
-
레슨 상태 관리 정책
- 레슨은 다음 5가지 상태로 관리됨:
- 미해금 상태(LOCKED): 아직 해금이 되지 않은 상태
- 열람 가능 상태(UNLOCKED): 해금이 되어 열람이 가능한 상태
- 열람 불가 상태(BLOCKED): 해금이 되었지만, 아직 이전 레슨을 열람하지 않아서 열람할 수 없는 상태
- 열람 중 상태(IN_PROGRESS): 해금이 되었고 현재 열람 중인 상태
- 완료 상태(COMPLETED): 열람을 완료한 상태
- 레슨 상태 전환 규칙:
- 각 사용자의 시작일 기준으로 정해진 순서에 따라 LOCKED → UNLOCKED로 변경됨
- 이전 레슨이 완료되지 않은 경우 UNLOCKED → BLOCKED 상태가 됨
- 사용자가 레슨 콘텐츠에 접근 시 UNLOCKED → IN_PROGRESS로 변경됨
- BLOCKED 상태의 레슨 접근 시도 시 열람 불가 메시지 표시 (상태 변경 없음)
- 사용자가 레슨 끝까지 스크롤하여 [완료] 버튼을 누르면 IN_PROGRESS → COMPLETED로 변경됨
- 한번 COMPLETED 상태가 된 레슨은 다시 다른 상태로 변경되지 않음
- 레슨 상태에 따른 접근 제어:
- LOCKED, BLOCKED 상태의 레슨은 콘텐츠에 접근할 수 없음
- UNLOCKED, IN_PROGRESS, COMPLETED 상태의 레슨은 콘텐츠에 접근 가능
- 하이라이트 생성, 사용자 입력 저장은 IN_PROGRESS, COMPLETED 상태에서만 가능
- 레슨은 다음 5가지 상태로 관리됨:
2.3 하이라이트 컨텍스트 (Highlight Context)
하이라이트 관리를 담당합니다.
책임
- 하이라이트 생성
- 하이라이트 조회
- 하이라이트 삭제
- 하이라이트 표시
- 하이라이트 버전 관리
정책 및 규칙
-
하이라이트 생성 정책
- 하이라이트는 텍스트 롱프레스로 생성 가능
- 하이라이트 생성 시 챕터명, 하이라이트된 텍스트, 텍스트 위치 정보 함께 저장
- 동일 텍스트에 대한 중복 하이라이트 생성 불가
- 하이라이트는 생성 즉시 저장됨
- 하이라이트 생성은 해금된 레슨의 콘텐츠만 가능
- 텍스트 길이는 최소 3자, 최대 2,000자
- 레슨당 최대 50개까지 하이라이트 생성 가능
-
하이라이트 표시 정책
- 하이라이트된 문장은 배경색으로 강조 표시
- 하이라이트 목록은 레슨 순서대로 정렬
- 목록에서 각 하이라이트는 챕터명과 하이라이트한 문장을 함께 표시
- 하이라이트된 영역 탭 시 툴팁은 문장 맨 앞에 표시
- 하이라이트 목록은 스크롤 가능한 형태로 제공
- 기본적으로 최신순 정렬
- 하이라이트 목록에서 항목 선택 시 해당 레슨의 해당 위치로 바로 이동
-
하이라이트 삭제 정책
- 하이라이트 항목 우측 상단의 [휴지통] 아이콘 탭 시 삭제 확인 팝업 표시
- 삭제 확인 팝업에서 [확인] 선택 시 즉시 삭제 진행
- 삭제 확인 팝업에서 [취소] 선택 시 삭제 취소 및 팝업만 닫힘
- 삭제된 하이라이트는 복구 불가
- 하이라이트 삭제는 서버에 즉시 반영
- 사용자는 자신이 생성한 하이라이트만 삭제 가능
-
하이라이트 버전 관리 정책
- 하이라이트 생성 시 해당 레슨의 ID와 현재 버전 정보를 함께 저장
- 레슨 내용이 변경될 경우 새로운 버전 번호 부여
- 하이라이트 자체는 버전을 가지지 않고, 연결된 레슨의 버전 정보만 참조
- 클라이언트에는 현재 레슨 버전과 일치하는 하이라이트만 제공
- 레슨 버전이 변경되면 이전 버전의 레슨에 연결된 하이라이트는 클라이언트에 표시되지 않음
- 하이라이트 동기화 시 연결된 레슨의 버전 정보를 확인하여 최신 버전 여부 판단
- 관리자는 모든 버전의 레슨에 연결된 하이라이트에 접근 가능
- 사용자는 이전 버전의 레슨에 연결된 하이라이트를 확인할 수 없음
2.4 사용자 입력 컨텍스트 (User Input Context)
사용자 입력 관리를 담당합니다.
책임
- 사용자 입력 저장
- 사용자 입력 로드
- 입력 동기화 관리
정책 및 규칙
-
입력 저장 정책
- 사용자 입력은 별도의 저장 버튼 없이 자동으로 실시간 저장
- 저장 트리거 지점: 입력 후 포커스 아웃, [다음] 버튼 탭, 화면 이탈, 앱 백그라운드 전환
- 저장 시 콘텐츠 ID와 연결하여 저장
- 저장 시 생성/수정 시간 함께 기록
- 빈 입력값도 유효한 입력으로 간주하여 저장
-
입력 로드 정책
- 사용자가 동일 레슨에 재진입 시 이전 입력 내용 자동 로드
- 로드 실패 시 빈 입력 영역으로 표시
- 네트워크 연결 없이도 최근 입력값 로컬 캐싱하여 표시 가능
- 동기화 충돌 시 서버 데이터 우선
2.5 설정 컨텍스트 (Settings Context)
텍스트 설정 및 TTS 기능 관리를 담당합니다.
책임
- 텍스트 크기 관리
- TTS 설정 관리
- 사용자 설정 저장 및 로드
정책 및 규칙
-
텍스트 크기 조절 정책
- 텍스트 크기는 슬라이더로 조절 가능
- 크기 범위: 최소 12pt ~ 최대 24pt
- 기본 크기: 16pt
- 텍스트 크기 변경 시 실시간 미리보기 제공
- 설정은 [저장] 버튼 탭 시에만 적용
- 적용된 텍스트 크기는 모든 레슨에 일괄 적용
- 설정은 사용자 계정에 저장되어 기기 변경 시에도 유지
-
TTS 기능 정책
- TTS 기능은 [오디오] 버튼으로 활성화/비활성화
- TTS 활성화 시 현재 읽고 있는 문장은 파란색으로 강조 표시
- TTS 상태는 화면 전환 시에도 유지
- 지원 언어: 독일어, 영어
- 재생 속도: 기본, 느림, 빠름 중 선택 가능
- TTS 설정은 사용자 계정에 저장
2.6 미디어 컨텍스트 (Media Context)
이미지와 비디오 관리를 담당합니다.
책임
- 이미지 표시 및 확대/축소
- 비디오 재생 관리
- 미디어 로딩 최적화
- 미디어 보안 접근 제어
- App Token 기반 디바이스 검증
- JSON 콘텐츠 직접 제공 및 미디어 Signed URL 제공
정책 및 규칙
-
이미지 관리 정책
- 본문 내 이미지 탭 시 전체화면 오버레이로 표시
- 이미지 확대/축소는 두 손가락 제스처로 제어
- 최대 확대 배율: 원본의 2배
- 최소 축소 배율: 원본 크기
- 확대/축소 상태는 제스처 후에도 유지
- 오버레이 배경 탭 시 본문 화면으로 복귀
-
영상 관리 정책
- 영상 재생은 iOS 기본 비디오 플레이어 사용
- 지원 형식: MP4, MOV
- 인라인 및 전체화면 모드 모두 지원
- 영상 시청 완료 시 자동으로 본문 화면으로 복귀
- 영상 재생 위치는 저장되지 않음
-
콘텐츠 보안 정책
- 모든 콘텐츠 접근은 App Token 기반 디바이스 검증 필요
- 직접적인 클라우드 스토리지 URL 노출 금지
- POST 요청을 통한 안전한 콘텐츠 요청 처리
- JSON 콘텐츠는 API 응답에 직접 포함하여 제공
- 미디어 파일은 Signed URL을 통한 시간 제한된 접근 (30분)
- 해금된 레슨에 속한 콘텐츠만 접근 허용
2.7 퀴즈 컨텍스트 (Quiz Context)
복습 퀴즈 관리를 담당합니다.
책임
- 퀴즈 제공
- 퀴즈 응답 처리
- 퀴즈 결과 관리
- 퀴즈 통계 제공
- 퀴즈 버전 관리
- 퀴즈 성능 분석
정책 및 규칙
-
퀴즈 제공 정책
- 수면탐구 레슨 46개 중 45개를 완료한 사용자에게만 제공
- 완료 다음 날부터 하루에 한 문제씩 제공
- 46일차부터 89일차까지 매일 하루에 1개의 퀴즈 제공
- 퀴즈는 O/X 또는 사지선다형으로 랜덤 제공
- 퀴즈 내용은 이전에 학습한 콘텐츠와 연계
- 퀴즈 내용은 서버에서 관리되며 정기적으로 업데이트
-
퀴즈 풀이 정책
- 각 퀴즈는 단일 정답만 선택 가능
- 답변 선택 시 [다음] 버튼 활성화
- 정답 제출 후 결과 즉시 확인 가능
- 오답 선택 시에도 정답과 설명 제공
- 한번 푼 퀴즈도 [다시 풀기] 버튼으로 재시도 가능
-
퀴즈 결과 관리 정책
- 퀴즈 결과(정답/오답)는 서버에 기록
- 사용자별 퀴즈 정답률 통계 제공
- 관련 콘텐츠로 이동 기능 제공
- 퀴즈 이력은 사용자 계정에 저장되어 확인 가능
- 각 응답에는 퀴즈 버전 정보가 함께 기록
-
퀴즈 버전 관리 정책
- 퀴즈는 버전 관리를 통해 개선 이력 추적
- 사용자는 항상 최신 활성 버전의 퀴즈를 제공받음
- 문제 내용, 선택지, 정답 변경 시 새 버전 생성
- 이전 버전의 응답 데이터는 보존되어 분석에 활용
- 퀴즈 성능 데이터를 버전별로 분석하여 개선점 도출
- 레슨 업데이트 시 관련 퀴즈의 버전 업데이트 필요성 평가
3. 컨텍스트 경계
3.1 상위 컨텍스트
- User Domain: 사용자 정보 관리, 치료 주기 관리
- Auth Domain: 인증 및 권한 관리
3.2 동등 컨텍스트 (Peer Context)
- Sleep Domain: 수면 데이터 관리
- Questionnaire Domain: 설문 및 평가 관리
3.3 하위 컨텍스트
- Analytics Domain: 학습 분석 및 통계
- Notification Domain: 알림 관리
3.3 외부 시스템
- TTS Engine: 텍스트 음성 변환 서비스
- Google Cloud Storage: 보안 미디어 파일 저장 및 Signed URL 제공
- App Integrity Service: 앱 무결성 검증 서비스
- Device Storage: 로컬 캐싱 및 저장
4. 컨텍스트 매핑
4.1 User Domain과의 관계 (Customer-Supplier + Anti-Corruption Layer)
4.2 Sleep Domain과의 관계 (Anti-Corruption Layer)
4.3 Questionnaire Domain과의 관계 (Anti-Corruption Layer)
4.4 Auth Domain과의 관계 (Conformist)
4.5 Analytics Domain과의 관계 (Published Language)
4.6 Notification Domain과의 관계 (Published Language)
5. 도메인 이벤트
5.1 발행하는 이벤트
- LessonUnlocked: 새로운 레슨이 해금됨
- LessonCompleted: 사용자가 레슨을 완료함
- HighlightCreated: 새로운 하이라이트가 생성됨
- HighlightDeleted: 하이라이트가 삭제됨
- UserInputSaved: 사용자 입력이 저장됨
- TextSettingsChanged: 텍스트 설정이 변경됨
- TTSActivated: TTS 기능이 활성화됨
- ImageViewerOpened: 이미지 뷰어가 열림
- VideoPlaybackStarted: 비디오 재생이 시작됨
- QuizAnswered: 퀴즈에 답변함
- QuizResultShown: 퀴즈 결과가 표시됨
- QuizVersionCreated: 퀴즈 새 버전이 생성됨
- QuizVersionActivated: 퀴즈 버전이 활성화됨
- QuizPerformanceAnalyzed: 퀴즈 성능이 분석됨
- ProgressUpdated: 진행률이 업데이트됨
- AllLessonsCompleted: 모든 레슨이 완료됨
- DailyQuizUnlocked: 일일 퀴즈가 해금됨
- UserInputUpdated: 사용자 입력이 업데이트됨
- TTSDeactivated: TTS 기능이 비활성화됨
- MediaLoadFailed: 미디어 로드에 실패함
- UserActivityRecorded: 사용자 활동이 기록됨
5.2 구독하는 이벤트
User 도메인 이벤트
- UserCycleStarted: 사용자 주기 시작 - 새로운 학습 사이클 초기화 및 첫 번째 레슨 해금
- UserCycleCompleted: 사용자 주기 완료 - 학습 데이터 최종 처리 및 아카이브
- UserDeleted: 사용자 데이터 삭제 - 관련 학습 데이터 정리 및 삭제
- TreatmentDayChanged: 치료 일차 변경 - 레슨 해금 상태 재계산 및 캐시 무효화
Sleep 도메인 이벤트
- SleepLogRecorded: 수면 로그 기록 - 수면 데이터 기반 학습 추천 업데이트
Questionnaire 도메인 이벤트
- QuestionnaireResponseCompleted: 설문 응답 완료 - 설문 결과 기반 학습 진행 상태 업데이트
기타 외부 이벤트
- UserCreated: 새로운 사용자 생성
- UserAuthenticated: 사용자 인증 완료
- UserLoggedOut: 사용자 로그아웃
- NotificationSent: 알림이 전송됨
6. 보안 정책
6.1 콘텐츠 보안 정책
- App Token 기반 디바이스 인증 및 무결성 검증
- POST 방식을 통한 민감정보 전송으로 로깅/캐싱 위험 최소화
- 직접 클라우드 스토리지 URL 노출 금지
- JSON 콘텐츠는 API 응답에 직접 포함하여 1회 호출로 완료
- 미디어 파일은 Signed URL을 통한 시간 제한된 접근 (30분)
- 해금 상태 확인 후 접근 제어 (해금되지 않은 경우 403 Forbidden 응답)
6.2 데이터 보안 정책
- 사용자 입력 데이터 암호화
- 하이라이트 내용 보호
- 개인 학습 데이터 접근 제한
- 학습 진행 데이터 정기 백업
- 데이터 접근 로그 유지 및 모니터링
- 사용자별 해금 상태와 연동된 동적 접근 제어
7. 기술 스택
- NestJS
- TypeScript
- PostgreSQL (학습 진행, 북마크, 사용자 입력)
- Redis (퀴즈 세션, 캐싱)
- GCP Pub/Sub (이벤트 메시징)
- GCS (미디어 저장)
- Google Cloud Text-to-Speech API (TTS 기능)
- iOS 미디어 재생 API
- React Native (클라이언트 구현)
8. 변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|---|---|---|
| 0.1.0 | 2025-04-03 | bok@weltcorp.com | 최초 작성 |
| 0.2.0 | 2025-06-09 | bok@weltcorp.com | 퀴즈 버전 관리 기능 추가 - 퀴즈 컨텍스트에 버전 관리 책임 및 정책, 관련 이벤트 추가 |