본 문서는 Plan 도메인의 이벤트 스토밍 워크샵 결과를 정리한 것입니다. Plan 도메인 요구사항 명세서(requirements.md)와 비즈니스 규칙 문서(business-rules.md)를 기반으로 도출된 도메인 이벤트, 명령, 액터, 정책 등을 포함합니다.
바운디드 컨텍스트 참조
Plan 도메인은 다른 도메인(IAM, User, Billing, Audit 등)과 상호작용합니다. 특히 IAM 도메인의 역할(Role) 정보, User 도메인의 사용자 상태 및 플랜 할당, Billing 도메인의 결제 정보에 의존합니다. Group 도메인과는 독립적으로 운영되며, 서로 다른 차원의 권한을 제공합니다. 자세한 내용은 각 도메인 문서를 참조하십시오.
도메인 이벤트
도메인에서 발생하는 중요한 변화나 사실을 나타내는 이벤트들입니다.
1. 플랜(Plan) 생명주기 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| PlanCreated | 새 플랜이 생성되었음 | CreatePlan |
| PlanRead | 플랜 정보가 조회되었음 | GetPlan |
| PlanUpdated | 플랜 정보가 수정되었음 | UpdatePlan |
| PlanDeleted | 플랜이 삭제되었음 | DeletePlan |
| PlanActivated | 플랜이 활성화 상태로 변경됨 | ActivatePlan |
| PlanDeactivated | 플랜이 비활성화 상태로 변경됨 | DeactivatePlan |
| PlanDeprecated | 플랜이 폐기 예정 상태로 변경됨 | DeprecatePlan |
| PlanArchived | 플랜이 보관 상태로 변경됨 | ArchivePlan |
| PlanValidationFailed | 플랜 생성/수정 시 유효성 검증 실패 | CreatePlan, UpdatePlan |
2. 플랜 유형 및 분류 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| TherapeuticPlanCreated | 치료 플랜이 생성되었음 | CreateTherapeuticPlan |
| LimitedAccessPlanCreated | 제한 접근 플랜이 생성되었음 | CreateLimitedAccessPlan |
| SamplePlanCreated | 샘플 플랜이 생성되었음 | CreateSamplePlan |
| DevelopmentPlanCreated | 개발 플랜이 생성되었음 | CreateDevelopmentPlan |
| ClinicianPlanCreated | 클리니션 플랜이 생성되었음 | CreateClinicianPlan |
| GuestAccessPlanCreated | 게스트 플랜이 생성되었음 | CreateGuestAccessPlan |
| PlanTypeChanged | 플랜 유형이 변경되었음 | ChangePlanType |
| PlanCategoryAssigned | 플랜에 카테고리가 할당되었음 | AssignPlanCategory |
3. 플랜-역할 관계 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| RoleAssignedToPlan | 플랜에 역할이 할당되었음 | AssignRoleToPlan |
| RoleRevokedFromPlan | 플랜에서 역할이 해제되었음 | RevokeRoleFromPlan |
| PlanRoleValidationFailed | 플랜-역할 할당 시 검증 실패 | AssignRoleToPlan |
| PlanRoleConflictDetected | 플랜 내 역할 충돌이 감지되었음 | ValidatePlanRoles |
| PlanRoleConsistencyRestored | 플랜 역할 일관성이 복구되었음 | ResolvePlanRoleConflict |
4. 플랜 기능 및 제한사항 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| PlanFeatureEnabled | 플랜 기능이 활성화되었음 | EnablePlanFeature |
| PlanFeatureDisabled | 플랜 기능이 비활성화되었음 | DisablePlanFeature |
| PlanLimitConfigured | 플랜 사용 한도가 설정되었음 | ConfigurePlanLimit |
| PlanLimitExceeded | 플랜 사용 한도가 초과되었음 | 자동 모니터링 |
| PlanServiceLevelDefined | 플랜 서비스 수준이 정의되었음 | DefinePlanServiceLevel |
| PlanSLABreach | 플랜 SLA 위반이 발생했음 | 자동 모니터링 |
5. 플랜 할당 및 변경 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| PlanAssignedToUser | 사용자에게 플랜이 할당되었음 | AssignPlanToUser |
| GuestPlanAssigned | 게스트 사용자에게 게스트 플랜이 할당되었음 | AssignGuestPlan |
| PlanUnassignedFromUser | 사용자에게서 플랜이 해제되었음 | UnassignPlanFromUser |
| PlanUpgraded | 플랜이 업그레이드되었음 | UpgradePlan |
| PlanDowngraded | 플랜이 다운그레이드되었음 | DowngradePlan |
| PlanMigrationStarted | 플랜 마이그레이션이 시작되었음 | StartPlanMigration |
| PlanMigrationCompleted | 플랜 마이그레이션이 완료되었음 | CompletePlanMigration |
| PlanMigrationFailed | 플랜 마이그레이션이 실패했음 | 마이그레이션 프로세스 중 |
| PlanChangeScheduled | 플랜 변경이 예약되었음 | SchedulePlanChange |
| GuestPlanExpired | 게스트 플랜이 만료되었음 | HandleGuestPlanExpiry |
| GuestPlanCleanupScheduled | 게스트 플랜 정리가 예약되었음 | ScheduleGuestPlanCleanup |
6. 플랜 템플릿 및 프리셋 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| PlanTemplateCreated | 플랜 템플릿이 생성되었음 | CreatePlanTemplate |
| PlanTemplateApplied | 플랜 템플릿이 적용되었음 | ApplyPlanTemplate |
| PlanTemplateUpdated | 플랜 템플릿이 수정되었음 | UpdatePlanTemplate |
| DefaultPlanSet | 기본 플랜이 설정되었음 | SetDefaultPlan |
| PlanCopied | 플랜이 복사되었음 | CopyPlan |
| PlanInheritanceConfigured | 플랜 상속 관계가 설정되었음 | ConfigurePlanInheritance |
7. 플랜 모니터링 및 분석 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| PlanUsageMonitored | 플랜 사용량이 모니터링되었음 | 자동 모니터링 |
| PlanMetricsCalculated | 플랜 지표가 계산되었음 | CalculatePlanMetrics |
| PlanPerformanceAnalyzed | 플랜 성능이 분석되었음 | AnalyzePlanPerformance |
| PlanUsageAlertTriggered | 플랜 사용량 알림이 발생했음 | 자동 알림 시스템 |
| PlanExpirationWarning | 플랜 만료 경고가 발생했음 | 자동 알림 시스템 |
| PlanRecommendationGenerated | 플랜 추천이 생성되었음 | GeneratePlanRecommendation |
8. 플랜 연동 및 통합 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| PlanBillingIntegrated | 플랜이 빌링 시스템과 통합되었음 | IntegratePlanBilling |
| PlanPaymentStatusUpdated | 플랜 결제 상태가 업데이트되었음 | 외부 빌링 시스템 |
| PlanCRMSynced | 플랜이 CRM 시스템과 동기화되었음 | SyncPlanWithCRM |
| PlanAnalyticsExported | 플랜 분석 데이터가 내보내기되었음 | ExportPlanAnalytics |
| PlanEventPublished | 플랜 관련 이벤트가 이벤트 버스에 발행되었음 | 모든 플랜 변경 시 |
정책(Policies)
시스템의 자동화된 비즈니스 규칙입니다.
1. 플랜 데이터 및 스키마 정책
- Plan 도메인 관련 모든 데이터는
plan PostgreSQL 스키마에 저장되어야 함
- 플랜 이름(
name)은 시스템 내에서 고유해야 함
- 플랜 식별자(
id)는 생성 후 변경 불가
- 플랜 코드(
code)가 있는 경우 시스템 내에서 고유해야 함
2. 플랜 유형 및 분류 정책
- 시스템에서 지원하는 표준 플랜 유형은 사전 정의됨 (Therapeutic, Limited Access, Sample, Development, Clinician)
- 플랜은 사용자 유형(환자/내부 운영자)에 따라 분류됨
- 플랜은 서비스 수준(Basic/Standard/Premium)에 따라 분류될 수 있음
- 플랜은 지역별, 언어별로 분류될 수 있음
3. 플랜 생명주기 정책
- 플랜은 ACTIVE, INACTIVE, DEPRECATED, ARCHIVED 상태를 가짐
- 플랜 변경 시 버전 관리를 지원해야 함
- 이전 버전의 플랜을 사용하는 사용자에 대한 마이그레이션 계획이 필요함
- 플랜 마이그레이션은 단계적으로 진행되어야 함
4. 플랜-역할 관계 정책
- 플랜에 여러 역할(Role)을 추가하거나 제거할 수 있어야 함
- 한 플랜 내에서 상충되는 역할이 할당되지 않도록 검증해야 함
- 역할 간 의존성을 확인하여 필수 역할이 포함되도록 해야 함
- 역할 변경 시 플랜의 일관성을 유지해야 함
5. 플랜 기능 및 제한사항 정책
- 각 플랜은 접근 가능한 기능 목록을 명확히 정의해야 함
- 기능별 사용 한도(API 호출 횟수, 데이터 용량)를 설정할 수 있음
- 시간대별 접근 제한을 설정할 수 있음
- 플랜별 서비스 수준 협약(SLA)을 정의할 수 있음
6. 플랜 할당 및 변경 정책
- 사용자는 그룹을 통해 간접적으로 플랜에 연결됨
- 일반적으로 사용자는 특정 시점에 하나의 활성 플랜에만 연결됨
- 모든
USER 타입 사용자는 플랜에 연결되어야 함
- 플랜 변경은 비즈니스 규칙에 따라 검증되어야 함
- 게스트 사용자는
plan.guest.default 또는 지역별 게스트 플랜에 자동 할당되어야 하며, Step-up 완료 시 등록 플랜으로 전환되어야 함
- 게스트 플랜 만료 시 사용자 접근 범위를 제한하고 정리 작업을 예약해야 함
7. 플랜 템플릿 및 프리셋 정책
- 시스템에는 최소 하나의 기본 플랜이 존재해야 함
- 새로운 사용자에게 할당할 기본 플랜을 지정할 수 있음
- 기본 플랜은 삭제할 수 없음
- 자주 사용되는 플랜 구성을 템플릿으로 저장할 수 있음
8. 플랜 모니터링 및 분석 정책
- 플랜별 사용자 수를 실시간으로 모니터링해야 함
- 플랜별 기능 사용률을 추적해야 함
- 플랜 사용량이 임계치를 초과할 때 알림을 발송해야 함
- 플랜 만료 예정 사용자에게 사전 알림을 제공해야 함
9. 보안 및 접근 제어 정책
- 플랜 정보에 대한 접근은 적절한 권한을 가진 사용자만 가능
- 플랜 수정은 관리자 권한을 가진 사용자만 수행할 수 있음
- 민감한 플랜 정보는 암호화하여 저장해야 함
- 모든 플랜 관련 활동을 감사 로그로 기록해야 함
10. 성능 및 캐싱 정책
- 플랜 조회 API 평균 응답 시간: < 100ms
- 플랜 권한 계산 API 평균 응답 시간: < 150ms
- 플랜 정보를 캐싱하여 조회 성능을 향상시켜야 함
- 플랜-역할 매핑 정보를 캐싱해야 함
11. 데이터 제약 정책
- 플랜 이름은 시스템 내에서 고유해야 함
- 플랜 설명의 최대 길이는 1000자로 제한
- 플랜에 할당될 수 있는 역할의 최대 개수는 50개로 제한
- 기본 플랜으로 지정된 플랜은 삭제할 수 없음
명령(Commands)
도메인 이벤트를 발생시키는 사용자 의도나 시스템 동작입니다.
1. 플랜 생명주기 명령
| 명령 | 설명 | 영향 |
|---|
| CreatePlan | 새 플랜 생성 | PlanCreated 또는 PlanValidationFailed 이벤트 발생 |
| GetPlan | 플랜 정보 조회 | PlanRead 이벤트 발생 |
| UpdatePlan | 플랜 정보 수정 | PlanUpdated 또는 PlanValidationFailed 이벤트 발생 |
| DeletePlan | 플랜 삭제 | PlanDeleted 이벤트 발생 |
| ActivatePlan | 플랜 활성화 | PlanActivated 이벤트 발생 |
| DeactivatePlan | 플랜 비활성화 | PlanDeactivated 이벤트 발생 |
| DeprecatePlan | 플랜 폐기 예정 설정 | PlanDeprecated 이벤트 발생 |
| ArchivePlan | 플랜 보관 | PlanArchived 이벤트 발생 |
2. 플랜 유형 및 분류 명령
| 명령 | 설명 | 영향 |
|---|
| CreateTherapeuticPlan | 치료 플랜 생성 | TherapeuticPlanCreated 이벤트 발생 |
| CreateLimitedAccessPlan | 제한 접근 플랜 생성 | LimitedAccessPlanCreated 이벤트 발생 |
| CreateSamplePlan | 샘플 플랜 생성 | SamplePlanCreated 이벤트 발생 |
| CreateDevelopmentPlan | 개발 플랜 생성 | DevelopmentPlanCreated 이벤트 발생 |
| CreateClinicianPlan | 클리니션 플랜 생성 | ClinicianPlanCreated 이벤트 발생 |
| ChangePlanType | 플랜 유형 변경 | PlanTypeChanged 이벤트 발생 |
| AssignPlanCategory | 플랜 카테고리 할당 | PlanCategoryAssigned 이벤트 발생 |
3. 플랜-역할 관계 명령
| 명령 | 설명 | 영향 |
|---|
| AssignRoleToPlan | 플랜에 역할 할당 | RoleAssignedToPlan 또는 PlanRoleValidationFailed 이벤트 발생 |
| RevokeRoleFromPlan | 플랜에서 역할 해제 | RoleRevokedFromPlan 이벤트 발생 |
| ValidatePlanRoles | 플랜 역할 일관성 검증 | PlanRoleConflictDetected 또는 PlanRoleConsistencyRestored 이벤트 발생 |
| ResolvePlanRoleConflict | 플랜 역할 충돌 해결 | PlanRoleConsistencyRestored 이벤트 발생 |
4. 플랜 기능 및 제한사항 명령
| 명령 | 설명 | 영향 |
|---|
| EnablePlanFeature | 플랜 기능 활성화 | PlanFeatureEnabled 이벤트 발생 |
| DisablePlanFeature | 플랜 기능 비활성화 | PlanFeatureDisabled 이벤트 발생 |
| ConfigurePlanLimit | 플랜 사용 한도 설정 | PlanLimitConfigured 이벤트 발생 |
| DefinePlanServiceLevel | 플랜 서비스 수준 정의 | PlanServiceLevelDefined 이벤트 발생 |
5. 플랜 할당 및 변경 명령
| 명령 | 설명 | 영향 |
|---|
| AssignPlanToUser | 사용자에게 플랜 할당 | PlanAssignedToUser 이벤트 발생 |
| AssignGuestPlan | 게스트 사용자에게 게스트 플랜 할당 | GuestPlanAssigned 이벤트 발생 |
| UnassignPlanFromUser | 사용자에게서 플랜 해제 | PlanUnassignedFromUser 이벤트 발생 |
| UpgradePlan | 플랜 업그레이드 | PlanUpgraded 이벤트 발생 |
| DowngradePlan | 플랜 다운그레이드 | PlanDowngraded 이벤트 발생 |
| StartPlanMigration | 플랜 마이그레이션 시작 | PlanMigrationStarted 이벤트 발생 |
| CompletePlanMigration | 플랜 마이그레이션 완료 | PlanMigrationCompleted 이벤트 발생 |
| SchedulePlanChange | 플랜 변경 예약 | PlanChangeScheduled 이벤트 발생 |
| HandleGuestPlanExpiry | 게스트 플랜 만료 처리 | GuestPlanExpired 이벤트 발생 |
| ScheduleGuestPlanCleanup | 게스트 플랜 정리 예약 | GuestPlanCleanupScheduled 이벤트 발생 |
6. 플랜 템플릿 및 프리셋 명령
| 명령 | 설명 | 영향 |
|---|
| CreatePlanTemplate | 플랜 템플릿 생성 | PlanTemplateCreated 이벤트 발생 |
| ApplyPlanTemplate | 플랜 템플릿 적용 | PlanTemplateApplied 이벤트 발생 |
| UpdatePlanTemplate | 플랜 템플릿 수정 | PlanTemplateUpdated 이벤트 발생 |
| SetDefaultPlan | 기본 플랜 설정 | DefaultPlanSet 이벤트 발생 |
| CopyPlan | 플랜 복사 | PlanCopied 이벤트 발생 |
| ConfigurePlanInheritance | 플랜 상속 관계 설정 | PlanInheritanceConfigured 이벤트 발생 |
7. 플랜 모니터링 및 분석 명령
| 명령 | 설명 | 영향 |
|---|
| CalculatePlanMetrics | 플랜 지표 계산 | PlanMetricsCalculated 이벤트 발생 |
| AnalyzePlanPerformance | 플랜 성능 분석 | PlanPerformanceAnalyzed 이벤트 발생 |
| GeneratePlanRecommendation | 플랜 추천 생성 | PlanRecommendationGenerated 이벤트 발생 |
8. 플랜 연동 및 통합 명령
| 명령 | 설명 | 영향 |
|---|
| IntegratePlanBilling | 플랜 빌링 시스템 통합 | PlanBillingIntegrated 이벤트 발생 |
| SyncPlanWithCRM | 플랜 CRM 시스템 동기화 | PlanCRMSynced 이벤트 발생 |
| ExportPlanAnalytics | 플랜 분석 데이터 내보내기 | PlanAnalyticsExported 이벤트 발생 |
액터(Actors)
시스템과 상호작용하는 주체들입니다.
내부 액터
| 액터 | 설명 | 주요 명령 |
|---|
| Plan Manager | 플랜 관리자 | 플랜 CRUD, 플랜 유형 관리, 플랜-역할 매핑, 플랜 템플릿 관리 |
| System Admin | 시스템 관리자 | 모든 플랜 관리 권한, 플랜 정책 설정, 기본 플랜 관리 |
| Business Analyst | 비즈니스 분석가 | 플랜 성능 분석, 플랜 추천, 플랜 지표 조회 |
| Product Manager | 제품 관리자 | 플랜 기능 정의, 플랜 서비스 수준 설정, 플랜 로드맵 관리 |
외부 액터 (시스템)
| 액터 | 설명 | 주요 명령 |
|---|
| IAM Service | 권한 관리 시스템 | 플랜-역할 매핑 조회, 플랜 기반 권한 계산 |
| Group Service | 그룹 관리 시스템 | 그룹-플랜 연결 정보 조회 |
| User Service | 사용자 정보 시스템 | 사용자-플랜 할당 정보 조회 |
| Billing Service | 빌링 시스템 | 플랜 결제 상태 업데이트, 플랜 과금 정보 연동 |
| CRM Service | CRM 시스템 | 플랜 고객 정보 동기화 |
| Analytics Service | 분석 시스템 | 플랜 사용 데이터 수집, 플랜 성능 지표 제공 |
| Notification Service | 알림 시스템 | 플랜 관련 알림 발송 |
| Audit Service | 감사 로그 시스템 | 플랜 관련 감사 로그 기록 |
집계(Aggregates)
연관된 엔티티와 값 객체들의 클러스터입니다.
Plan 집계
- 루트: Plan
- 엔티티: PlanRole (연관 테이블), PlanFeature, PlanLimit
- 값 객체: PlanName (string, unique), PlanCode (string, unique), Description, PlanType, PlanStatus, ServiceLevel
- 참조: Role (IAM 도메인, 다대다)
- 불변식:
- Plan 이름은 고유해야 함
- Plan은 ACTIVE, INACTIVE, DEPRECATED, ARCHIVED 상태를 가짐
- Plan에 할당된 Role 목록 관리
- Plan 기능과 제한사항의 일관성 유지
PlanTemplate 집계
- 루트: PlanTemplate
- 엔티티: TemplatePlanRole, TemplateFeature
- 값 객체: TemplateName, TemplateVersion, TemplateDescription
- 참조: Plan (생성 기반), Role (IAM 도메인)
- 불변식:
- Template 이름은 고유해야 함
- Template 버전 관리 일관성
- Template 기반 Plan 생성의 일관성
PlanAssignment 집계
- 루트: PlanAssignment
- 엔티티: AssignmentHistory
- 값 객체: AssignmentDate, ExpirationDate, AssignmentStatus
- 참조: Plan, User (User 도메인)
- 불변식:
- 사용자는 특정 시점에 하나의 활성 플랜만 가짐
- 플랜 할당 이력의 일관성
- 플랜 변경 시 마이그레이션 규칙 준수
PlanMetrics 집계
- 루트: PlanMetrics
- 엔티티: UsageStatistics, PerformanceMetrics
- 값 객체: MetricDate, UserCount, FeatureUsage, SatisfactionScore
- 참조: Plan
- 불변식:
- 지표 데이터의 정확성
- 시계열 데이터의 일관성
- 집계 데이터의 무결성
핫스팟 및 해결책
1. 플랜-역할 매핑의 복잡성
- 문제: 플랜과 역할 간의 복잡한 매핑 관계로 인한 권한 계산 복잡도 증가
- 해결책:
- 명확한 매핑 규칙: 플랜 유형별 표준 역할 세트 정의
- 검증 로직 강화: 플랜-역할 할당 시 충돌 검증 및 의존성 확인
- 캐싱 전략: 플랜-역할 매핑 정보 캐싱으로 성능 향상
2. 플랜 마이그레이션의 복잡성
- 문제: 플랜 변경 시 기존 사용자들의 서비스 연속성 보장 어려움
- 해결책:
- 단계적 마이그레이션: 점진적 플랜 전환으로 서비스 중단 최소화
- 백워드 호환성: 이전 플랜 기능의 호환성 유지
- 롤백 메커니즘: 마이그레이션 실패 시 롤백 기능 제공
3. 플랜 성능 모니터링
- 문제: 실시간 플랜 사용량 모니터링과 분석의 성능 부담
- 해결책:
- 비동기 처리: 지표 계산과 분석을 비동기로 처리
- 배치 처리: 대량 데이터 분석을 배치 작업으로 수행
- 캐싱 활용: 자주 조회되는 지표 정보 캐싱
4. 외부 시스템 연동
- 문제: Billing, CRM 등 외부 시스템과의 연동으로 인한 결합도 증가
- 해결책:
- 이벤트 기반 통신: 플랜 변경 이벤트를 통한 비동기 연동
- API 계약 관리: 명확한 API 계약 정의 및 버전 관리
- 회복성 설계: 외부 시스템 장애 시 대체 로직 구현
5. 플랜 데이터 일관성
- 문제: 분산된 플랜 관련 데이터의 일관성 유지 어려움
- 해결책:
- 트랜잭션 관리: 플랜 변경 시 관련 데이터의 트랜잭션 일관성 보장
- 이벤트 소싱: 플랜 변경 이벤트를 통한 데이터 일관성 추적
- 보상 트랜잭션: 분산 트랜잭션 실패 시 보상 로직 구현
6. 플랜 확장성
- 문제: 새로운 플랜 유형이나 기능 추가 시 시스템 확장성 문제
- 해결책:
- 플러그인 아키텍처: 새로운 플랜 유형을 플러그인 방식으로 추가
- 설정 기반 관리: 플랜 기능과 제한사항을 설정으로 관리
- 템플릿 시스템: 플랜 템플릿을 통한 신속한 플랜 생성
7. 플랜 보안
- 문제: 플랜 정보의 보안과 접근 제어
- 해결책:
- 세밀한 권한 제어: 플랜 관리 기능별 세밀한 권한 설정
- 데이터 암호화: 민감한 플랜 정보의 암호화 저장
- 감사 로깅: 모든 플랜 관련 활동의 상세 로깅
변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|
| 0.1.0 | 2025-01-27 | bok@weltcorp.com | 최초 문서 생성 (IAM 도메인에서 분리) |
| 0.2.0 | 2025-01-27 | bok@weltcorp.com | Group-Plan 독립성 반영: 바운디드 컨텍스트 수정, PlanAssignment 집계에서 Group 참조 제거 |
| 0.3.0 | 2025-10-27 | assistant | 게스트 플랜 이벤트/명령 및 만료/정리 정책 추가 |