Access Code 바운디드 컨텍스트
용어 사용 안내: 본 문서에서는 다음과 같이 용어를 통일하여 사용합니다.
- 일반 텍스트 설명: "접근 코드"
- 파일명, 경로, URL: "access-code"
- 클래스명, 애그리게잇, 타입명: "AccessCode"
1. 컨텍스트 정의
AccessCode 도메인은 일회성 또는 제한된 시간 동안 유효한 접근 코드의 생성, 관리, 검증을 담당하는 바운디드 컨텍스트입니다.
1.1 주요 책임
- 접근 코드 생성 및 발급
- 접근 코드 유효성 검증
- 접근 코드 만료 관리
- 접근 코드 사용 이력 관리
- 접근 코드 정책 관리
- 대량 접근 코드 관리
- 보험사 표준 코드 포맷 지원
- 견본품/데모/개발용 접근 코드 관리
- 접근 코드 상태 관리 및 철회
- 접근 코드 조회 서비스 제공
- 다양한 발급 출처(진료 대시보드, OCR 진료비 서류, 보험사) 관리
- 코드 입력 형식 검증 및 처리
- 코드 유형별 관리(일반, 견본품용, 데모용, 개발용)
- 사용자 인터페이스 지원(하이픈 포함 형식 표시 등)
1.2 도메인 용어
본 바운디드 컨텍스트에서 사용되는 도메인 용어에 대한 자세한 정의는 Access Code 도메인 용어집을 참조하세요.
주요 핵심 개념:
- Access Code: 시스템 접근을 위한 일회성 또는 시간 제한 코드
- Code Status: 코드의 현재 상태 (대기, 활성, 사용됨, 만료됨, 차단됨, 철회됨)
- Code Type: 코드의 유형 (일반, 견본품용, 데모용, 개발용)
- Issue Source: 코드 발급 출처 유형(진료 대시보드, OCR 진료비 서류, 보험사 등)
- Batch: 대량으로 생성된 접근 코드 묶음
2. 컨텍스트 경계
2.1 상위 컨텍스트
- Auth Domain: 인증/인가 처리
- User Domain: 사용자 관리
2.2 하위 컨텍스트
- Notification Domain: 코드 전송
- Audit Domain: 사용 이력 기록
2.3 외부 시스템
- SMS Gateway: SMS를 통한 코드 전송
- Email Service: 이메일을 통한 코드 전송
- TimeMachine:
- 코드 만료 시간 관리
- 가상 시간 관리
- 코드 생성 시 가상 시간 시작일 설정
- 코드 사용 시 사용자 가상 시간 초기화
- 사용자별 TimeMachine 기능 활성화/비활성화
- Clinic Dashboard System: 진료 대시보드 시스템
- OCR Processing Service: 진료비 서류 OCR 처리 서비스
- Insurance Code Validation API: 보험사 코드 유효성 검증 API
3. 컨텍스트 매핑
3.1 Auth Domain과의 관계 (Customer-Supplier)
3.2 Notification Domain과의 관계 (Published Language)
3.3 보험사 발급 코드의 흐름 (Separate Ways + Anti-corruption Layer)
3.4 진료 대시보드 발급 코드의 흐름 (Partnership)
3.5 OCR 진료비 서류 발급 코드의 흐름 (Anti-corruption Layer)
3.6 코드 입력 및 형식 검증 흐름 (Anti-corruption Layer)
3.7 TimeMachine과의 관계 (Customer-Supplier)
4. 발급 출처별 책임 구분
4.1 접근 코드 발급 책임
- 진료 대시보드: 의료진이 환자 정보와 진료 내역을 기반으로 접근 코드 발급
- OCR 처리 서비스: 사용자가 업로드한 진료비 서류를 분석하여 자동으로 접근 코드 발급
- 보험사: 자체 시스템에서 접근 코드를 생성하여 사용자에게 제공
4.2 접근 코드 관리 책임
- AccessCode 도메인: 모든 출처에서 발급된 코드의 생명주기 관리
- 운영 매니저: 코드 상태 변경, 만료 관리, 문제 해결 등 수동 관리 작업
4.3 발급 출처별 메타데이터 관리
- 진료 대시보드: 진료소 ID, 의사 ID, 환자 ID, 진료 예약 ID
- OCR 처리 서비스: 진료비 상세내역 ID, 병원명, 진료비 발생일, 진료비 금액
- 보험사: 보험사 ID, 보험 증권 번호, 보험금 청구 ID
5. 도메인 이벤트
5.1 발행하는 이벤트
- AccessCodeCreated: 새로운 접근 코드 생성
- AccessCodeActivated: 접근 코드 활성화
- AccessCodeDeactivated: 접근 코드 비활성화
- AccessCodeExpired: 접근 코드 만료
- AccessCodeDeleted: 접근 코드 삭제
- AccessCodeValidated: 접근 코드 검증 완료
- AccessCodeRejected: 잘못된 코드 입력
- AccessCodeUsed: 접근 코드 사용 완료
- AccessCodeBlocked: 접근 코드 차단
- AccessCodeUnblocked: 접근 코드 차단 해제
- AccessCodeRevoked: 접근 코드 철회
- AccessCodeStatusChanged: 접근 코드 상태 변경
- InsuranceCodeReceived: 사용자가 보험사 코드 입력
- InsuranceCodeValidated: 보험사 코드 유효성 검증 완료
- InsuranceCodeRejected: 보험사 코드 유효성 검증 실패
- AccessCodeIssuedForSample: 견본품용 코드 발급
- AccessCodeIssuedForDemo: 데모용 코드 발급
- AccessCodeIssuedForDevelopment: 개발용 코드 발급
- AccessCodeBatchCreated: 대량 코드 일괄 생성
- AccessCodeBulkIssued: 대량 코드 일괄 발급
- AccessCodeBatchDeactivated: 대량 코드 일괄 비활성화
- AccessCodePolicyUpdated: 정책 변경
- AccessCodeStatsUpdated: 사용 통계 업데이트
- AccessCodeMaxAttemptsExceeded: 최대 실패 횟수 초과
- AllAccessCodesRetrieved: 모든 코드 조회 완료
- ActiveAccessCodesRetrieved: 활성 코드 조회 완료
- UsedAccessCodesRetrieved: 사용 중인 코드 조회 완료
- AccessCodeIssuedFromClinicDashboard: 진료 대시보드에서 코드 발급
- AccessCodeIssuedFromOCRInvoice: OCR 진료비 서류에서 코드 발급
- AccessCodeIssuedByInsurance: 보험사에서 코드 발급
- ExternalAPICallFailed: 외부 API 호출 실패
- ExternalAPIResponseInvalid: 유효하지 않은 외부 API 응답
- AccessCodeMetadataUpdated: 코드 메타데이터 업데이트
- AccessCodeInputValidated: 코드 입력 형식 검증 완료
- AccessCodeExpiredRejected: 만료된 코드 거부됨
- AccessCodeInvalidRejected: 유효하지 않은 코드 거부됨
- AccessCodeMetadataValidationFailed: 코드 메타데이터 검증 실패
- AccessCodeIssueDeniedDuringTreatment: 치료 중 접근 코드 발급 거부됨
- AccessCodeReceivedFromInsurance: 보험사로부터 코드 수신
- DailyUsageReportGenerated: 일별 사용 보고서 생성
- WeeklyUsageReportGenerated: 주별 사용 보고서 생성
- MonthlyUsageReportGenerated: 월별 사용 보고서 생성
- SourceUsageReportGenerated: 출처별 사용 보고서 생성
- GroupUsageReportGenerated: 그룹별 사용 보고서 생성
- IssueSourceUsageReportGenerated: 발급 출처별 사용 보고서 생성
- ExpiringAccessCodesReportGenerated: 만료 예정 코드 보고서 생성
- AbnormalAttemptsReportGenerated: 비정상 시도 보고서 생성
- SuccessFailureRatioReportGenerated: 성공/실패 비율 보고서 생성
- AccessCodeIssuedNotificationSent: 코드 발급 알림 전송
- BatchCompletionNotificationSent: 대량 발급 완료 알림 전송
- AccessCodeExpirationNotificationSent: 만료 예정 코드 알림 전송
- AbnormalAttemptsNotificationSent: 비정상 시도 알림 전송
- BatchFailureNotificationSent: 배치 처리 실패 알림 전송
- AccessCodeCreatedWithTimeMachine: TimeMachine 옵션이 활성화된 접근 코드 생성
- TimeMachineEnabledForUser: 코드 사용으로 사용자에게 TimeMachine 기능 활성화
- VirtualTimeInitializedForUser: 코드에 지정된 가상 시간으로 사용자 시간 초기화
- AccessCodeValidatedWithTimeMachine: TimeMachine 옵션이 활성화된 코드 검증 완료
- AccessCodeUsedWithTimeMachine: TimeMachine 옵션이 활성화된 코드 사용 완료
- TimeMachineSettingsChanged: 접근 코드의 TimeMachine 설정 변경
5.2 구독하는 이벤트
- UserCreated: 새로운 사용자 생성
- UserDeactivated: 사용자 비활성화
- NotificationDelivered: 알림 전송 완료
- NotificationFailed: 알림 전송 실패
- GroupUpdated: 그룹 정보 업데이트
- SiteUpdated: 출처 사이트 정보 업데이트
- ClinicAppointmentCreated: 진료 예약 생성
- ClinicAppointmentUpdated: 진료 예약 업데이트
- ClinicAppointmentCancelled: 진료 예약 취소
- OCRInvoiceProcessed: OCR 진료비 서류 처리 완료
- OCRInvoiceValidated: OCR 진료비 서류 검증 완료
- VirtualTimeCreated: 가상 시간이 생성됨
- VirtualTimeChanged: 가상 시간이 변경됨
- TimeMachineEnabled: TimeMachine 기능이 활성화됨
- TimeMachineDisabled: TimeMachine 기능이 비활성화됨
6. 애그리게잇
6.1 AccessCode 애그리게잇
- 루트: AccessCode
- 엔티티: AccessCodeMetadata
- 값 객체: CodeValue, ExpirationTime, UsageCount, SourceSiteId, IssuerAccountId, GroupId, PlanId, TreatmentPeriod, UsagePeriod, IssueSource, VerificationAttemptCount, TimeMachineSettings
- 불변식:
- 코드 값은 유일해야 함
- 만료 시간은 생성 시간보다 이후여야 함
- 사용 횟수는 음수가 될 수 없음
- 치료기간은 유효한 기간이어야 함
- 사용기간은 만료기한을 초과할 수 없음
- 발급자 계정 ID는 유효한 계정이어야 함
- 그룹 ID가 지정된 경우, 유효한 그룹이어야 함
- 플랜 ID가 지정된 경우, 유효한 플랜이어야 함
- 발급 출처는 유효한 값이어야 함
- 검증 시도 횟수는 정책 제한을 초과할 수 없음
- TimeMachine 사용 설정이 true인 경우, 가상 시간 시작일이 지정되어야 함
- 가상 시간 시작일은 코드 생성일로부터 1년 이내여야 함
6.2 AccessCodeBatch 애그리게잇
- 루트: AccessCodeBatch
- 엔티티: BatchMetadata
- 값 객체: BatchSize, BatchStatus, SourceSiteId, IssuerAccountId, GroupId, PlanId, CommonExpirationTime, CommonTreatmentPeriod, CommonUsagePeriod, IssueSource
- 불변식:
- 배치 크기는 정책 제한을 초과할 수 없음 (최대 10,000개)
- 모든 코드는 동일한 정책을 따름
- 발급자 계정 ID는 유효한 계정이어야 함
- 발급 출처는 유효한 값이어야 함
- 동일 그룹에 대한 일일 배치 생성 한도를 준수해야 함 (최대 5개)
6.3 AccessCodePolicy 애그리게잇
- 루트: AccessCodePolicy
- 값 객체: ValidationRules, SecurityRules, IssueSourceRules, FormatRules, ExpirationRules, AttemptRules
- 불변식:
- 정책 규칙은 일관성을 유지해야 함
- 보안 규칙은 최소 요구사항을 충족해야 함
- 발급 출처별 규칙은 명확히 정의되어야 함
- 형식 규칙은 시스템 전체에서 일관되게 적용되어야 함
- 만료 규칙은 유효한 기간 제한을 포함해야 함
- 시도 규칙은 보안 정책에 부합해야 함
6.4 StandardFormatPolicy 애그리게잇
- 루트: StandardFormatPolicy
- 값 객체: FormatPattern, ValidationRules, IssueSourceFormatRules, DisplayFormatRules
- 불변식:
- 표준 포맷 정책은 시스템 전체에서 하나만 존재해야 함
- 포맷 패턴은 정규식으로 검증 가능해야 함
- 모든 보험사 코드는 표준 포맷 정책을 준수해야 함
- 발급 출처별 포맷 규칙은 명확히 정의되어야 함
- 표시 형식 규칙은 사용자 인터페이스에 일관되게 적용되어야 함
6.5 IssueSourceMetadata 애그리게잇
- 루트: IssueSourceMetadata
- 값 객체: IssueSourceType, ClinicMetadata, OCRMetadata, InsuranceCodeMetadata
- 불변식:
- 발급 출처 타입은 유효한 값이어야 함
- 메타데이터는 발급 출처 타입에 맞게 제공되어야 함
- 진료 대시보드 메타데이터는 필수 필드를 포함해야 함 (진료소 ID, 의사 ID, 환자 ID, 진료 예약 ID)
- OCR 메타데이터는 필수 필드를 포함해야 함 (진료비 상세내역 ID, 병원명, 진료비 발생일, 진료비 금액)
- 보험사 코드 메타데이터는 필수 필드를 포함해야 함 (보험사 ID, 보험 증권 번호, 보험금 청구 ID)
6.6 ExternalAPICall 애그리게잇
- 루트: ExternalAPICall
- 값 객체: APIRequestDetails, APIResponseDetails, CallStatus, RetryCount, ErrorDetails
- 불변식:
- API 호출은 재시도 정책을 따름
- 최대 재시도 횟수는 정책을 초과할 수 없음
- 성공한 호출은 유효한 응답 데이터를 포함해야 함
6.7 CodeInputFormat 애그리게잇
- 루트: CodeInputFormat
- 값 객체: RawInput, NormalizedInput, InputValidationResult
- 불변식:
- 정규화된 입력은 표준 형식 규칙을 따라야 함
- 입력 검증 결과는 명확한 오류 메시지를 포함해야 함
- 대소문자 구분 없이 처리되어야 함
6.8 ReportGeneration 애그리게잇
- 루트: ReportGeneration
- 엔티티: ReportConfiguration
- 값 객체: ReportType, ReportPeriod, ReportFilters, ReportFormat
- 불변식:
- 보고서 유형은 시스템에서 지원하는 유형이어야 함
- 보고서 기간은 유효한 날짜 범위여야 함
- 보고서 형식은 지원되는 형식(PDF, Excel 등)이어야 함
7. 주요 명령
7.1 코드 관리 명령
- CreateAccessCode: 새로운 접근 코드 생성
- ActivateAccessCode: 접근 코드 활성화
- DeactivateAccessCode: 접근 코드 비활성화
- DeleteAccessCode: 접근 코드 삭제
- ValidateAccessCode: 접근 코드 유효성 검증
- RevokeAccessCode: 사용 중인 접근 코드 철회
- ChangeAccessCodeStatus: 접근 코드 상태 변경
- ResetFailureCount: 실패 횟수 초기화
7.2 코드 검증 명령
- VerifyAccessCode: 접근 코드 검증
- ValidateStandardFormat: 표준 포맷 검증
- VerifyInsuranceCode: 보험사 코드 검증
- ValidateInsuranceCodeFormat: 보험사 코드 포맷 검증
- CallExternalValidationAPI: 외부 API를 통한 보험사 코드 유효성 검증
- ValidateAccessCodeInput: 사용자 입력 코드 형식 검증
- NormalizeAccessCodeInput: 코드 입력 정규화(공백 제거, 대소문자 처리)
- HandleExceededAttempts: 허용 시도 횟수 초과 처리
7.3 코드 발급 명령
- IssueAccessCodeForSample: 견본품용 접근 코드 발급
- IssueAccessCodeForDemo: 데모용 접근 코드 발급
- IssueAccessCodeForDevelopment: 개발용 접근 코드 발급
- IssueAccessCodeFromClinicDashboard: 진료 대시보드에서 코드 발급
- IssueAccessCodeFromOCRInvoice: OCR 인식 진료비 서류에서 코드 발급
- IssueAccessCodeByInsurance: 보험사에서 코드 발급
- CheckPatientExistingCodes: 환자의 기존 발급 코드 확인
7.4 배치 관리 명령
- CreateBatchAccessCodes: 대량 코드 일괄 생성
- IssueBulkAccessCodes: 대량 코드 일괄 발급
- DeactivateBatchAccessCodes: 배치 단위 접근 코드 비활성화
- UpdateAccessCodePolicy: 접근 코드 정책 업데이트
- GenerateAccessCodeStats: 접근 코드 통계 생성
7.5 조회 관리 명령
- GetAllAccessCodes: 모든 접근 코드 조회
- GetActiveAccessCodes: 활성 접근 코드 조회
- GetUsedAccessCodes: 사용된 접근 코드 조회
- FilterAccessCodesByStatus: 상태별 코드 필터링
- FilterAccessCodesByIssueSource: 발급 출처별 코드 필터링
- FilterAccessCodesByGroup: 그룹별 코드 필터링
7.6 보고서 관리 명령
- GenerateDailyUsageReport: 일별 사용 보고서 생성
- GenerateWeeklyUsageReport: 주별 사용 보고서 생성
- GenerateMonthlyUsageReport: 월별 사용 보고서 생성
- GenerateSourceUsageReport: 출처별 사용 보고서 생성
- GenerateGroupUsageReport: 그룹별 사용 보고서 생성
- GenerateIssueSourceUsageReport: 발급 출처별 사용 보고서 생성
- GenerateExpiringAccessCodesReport: 만료 예정 코드 보고서 생성
- GenerateAbnormalAttemptsReport: 비정상 시도 보고서 생성
- GenerateSuccessFailureRatioReport: 성공/실패 비율 보고서 생성
- ExportReportToPDF: 보고서 PDF 내보내기
- ExportReportToExcel: 보고서 Excel 내보내기
7.7 알림 관리 명령
- SendAccessCodeIssuedNotification: 코드 발급 알림 전송
- SendBatchCompletionNotification: 대량 발급 완료 알림 전송
- SendAccessCodeExpirationNotification: 만료 예정 코드 알림 전송
- SendAbnormalAttemptsNotification: 비정상 시도 알림 전송
- SendBatchFailureNotification: 배치 처리 실패 알림 전송
- ConfigureNotificationPreferences: 알림 설정 구성
7.8 UI 관리 명령
- RenderAccessCodeWithHyphens: 하이픈 포함 형식으로 코드 표시
- DisplayAccessCodeResult: 코드 검증 결과 표시
- DisplayAccessCodeInputError: 사용자 친화적 오류 메시지 표시
- DisplayAdminDashboard: 관리자 대시보드 표시
- PerformBatchOperationConfirmation: 대량 작업 수행 확인 요청
- DisplayUsageStatistics: 사용 통계 시각화
8. 기술 스택
- NestJS
- TypeScript
- PostgreSQL (코드 저장 및 관리)
- Redis (코드 캐싱 및 만료 관리)
- GCP Pub/Sub (이벤트 메시징)
- Kubernetes (분산 처리 및 확장성)
- Elastic Stack (모니터링 및 로깅)
- Google Cloud Vision API (OCR 처리)
- RESTful API 및 WebSocket (진료 대시보드 통합)
- Axios/Fetch (외부 API 통신)
- Circuit Breaker (외부 API 장애 대응)
9. 핫스팟 및 해결책
9.1 성능
- 대량 생성 시 비동기 및 병렬 처리
- 검증 작업에 캐시 레이어 도입
- 복합 인덱스를 통한 조회 쿼리 최적화
- OCR 처리 결과 캐싱 및 점진적 처리
- 진료 대시보드 요청 우선순위 부여
- 외부 API 응답 캐싱
- 외부 API 타임아웃 최적화
9.2 보안
- 코드 암호화 저장 및 접근 로깅
- Rate Limiting을 통한 무차별 대입 방지
- RBAC를 통한 발급자 권한 검증
- 허용된 출처 사이트 화이트리스트 관리
- OCR 데이터 전송 및 저장 시 암호화
- 진료 대시보드 통신 TLS 1.3 이상 적용
- 외부 API 통신 암호화 및 인증 강화
- API 키 및 시크릿 안전한 관리
9.3 확장성
- 분산 락 적용 및 큐 시스템 도입
- 데이터 샤딩 및 아카이빙
- 그룹별 제한 관리를 위한 분산 카운터 사용
- 발급 출처별 독립적 스케일링
- OCR 처리량 증가에 따른 자동 확장
- 외부 API 호출 대역폭 관리
9.4 표준 코드 포맷 검증
- 고성능 정규식 기반 검증 엔진
- 패턴 매칭 캐싱
- 오류 코드별 상세 피드백 제공
- 발급 출처별 맞춤형 검증 규칙 적용
- 보험사 코드 포맷 검증 전처리
9.5 코드 관리 UI
- 운영 매니저를 위한 관리 대시보드
- 코드 일괄 관리 인터페이스
- 실시간 상태 모니터링
- 코드 사용 현황 통계 시각화
- 발급 출처별 필터링 및 검색 기능
- 외부 API 호출 상태 모니터링
9.6 발급 출처 통합
- OCR 처리 지연 시 비동기 알림 제공
- 진료 대시보드 통합 부하 분산
- 외부 API 장애 시 대체 검증 전략
- 보험사 코드 입력 오류 자동 수정 지원
9.7 데이터 일관성
- 발급 출처 데이터 불일치 감지 및 해결 메커니즘
- 진료 정보 변경 시 관련 코드 자동 업데이트
- OCR 데이터 검증 단계 추가
- 외부 API 응답 데이터 검증 및 정규화
9.8 외부 API 장애 대응
- Circuit Breaker 패턴 적용
- Fallback 메커니즘 구현
- 재시도 정책 최적화
- 분산 트레이싱을 통한 장애 지점 식별
- 외부 API 상태 모니터링 및 알림
10. 변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|---|---|---|
| 0.1.0 | 2025-03-16 | bok@weltcorp.com | 최초 작성 |