Site 도메인 모델
1. Domain Events
1.1 Internal Events
SiteRegistrationRequested
- Payload:
registrationId,name,userRegistrationId,requestedBy,requestedAt - 발행 시점: RequestSiteRegistration 커맨드 성공 시
- 발행: SiteRegistration
- 구독: -
SiteAdminUserCreated
- Payload:
userRegistrationId,registrationId,siteId,email,groupName,createdAt - 발행 시점: SiteRegistrationRequested 발생 시 (자동)
- 발행: SiteRegistration
- 구독: -
SiteRegistrationApproved
- Payload:
registrationId,approvedBy,approvedAt - 발행 시점: ApproveSiteRegistration 커맨드 성공 시
- 발행: SiteRegistration
- 구독: -
SiteCreated
- Payload:
siteId,name,code,description,clinicalResearch,managedByCrm,matchingKeywords,registrationId,createdAt - 발행 시점: CreateSite 커맨드 성공 시
- 발행: Site
- 구독: -
SiteUpdated
- Payload:
siteId,name,code,description,clinicalResearch,managedByCrm,matchingKeywords,updatedBy,updatedAt - 발행 시점: UpdateSite 커맨드 성공 시
- 발행: Site
- 구독: -
SiteSoftDeleted
- Payload:
siteId,deletedBy,deletedAt - 발행 시점: SoftDeleteSite 커맨드 성공 시
- 발행: Site
- 구독: -
SiteHardDeleted
- Payload:
siteId,deletedBy,deletedAt - 발행 시점: HardDeleteSite 커맨드 성공 시
- 발행: Site
- 구독: -
1.2 External Events
Outbound: SiteAdminUserCreationRequested
- Payload:
userRegistrationId,siteRegistrationId,email,name,phoneNumber,roleIds - Target: IAM Context
2. Entities
SiteRegistration (Aggregate Root)
id: 등록 요청 고유 식별자 (registrationId)name: 사이트명code: 사이트 코드 (선택)description: 사이트 설명 (선택)clinicalResearch: 임상연구 여부 (Boolean)managedByCrm: CRM 관리 여부 (Boolean)matchingKeywords: 매칭 키워드 배열siteAdminUser: 관리자 사용자 등록 정보 (SiteAdminUser, 단일)approved: 승인 여부 (Boolean)approvedBy: 승인자 사용자 ID (IAM userId)approvedAt: 승인 일시requestedBy: 요청자 사용자 ID (IAM userId)requestedAt: 요청 일시createdAt: 생성일updatedAt: 수정일
Site (Aggregate Root)
id: 사이트 고유 식별자name: 사이트명 (필수)code: 사이트 코드 (선택)description: 사이트 설명 (선택)clinicalResearch: 임상연구 여부 (Boolean)managedByCrm: CRM 관리 여부 (Boolean)matchingKeywords: 매칭 키워드 배열registrationId: 등록 요청 ID (선택, 연결된 경우)deletedAt: 삭제 일시 (소프트 삭제용)createdAt: 생성일updatedAt: 수정일
SiteAdminUser
id: 사용자 등록 ID (userRegistrationId)registrationId: 소속 사이트 등록 요청 IDemail: 이메일 주소 (고유)name: 사용자 이름phoneNumber: 전화번호userId: IAM 사용자 ID (IAM Context에서 생성 후 연결)groupName: 그룹명 (medi.site-admin)roles: 역할(권한)createdAt: 생성일updatedAt: 수정일
3. Enums
현재 Site 도메인에는 별도의 Enum이 필요하지 않습니다.
4. Value Objects
SiteName
name: 사이트명 (String, 필수, 최대 255자)- 동등성: name 값이 동일하면 같은 객체
MatchingKeywords
keywords: 키워드 배열 (String[])- 동등성: keywords 배열의 모든 요소가 동일하면 같은 객체
AdminUserInfo
email: 이메일 주소 (String, 고유)name: 사용자 이름 (String)phoneNumber: 전화번호 (String)roleIds: 역할 (String[])- 동등성: email이 동일하면 같은 객체
- 용도: 사이트 등록 요청 시 관리자 사용자 정보 전달
5. Aggregates
SiteRegistration
Methods:
requestRegistration(name, requestedBy): 사이트 등록 요청 생성approve(approvedBy): 등록 요청 승인reject(rejectedBy): 등록 요청 거부canApprove(): 승인 가능 여부 확인isApproved(): 승인 여부 확인getAdminUser(): 관리자 사용자 등록 정보 조회getUserRegistrationId(): 사용자 등록 ID 조회
Repository:
findById(id): ID로 등록 요청 조회findByApproved(approved): 승인 여부로 조회findPendingRegistrations(): 대기 중인 등록 요청 목록 조회 (approved = false)save(registration): 등록 요청 저장
Events Published:
SiteRegistrationRequestedSiteAdminUserCreatedSiteRegistrationApproved
Site
Methods:
createSite(name, code, description, clinicalResearch, managedByCrm, matchingKeywords, registrationId): 사이트 생성updateSite(name, code, description, clinicalResearch, managedByCrm, matchingKeywords, updatedBy): 사이트 정보 수정softDelete(deletedBy): 사이트 소프트 삭제 (deletedAt 설정)hardDelete(deletedBy): 사이트 하드 삭제 (물리적 제거)isDeleted(): 삭제 여부 확인getName(): 사이트명 조회getMatchingKeywords(): 매칭 키워드 조회
Repository:
findById(id): ID로 사이트 조회findByName(name): 사이트명으로 조회findByRegistrationId(registrationId): 등록 요청 ID로 조회findActiveSites(): 활성 사이트 목록 조회 (deletedAt이 null)findByClinicalResearch(clinicalResearch): 임상연구 여부로 조회findByManagedByCrm(managedByCrm): CRM 관리 여부로 조회save(site): 사이트 저장delete(siteId): 사이트 물리 삭제
Events Published:
SiteCreatedSiteUpdatedSiteSoftDeletedSiteHardDeleted
6. Error Codes
4xx - Client Errors
4001SITE_NAME_REQUIRED (400): 사이트명은 필수 항목입니다4002DUPLICATE_ADMIN_EMAIL (409): 관리자 사용자 이메일이 중복되었습니다4003REGISTRATION_ALREADY_APPROVED (409): 이미 승인된 등록 요청입니다4004REGISTRATION_NOT_PENDING (400): 대기 중인 등록 요청이 아닙니다4005ADMIN_USER_REQUIRED (400): 관리자 사용자 정보가 필요합니다4006SITE_NOT_FOUND (404): 사이트를 찾을 수 없습니다4007SITE_ALREADY_DELETED (409): 이미 삭제된 사이트입니다4008UNAUTHORIZED_SITE_OPERATION (403): 사이트 작업 권한이 없습니다4009REGISTRATION_NOT_FOUND (404): 등록 요청을 찾을 수 없습니다
5xx - Server Errors
5001INTERNAL_ERROR (500): 내부 서버 오류
변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|---|---|---|
| 0.58.0 | 2025-12-17 | dalia@weltcorp.com | 최초 작성 |