@startuml !theme mono title 검증 완료 내부 시퀀스 participant "API Gateway<>" as Gateway participant "MeetingController" as Controller participant "MeetingService" as Service participant "Meeting" as Domain participant "ValidationService" as ValidationService participant "MeetingRepository" as Repository database "PostgreSQL<>" as DB database "Redis Cache<>" as Cache queue "Event Hub<>" as EventHub Gateway -> Controller: POST /api/meetings/{id}/validate activate Controller Controller -> Service: validateMeeting(meetingId) activate Service Service -> Repository: findById(meetingId) activate Repository Repository -> DB: 회의 정보 조회\n(회의ID 기준) activate DB DB --> Repository: meeting_row deactivate DB Repository --> Service: Meeting entity deactivate Repository Service -> ValidationService: performValidation(meeting) activate ValidationService ValidationService -> ValidationService: validateStructure() note right of ValidationService 구조 검증: - 필수 섹션 존재 - 섹션 순서 - 데이터 완정성 end note ValidationService -> ValidationService: validateContent() note right of ValidationService 내용 검증: - 필수 항목 기입 - 형식 준수 - 참조 무결성 end note ValidationService -> ValidationService: validateBusiness() note right of ValidationService 비즈니스 규칙: - 참석자 서명 - Todo 할당 완료 - 첨부파일 검증 end note ValidationService --> Service: ValidationResult deactivate ValidationService alt validation passed Service -> Domain: markAsValidated() activate Domain Domain -> Domain: changeStatus(VALIDATED) Domain --> Service: validated Meeting deactivate Domain Service -> Repository: save(meeting) activate Repository Repository -> DB: 회의 상태 업데이트\n(상태='검증완료') activate DB DB --> Repository: affected_rows deactivate DB Repository --> Service: savedMeeting deactivate Repository Service -> Cache: SET meeting:{id}\n(TTL: 10분) activate Cache note right of Cache 회의 정보 캐싱: - TTL: 10분 - 자동 만료 end note Cache --> Service: OK deactivate Cache Service ->> EventHub: publish(MeetingValidatedEvent) activate EventHub note right of EventHub 검증 완료 이벤트: - 확정 가능 상태 알림 end note deactivate EventHub Service --> Controller: success response else validation failed Service --> Controller: 400 Bad Request note right 에러 응답 형식: { "error": { "code": "VALIDATION_FAILED", "message": "회의록 검증에 실패했습니다", "details": "필수 항목 누락 또는 형식 오류", "timestamp": "2025-10-23T12:00:00Z", "path": "/api/meetings/{id}/validate" } } end note end deactivate Service Controller --> Gateway: 200 OK / 400 Bad Request deactivate Controller @enduml