본문으로 건너뛰기

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. 콘텐츠 해금 정책

    • 시작일로부터 1일차부터 45일차까지 매일 새로운 콘텐츠 해금
    • 마지막 1개 레슨은 90일차에 해금됨
    • 하루에 해금되는 콘텐츠는 최대 1개
    • 해금된 콘텐츠는 영구적으로 이용 가능
    • 해금 순서는 미리 정의된 학습 경로를 따름
    • 해금되지 않은 콘텐츠는 접근 제한됨
    • 새로운 레슨은 매일 자정(00:00:00 UTC+1, 서버타임에는 UTC+2)에 해금됨
  2. 콘텐츠 추천 정책

    • 기본적으로 최근 해금된 콘텐츠부터 추천
    • 진도가 느린 사용자에게는 완료되지 않은 콘텐츠 먼저 추천
    • 모든 콘텐츠 완료 시 복습 퀴즈 제공

2.2 학습 진행 컨텍스트 (Learning Progress Context)

사용자의 학습 진행 상태 관리를 담당합니다.

책임

  • 레슨 완료 처리
  • 진행률 계산 및 관리
  • 학습 활동 기록
  • 학습 통계 제공
  • 레슨 상태 관리

정책 및 규칙

  1. 진행률 관리 정책

    • 전체 진행률 = (완료한 콘텐츠 수 / 전체 콘텐츠 수) × 100%
    • 진행률은 실시간으로 업데이트
    • 진행률은 0%에서 100% 사이 값으로 표시
    • 진행률은 해금 여부와 관계없이 전체 콘텐츠 기준으로 계산
    • 진행률은 소수점 2자리까지 표시 (예: 23.81%)
  2. 콘텐츠 완료 정책

    • 사용자가 콘텐츠 끝까지 스크롤하거나 [다음] 버튼을 눌렀을 때 학습 완료로 기록
    • 부분적인 콘텐츠 열람은 완료로 처리되지 않음
    • 학습 완료된 콘텐츠도 재열람 가능
    • 학습 완료 상태는 서버에 저장되며 기기 변경 시에도 유지
    • 한 번 완료된 레슨은 취소할 수 없음
  3. 레슨 상태 관리 정책

    • 레슨은 다음 5가지 상태로 관리됨:
      1. 미해금 상태(LOCKED): 아직 해금이 되지 않은 상태
      2. 열람 가능 상태(UNLOCKED): 해금이 되어 열람이 가능한 상태
      3. 열람 불가 상태(BLOCKED): 해금이 되었지만, 아직 이전 레슨을 열람하지 않아서 열람할 수 없는 상태
      4. 열람 중 상태(IN_PROGRESS): 해금이 되었고 현재 열람 중인 상태
      5. 완료 상태(COMPLETED): 열람을 완료한 상태
    • 레슨 상태 전환 규칙:
      • 각 사용자의 시작일 기준으로 정해진 순서에 따라 LOCKED → UNLOCKED로 변경됨
      • 이전 레슨이 완료되지 않은 경우 UNLOCKED → BLOCKED 상태가 됨
      • 사용자가 레슨 콘텐츠에 접근 시 UNLOCKED → IN_PROGRESS로 변경됨
      • BLOCKED 상태의 레슨 접근 시도 시 열람 불가 메시지 표시 (상태 변경 없음)
      • 사용자가 레슨 끝까지 스크롤하여 [완료] 버튼을 누르면 IN_PROGRESS → COMPLETED로 변경됨
      • 한번 COMPLETED 상태가 된 레슨은 다시 다른 상태로 변경되지 않음
    • 레슨 상태에 따른 접근 제어:
      • LOCKED, BLOCKED 상태의 레슨은 콘텐츠에 접근할 수 없음
      • UNLOCKED, IN_PROGRESS, COMPLETED 상태의 레슨은 콘텐츠에 접근 가능
      • 하이라이트 생성, 사용자 입력 저장은 IN_PROGRESS, COMPLETED 상태에서만 가능

2.3 하이라이트 컨텍스트 (Highlight Context)

하이라이트 관리를 담당합니다.

책임

  • 하이라이트 생성
  • 하이라이트 조회
  • 하이라이트 삭제
  • 하이라이트 표시
  • 하이라이트 버전 관리

정책 및 규칙

  1. 하이라이트 생성 정책

    • 하이라이트는 텍스트 롱프레스로 생성 가능
    • 하이라이트 생성 시 챕터명, 하이라이트된 텍스트, 텍스트 위치 정보 함께 저장
    • 동일 텍스트에 대한 중복 하이라이트 생성 불가
    • 하이라이트는 생성 즉시 저장됨
    • 하이라이트 생성은 해금된 레슨의 콘텐츠만 가능
    • 텍스트 길이는 최소 3자, 최대 2,000자
    • 레슨당 최대 50개까지 하이라이트 생성 가능
  2. 하이라이트 표시 정책

    • 하이라이트된 문장은 배경색으로 강조 표시
    • 하이라이트 목록은 레슨 순서대로 정렬
    • 목록에서 각 하이라이트는 챕터명과 하이라이트한 문장을 함께 표시
    • 하이라이트된 영역 탭 시 툴팁은 문장 맨 앞에 표시
    • 하이라이트 목록은 스크롤 가능한 형태로 제공
    • 기본적으로 최신순 정렬
    • 하이라이트 목록에서 항목 선택 시 해당 레슨의 해당 위치로 바로 이동
  3. 하이라이트 삭제 정책

    • 하이라이트 항목 우측 상단의 [휴지통] 아이콘 탭 시 삭제 확인 팝업 표시
    • 삭제 확인 팝업에서 [확인] 선택 시 즉시 삭제 진행
    • 삭제 확인 팝업에서 [취소] 선택 시 삭제 취소 및 팝업만 닫힘
    • 삭제된 하이라이트는 복구 불가
    • 하이라이트 삭제는 서버에 즉시 반영
    • 사용자는 자신이 생성한 하이라이트만 삭제 가능
  4. 하이라이트 버전 관리 정책

    • 하이라이트 생성 시 해당 레슨의 ID와 현재 버전 정보를 함께 저장
    • 레슨 내용이 변경될 경우 새로운 버전 번호 부여
    • 하이라이트 자체는 버전을 가지지 않고, 연결된 레슨의 버전 정보만 참조
    • 클라이언트에는 현재 레슨 버전과 일치하는 하이라이트만 제공
    • 레슨 버전이 변경되면 이전 버전의 레슨에 연결된 하이라이트는 클라이언트에 표시되지 않음
    • 하이라이트 동기화 시 연결된 레슨의 버전 정보를 확인하여 최신 버전 여부 판단
    • 관리자는 모든 버전의 레슨에 연결된 하이라이트에 접근 가능
    • 사용자는 이전 버전의 레슨에 연결된 하이라이트를 확인할 수 없음

2.4 사용자 입력 컨텍스트 (User Input Context)

사용자 입력 관리를 담당합니다.

책임

  • 사용자 입력 저장
  • 사용자 입력 로드
  • 입력 동기화 관리

정책 및 규칙

  1. 입력 저장 정책

    • 사용자 입력은 별도의 저장 버튼 없이 자동으로 실시간 저장
    • 저장 트리거 지점: 입력 후 포커스 아웃, [다음] 버튼 탭, 화면 이탈, 앱 백그라운드 전환
    • 저장 시 콘텐츠 ID와 연결하여 저장
    • 저장 시 생성/수정 시간 함께 기록
    • 빈 입력값도 유효한 입력으로 간주하여 저장
  2. 입력 로드 정책

    • 사용자가 동일 레슨에 재진입 시 이전 입력 내용 자동 로드
    • 로드 실패 시 빈 입력 영역으로 표시
    • 네트워크 연결 없이도 최근 입력값 로컬 캐싱하여 표시 가능
    • 동기화 충돌 시 서버 데이터 우선

2.5 설정 컨텍스트 (Settings Context)

텍스트 설정 및 TTS 기능 관리를 담당합니다.

책임

  • 텍스트 크기 관리
  • TTS 설정 관리
  • 사용자 설정 저장 및 로드

정책 및 규칙

  1. 텍스트 크기 조절 정책

    • 텍스트 크기는 슬라이더로 조절 가능
    • 크기 범위: 최소 12pt ~ 최대 24pt
    • 기본 크기: 16pt
    • 텍스트 크기 변경 시 실시간 미리보기 제공
    • 설정은 [저장] 버튼 탭 시에만 적용
    • 적용된 텍스트 크기는 모든 레슨에 일괄 적용
    • 설정은 사용자 계정에 저장되어 기기 변경 시에도 유지
  2. TTS 기능 정책

    • TTS 기능은 [오디오] 버튼으로 활성화/비활성화
    • TTS 활성화 시 현재 읽고 있는 문장은 파란색으로 강조 표시
    • TTS 상태는 화면 전환 시에도 유지
    • 지원 언어: 독일어, 영어
    • 재생 속도: 기본, 느림, 빠름 중 선택 가능
    • TTS 설정은 사용자 계정에 저장

2.6 미디어 컨텍스트 (Media Context)

이미지와 비디오 관리를 담당합니다.

책임

  • 이미지 표시 및 확대/축소
  • 비디오 재생 관리
  • 미디어 로딩 최적화
  • 미디어 보안 접근 제어
  • App Token 기반 디바이스 검증
  • JSON 콘텐츠 직접 제공 및 미디어 Signed URL 제공

정책 및 규칙

  1. 이미지 관리 정책

    • 본문 내 이미지 탭 시 전체화면 오버레이로 표시
    • 이미지 확대/축소는 두 손가락 제스처로 제어
    • 최대 확대 배율: 원본의 2배
    • 최소 축소 배율: 원본 크기
    • 확대/축소 상태는 제스처 후에도 유지
    • 오버레이 배경 탭 시 본문 화면으로 복귀
  2. 영상 관리 정책

    • 영상 재생은 iOS 기본 비디오 플레이어 사용
    • 지원 형식: MP4, MOV
    • 인라인 및 전체화면 모드 모두 지원
    • 영상 시청 완료 시 자동으로 본문 화면으로 복귀
    • 영상 재생 위치는 저장되지 않음
  3. 콘텐츠 보안 정책

    • 모든 콘텐츠 접근은 App Token 기반 디바이스 검증 필요
    • 직접적인 클라우드 스토리지 URL 노출 금지
    • POST 요청을 통한 안전한 콘텐츠 요청 처리
    • JSON 콘텐츠는 API 응답에 직접 포함하여 제공
    • 미디어 파일은 Signed URL을 통한 시간 제한된 접근 (30분)
    • 해금된 레슨에 속한 콘텐츠만 접근 허용

2.7 퀴즈 컨텍스트 (Quiz Context)

복습 퀴즈 관리를 담당합니다.

책임

  • 퀴즈 제공
  • 퀴즈 응답 처리
  • 퀴즈 결과 관리
  • 퀴즈 통계 제공
  • 퀴즈 버전 관리
  • 퀴즈 성능 분석

정책 및 규칙

  1. 퀴즈 제공 정책

    • 수면탐구 레슨 46개 중 45개를 완료한 사용자에게만 제공
    • 완료 다음 날부터 하루에 한 문제씩 제공
    • 46일차부터 89일차까지 매일 하루에 1개의 퀴즈 제공
    • 퀴즈는 O/X 또는 사지선다형으로 랜덤 제공
    • 퀴즈 내용은 이전에 학습한 콘텐츠와 연계
    • 퀴즈 내용은 서버에서 관리되며 정기적으로 업데이트
  2. 퀴즈 풀이 정책

    • 각 퀴즈는 단일 정답만 선택 가능
    • 답변 선택 시 [다음] 버튼 활성화
    • 정답 제출 후 결과 즉시 확인 가능
    • 오답 선택 시에도 정답과 설명 제공
    • 한번 푼 퀴즈도 [다시 풀기] 버튼으로 재시도 가능
  3. 퀴즈 결과 관리 정책

    • 퀴즈 결과(정답/오답)는 서버에 기록
    • 사용자별 퀴즈 정답률 통계 제공
    • 관련 콘텐츠로 이동 기능 제공
    • 퀴즈 이력은 사용자 계정에 저장되어 확인 가능
    • 각 응답에는 퀴즈 버전 정보가 함께 기록
  4. 퀴즈 버전 관리 정책

    • 퀴즈는 버전 관리를 통해 개선 이력 추적
    • 사용자는 항상 최신 활성 버전의 퀴즈를 제공받음
    • 문제 내용, 선택지, 정답 변경 시 새 버전 생성
    • 이전 버전의 응답 데이터는 보존되어 분석에 활용
    • 퀴즈 성능 데이터를 버전별로 분석하여 개선점 도출
    • 레슨 업데이트 시 관련 퀴즈의 버전 업데이트 필요성 평가

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.02025-04-03bok@weltcorp.com최초 작성
0.2.02025-06-09bok@weltcorp.com퀴즈 버전 관리 기능 추가 - 퀴즈 컨텍스트에 버전 관리 책임 및 정책, 관련 이벤트 추가