본문으로 건너뛰기

Research 도메인 이벤트 스토밍

본 문서는 Research 도메인 요구사항(requirements.md)을 기반으로 Event Storming 방식으로 분석한 결과입니다.

목적

Research 도메인은 Dashboard의 연구 기능(연구 시트 접근/스코프, 연구 참여자 관리, 카드 파생 지표, 불성실 판정)을 다룹니다. 본 문서는 해당 기능을 도메인 이벤트/명령/정책 관점으로 구조화합니다.


1. 도메인 이벤트

1.1 접근/스코프 관련 이벤트

EventDescription
ResearchAccessEvaluated연구 기능 접근 가능 여부가 평가됨 (clinicalResearch + IAM 평가)
ResearchAccessDenied연구 기능 접근이 거부됨
ResearchScopeResolved조회 스코프가 결정됨 (all-sites 또는 site-scoped)
ResearchSiteFilterSelected플랫폼 전체 조회 권한 보유자가 특정 Site로 필터를 선택함

1.2 연구 참여자(Research Participant) 생명주기 이벤트

EventDescription
ResearchParticipantImported진료용 환자 목록에서 연구 참여자로 등록됨
ResearchParticipantCreated임상 연구용 신규 등록으로 연구 참여자가 생성됨
ResearchAccessCodeDeliveryRequested코드 발송(이메일/SMS/카카오톡)이 요청됨
ResearchAccessCodeDelivered코드 발송이 성공함
ResearchAccessCodeDeliveryFailed코드 발송이 실패함
ResearchParticipantRemovedFromList연구 참여자가 연구 리스트에서 제외됨(진료용 데이터는 유지)

1.3 연구 참여자 수정 이벤트

EventDescription
RandomizationNumberUpdateRequested무작위번호 변경이 요청됨
RandomizationNumberValidated무작위번호 형식/가용성 검증이 성공함
RandomizationNumberValidationFailed무작위번호 검증이 실패함
RandomizationNumberUniquenessChecked병원(Site) 단위 중복 검증이 수행됨
RandomizationNumberUpdated무작위번호가 저장/수정됨
ParticipantMemoUpdated메모가 저장/수정됨(단일 최신본)

1.4 불성실(NonCompliant) 관련 이벤트

EventDescription
NonComplianceEvaluated불성실 여부가 평가됨
NonCompliantFlagged불성실 상태로 전환됨
NonCompliantUnflagged불성실 상태가 해제됨
NonComplianceReasonChanged불성실 사유(수면기록/설문)가 변경됨(표시/강조 텍스트에 영향)

1.5 카드 파생 지표 이벤트(조회/재계산)

EventDescription
ParticipantCardMetricsRead연구 참여자 카드 지표가 조회됨
ParticipantCardMetricsDerived파생 지표가 계산/갱신됨

2. 액터와 명령

2.1 액터 정의

ActorDescription
PlatformViewer플랫폼 전체 조회 권한 보유자(예: medi.platform-admin)
SiteScopedResearchUser사이트 스코프 연구 사용자(예: medi.site-admin/member)
System스케줄러/이벤트 처리 등 자동 평가를 수행하는 주체

2.2 명령-이벤트 매핑

CommandActorEvent(s)
EvaluateResearchAccessSystemResearchAccessEvaluated / ResearchAccessDenied
ResolveResearchScopeSystemResearchScopeResolved
SelectResearchSiteFilterPlatformViewerResearchSiteFilterSelected
ListResearchParticipantsPlatformViewer, SiteScopedResearchUserParticipantCardMetricsRead
ImportResearchParticipantSiteScopedResearchUserResearchParticipantImported
CreateResearchParticipantSiteScopedResearchUserResearchParticipantCreated, ResearchAccessCodeDeliveryRequested
UpdateRandomizationNumberSiteScopedResearchUserRandomizationNumberUpdateRequested, RandomizationNumberUniquenessChecked, RandomizationNumberUpdated
UpdateParticipantMemoSiteScopedResearchUserParticipantMemoUpdated
RemoveResearchParticipantFromListSiteScopedResearchUserResearchParticipantRemovedFromList
EvaluateNonComplianceSystemNonComplianceEvaluated, NonCompliantFlagged/Unflagged

3. Aggregate 매핑

3.1 ResearchParticipant

트랜잭션 경계:

  • 연구 참여자의 연구 리스트 포함 여부, 무작위번호, 메모(최신본), 불성실 상태를 일관되게 관리

담당 Command:

  • ImportResearchParticipant
  • CreateResearchParticipant
  • UpdateRandomizationNumber
  • UpdateParticipantMemo
  • RemoveResearchParticipantFromList

발행 Event:

  • ResearchParticipantImported
  • ResearchParticipantCreated
  • RandomizationNumberUpdated
  • ParticipantMemoUpdated
  • ResearchParticipantRemovedFromList

3.2 ResearchScope(정책/도메인 서비스 성격)

책임:

  • IAM 권한 평가 결과 + siteId 컨텍스트로 조회 스코프(all-sites vs site-scoped)를 결정

3.3 NonComplianceEvaluation(정책/도메인 서비스 성격)

책임:

  • 수면기록/설문 데이터 변화에 따라 불성실 여부를 판정하고 상태를 갱신

4. 정책(Policy) 요약

4.1 연구 시트 접근 정책

WhenThen
Site.clinicalResearch=falseResearchAccessDenied
clinicalResearch=true + IAM 허용ResearchAccessEvaluated, ResearchScopeResolved

4.2 무작위번호 저장/수정 정책

WhenThen
RandomizationNumberUpdateRequested병원(Site) 단위 중복 검증 후 유효하면 RandomizationNumberUpdated 발행
중복/유효성 위반RandomizationNumberValidationFailed 발행

4.3 불성실 판정 정책

WhenThen
수면기록률 ≤ 50% (8일차부터)NonCompliantFlagged (수면기록 불성실)
43일차 도달 + 마지막 설문 미실시NonCompliantFlagged (설문 불성실)
조건을 더 이상 만족하지 않음NonCompliantUnflagged

변경 이력

버전날짜작성자변경 내용
0.1.02025-12-29jeff@weltcorp.com최초 작성