From 59625f59dd325302e934d68554d0de46f3a47b93 Mon Sep 17 00:00:00 2001 From: merrycoral Date: Fri, 17 Oct 2025 13:06:49 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=EC=8A=A4=ED=86=A0?= =?UTF-8?q?=EB=B0=8D=20=EC=9C=A0=EC=A0=80=ED=94=8C=EB=A1=9C=EC=9A=B0=20?= =?UTF-8?q?=EC=84=A4=EA=B3=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 유저플로우 연결도 작성 (userflow.puml) - 6개 상세 유저플로우 시퀀스 다이어그램 작성 - 01-회원가입및매장등록 - 02-AI이벤트기획생성 - 03-이벤트채널배포 - 04-이벤트참여및관리 - 05-효과측정및분석 - 06-당첨자선정및알림 - 이벤트스토밍 요소 포함 (Event, Command, Actor, Policy, External System, Data) - PlantUML 문법 검증 완료 (전체 통과) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- claude/plantuml-guide.md | 82 ++++++++++++++ think/es/01-회원가입및매장등록.puml | 76 +++++++++++++ think/es/02-AI이벤트기획생성.puml | 117 ++++++++++++++++++++ think/es/03-이벤트채널배포.puml | 127 ++++++++++++++++++++++ think/es/04-이벤트참여및관리.puml | 119 ++++++++++++++++++++ think/es/05-효과측정및분석.puml | 148 +++++++++++++++++++++++++ think/es/06-당첨자선정및알림.puml | 162 ++++++++++++++++++++++++++++ think/es/userflow.puml | 57 ++++++++++ tools/check-plantuml.ps1 | 66 ++++++++++++ 9 files changed, 954 insertions(+) create mode 100644 claude/plantuml-guide.md create mode 100644 think/es/01-회원가입및매장등록.puml create mode 100644 think/es/02-AI이벤트기획생성.puml create mode 100644 think/es/03-이벤트채널배포.puml create mode 100644 think/es/04-이벤트참여및관리.puml create mode 100644 think/es/05-효과측정및분석.puml create mode 100644 think/es/06-당첨자선정및알림.puml create mode 100644 think/es/userflow.puml create mode 100644 tools/check-plantuml.ps1 diff --git a/claude/plantuml-guide.md b/claude/plantuml-guide.md new file mode 100644 index 0000000..5dd396c --- /dev/null +++ b/claude/plantuml-guide.md @@ -0,0 +1,82 @@ +# PlantUML문법검사가이드 + +## 개요 + +PlantUML 다이어그램의 문법 오류를 사전에 검출하여 렌더링 실패를 방지하기 위한 가이드입니다. Docker 기반 PlantUML 서버를 활용하여 로컬에서 빠르게 문법을 검증할 수 있습니다. + +## PlantUML 서버 설치 검사 + +### Docker로 PlantUML 서버 실행 + +```bash +# PlantUML 서버가 실행 중인지 확인 +docker ps | grep plantuml + +# PlantUML 서버가 없으면 설치 및 실행 +docker run -d --name plantuml -p 38080:8080 plantuml/plantuml-server:latest + +# 서버 상태 확인 +docker logs plantuml +``` + +## 문법 검사 방법 +현재 OS에 맞게 수행. + +### Linux/macOS 버전 + +1. tools/check-plantuml.sh 파일 존재 여부 확인 +2. 스크립트 파일이 없으면 "PlantUML문법검사기(Linux/Mac)"를 tools/check-plantuml.sh 파일로 다운로드하여 스크립트 파일을 만듦 +3. 스크립트 파일이 있으면 그 스크립트 파일을 이용하여 검사 + +### Windows PowerShell 버전 +**스크립트 파일(tools/check-plantuml.ps1)을 이용하여 수행**. + +1. tools/check-plantuml.ps1 파일 존재 여부 확인 +2. 스크립트 파일이 없으면 "PlantUML문법검사기(Window)"를 tools/check-plantuml.ps1 파일로 다운로드하여 스크립트 파일을 만듦 +3. 스크립트 파일이 있으면 그 스크립트 파일을 이용하여 검사 + +### 검사 결과 해석 + +| 출력 | 의미 | 대응 방법 | +|------|------|-----------| +| 출력 없음 | 문법 오류 없음 ✅ | 정상, 렌더링 가능 | +| "Some diagram description contains errors" | 오류 존재 ❌ | 파이프 방식으로 상세 확인 | +| "ERROR" + 라인 번호 | 특정 라인 오류 ❌ | 해당 라인 수정 | +| "Error line X in file" | X번째 줄 오류 ❌ | 해당 라인 문법 확인 | + +## 화살표 문법 규칙 + +### 시퀀스 다이어그램 올바른 화살표 사용법 + +```plantuml +@startuml +' 올바른 사용법 ✅ +A -> B: 동기 메시지 (실선) +A ->> B: 비동기 메시지 (실선, 열린 화살촉) +A -->> B: 비동기 응답 (점선, 열린 화살촉) +A --> B: 점선 화살표 (일반) +A <-- B: 응답 (점선) +A ->x B: 실패/거부 (X 표시) +A ->>o B: 비동기 열린 원 + +' 잘못된 사용법 ❌ +A ..> B: ' 오류! sequence diagram에서 유효하지 않음 +@enduml +``` + +### 클래스 다이어그램 화살표 + +```plantuml +@startuml +' 클래스 다이어그램에서는 ..> 사용 가능 +ClassA ..> ClassB : 의존성 (점선) +ClassC --> ClassD : 연관 (점선) +@enduml +``` + +### 화살표 문법 주의사항 + +1. **`..>`는 sequence diagram에서 사용 금지** +2. 비동기 메시지는 `->>` 또는 `-->>` 사용 +3. 동기/비동기를 명확히 구분하여 일관되게 사용 +4. 다이어그램 타입별로 유효한 화살표가 다름 \ No newline at end of file diff --git a/think/es/01-회원가입및매장등록.puml b/think/es/01-회원가입및매장등록.puml new file mode 100644 index 0000000..0b90e26 --- /dev/null +++ b/think/es/01-회원가입및매장등록.puml @@ -0,0 +1,76 @@ +@startuml 01-회원가입및매장등록 +!theme mono + +title 유저플로우 01: 회원가입 및 매장정보 등록 + +actor "소상공인" as Owner +participant "회원관리 시스템" as UserSystem +participant "KT 인증 시스템" as KTAuth +participant "사업자번호 검증 시스템" as BizVerify +database "회원 DB" as UserDB + +== 이벤트스토밍 요소 == + +note over Owner, UserDB +**Command**: 회원가입 요청, 매장정보 입력, 사업자번호 검증 요청 +**Event**: 회원가입 요청됨, 인증 완료됨, 매장정보 입력됨, + 사업자번호 검증됨, 회원가입 완료됨 +**Actor**: 소상공인 +**External System**: KT 인증 시스템, 사업자번호 검증 시스템 +**Policy**: 사업자번호가 유효해야 가입 가능 +end note + +== 회원가입 프로세스 == + +Owner -> UserSystem : **Command**: 회원가입 요청\n(데이터: 이름, 전화번호, 이메일) +activate UserSystem +UserSystem --> Owner : **Event**: 회원가입 요청됨 + +UserSystem -> KTAuth : 본인 인증 요청\n(데이터: 전화번호) +activate KTAuth +KTAuth --> UserSystem : **Event**: 인증 완료됨\n(데이터: 인증토큰) +deactivate KTAuth + +UserSystem --> Owner : 인증 성공 알림 + +== 매장정보 등록 == + +Owner -> UserSystem : **Command**: 매장정보 입력\n(데이터: 매장명, 업종, 주소, 영업시간) +UserSystem --> Owner : **Event**: 매장정보 입력됨 + +Owner -> UserSystem : **Command**: 사업자번호 입력\n(데이터: 사업자번호) +UserSystem -> BizVerify : 사업자번호 검증 요청\n(데이터: 사업자번호, 매장명) +activate BizVerify + +note right of BizVerify +**Policy**: 사업자번호가 +유효해야 가입 가능 +- 국세청 DB 조회 +- 휴폐업 여부 확인 +end note + +BizVerify --> UserSystem : **Event**: 사업자번호 검증됨\n(데이터: 검증결과, 사업자정보) +deactivate BizVerify + +alt 검증 성공 + UserSystem -> UserDB : 회원 정보 저장\n(데이터: 회원정보, 매장정보) + activate UserDB + UserDB --> UserSystem : 저장 완료 + deactivate UserDB + + UserSystem --> Owner : **Event**: 회원가입 완료됨\n(데이터: 회원ID, 무료체험 쿠폰) + + note over Owner + **무료 체험 혜택** + - 첫 1회 이벤트 무료 + - 5분 만에 시작 가능 + end note + +else 검증 실패 + UserSystem --> Owner : 검증 실패 알림\n(사유: 유효하지 않은 사업자번호) + Owner -> UserSystem : 사업자번호 재입력 +end + +deactivate UserSystem + +@enduml diff --git a/think/es/02-AI이벤트기획생성.puml b/think/es/02-AI이벤트기획생성.puml new file mode 100644 index 0000000..c3c1c4c --- /dev/null +++ b/think/es/02-AI이벤트기획생성.puml @@ -0,0 +1,117 @@ +@startuml 02-AI이벤트기획생성 +!theme mono + +title 유저플로우 02: AI 이벤트 기획 생성 + +actor "소상공인" as Owner +participant "이벤트 기획 시스템" as EventSystem +participant "GPT-4 API" as GPT4 +participant "Claude API" as Claude +participant "Stable Diffusion API" as SD +participant "트렌드 분석 시스템" as TrendSystem +database "이벤트 DB" as EventDB + +== 이벤트스토밍 요소 == + +note over Owner, EventDB +**Command**: 이벤트 목적 선택, 매장분석 요청, 이벤트 기획 생성, 이벤트 승인 +**Event**: 이벤트 목적 선택됨, 매장분석 완료됨, 이벤트 기획안 생성됨, + 경품 추천됨, 홍보문구 생성됨, 이미지/영상 생성됨, 이벤트 승인됨 +**Actor**: 소상공인 +**External System**: GPT-4 API, Claude API, Stable Diffusion API, 트렌드 분석 시스템 +**Policy**: 10초 내 기획안 생성, 예산 내 최적 경품 추천 +end note + +== 이벤트 목적 선택 == + +Owner -> EventSystem : **Command**: 이벤트 목적 선택\n(데이터: 목적[신규고객/재방문/매출증대/인지도향상], 예산) +activate EventSystem +EventSystem --> Owner : **Event**: 이벤트 목적 선택됨 + +== AI 매장 분석 및 기획 생성 (10초 이내) == + +EventSystem -> TrendSystem : **Command**: 매장 분석 요청\n(데이터: 업종, 지역, 시즌) +activate TrendSystem + +note right of TrendSystem +**AI 분석 항목** +- 업종별 트렌드 +- 지역 특성 +- 시즌 이벤트 +- 경쟁사 동향 +end note + +TrendSystem --> EventSystem : **Event**: 매장분석 완료됨\n(데이터: 분석결과, 추천테마) +deactivate TrendSystem + +EventSystem -> GPT4 : 이벤트 기획 생성 요청\n(데이터: 목적, 분석결과, 예산) +activate GPT4 +GPT4 --> EventSystem : **Event**: 이벤트 기획안 생성됨\n(데이터: 이벤트명, 테마, 참여방법) +deactivate GPT4 + +== 경품 추천 및 홍보 문구 생성 == + +EventSystem -> Claude : 경품 추천 요청\n(데이터: 예산, 업종, 목적) +activate Claude + +note right of Claude +**Policy**: 예산 내 +최적 경품 추천 +- 매력도 분석 +- 비용 대비 효과 +- KT 멤버십 포인트 활용 +end note + +Claude --> EventSystem : **Event**: 경품 추천됨\n(데이터: 경품목록[5개], 예상효과) +deactivate Claude + +EventSystem -> GPT4 : 홍보 문구 생성 요청\n(데이터: 이벤트명, 테마, 경품) +activate GPT4 +GPT4 --> EventSystem : **Event**: 홍보문구 생성됨\n(데이터: 문구[5개 버전], SNS해시태그) +deactivate GPT4 + +== 이미지 및 영상 자동 생성 == + +EventSystem -> SD : 이미지 생성 요청\n(데이터: 이벤트 테마, 브랜드 컬러) +activate SD +SD --> EventSystem : **Event**: 이미지 생성됨\n(데이터: 이미지[3종], 포스터) +deactivate SD + +EventSystem -> SD : 영상 생성 요청\n(데이터: 이벤트 스토리보드) +activate SD +SD --> EventSystem : **Event**: 영상 생성됨\n(데이터: 15초 영상, 썸네일) +deactivate SD + +== 기획안 확인 및 승인 == + +EventSystem --> Owner : 완성된 기획안 제공\n(데이터: 전체 기획서, 예상 ROI 300%) + +note over Owner +**AI 생성 결과물** +✓ 이벤트 기획안 +✓ 경품 5종 추천 +✓ 홍보 문구 5개 버전 +✓ 이미지 3종 +✓ 15초 영상 +✓ 예상 효과 분석 +end note + +Owner -> EventSystem : **Command**: 기획안 수정 요청\n(데이터: 수정사항) +EventSystem --> Owner : 수정된 기획안 제공 + +Owner -> EventSystem : **Command**: 이벤트 승인\n(데이터: 최종 선택 항목) +EventSystem -> EventDB : 이벤트 정보 저장 +activate EventDB +EventDB --> EventSystem : 저장 완료 +deactivate EventDB + +EventSystem --> Owner : **Event**: 이벤트 승인됨\n(데이터: 이벤트ID, 배포 준비 완료) + +deactivate EventSystem + +note over Owner, EventDB +**소요 시간**: 10초 이내 +**만족도**: 80% 이상 목표 +end note + +@enduml diff --git a/think/es/03-이벤트채널배포.puml b/think/es/03-이벤트채널배포.puml new file mode 100644 index 0000000..00dbfea --- /dev/null +++ b/think/es/03-이벤트채널배포.puml @@ -0,0 +1,127 @@ +@startuml 03-이벤트채널배포 +!theme mono + +title 유저플로우 03: 이벤트 채널 배포 + +actor "소상공인" as Owner +participant "채널 배포 시스템" as DistSystem +participant "우리동네TV" as LocalTV +participant "링고비즈" as RingoBiz +participant "지니TV" as GenieTV +participant "Instagram API" as Instagram +participant "Naver Blog API" as NaverBlog +participant "KakaoTalk Channel API" as KakaoTalk +participant "QR코드 생성 시스템" as QRSystem +database "배포 이력 DB" as DistDB + +== 이벤트스토밍 요소 == + +note over Owner, DistDB +**Command**: 배포 채널 선택, 원클릭 배포 +**Event**: 배포채널 선택됨, 우리동네TV 배포됨, 링고비즈 배포됨, + 지니TV 배포됨, SNS 자동포스팅됨, QR코드 생성됨, 배포 완료됨 +**Actor**: 소상공인 +**External System**: 우리동네TV, 링고비즈, 지니TV, + Instagram API, Naver Blog API, KakaoTalk Channel API +**Policy**: 원클릭으로 모든 채널 자동 배포 +end note + +== 배포 채널 선택 == + +Owner -> DistSystem : **Command**: 배포 채널 선택\n(데이터: 채널목록[우리동네TV, 링고비즈, 지니TV, SNS], 타겟팅 설정) +activate DistSystem + +note over Owner +**채널 선택 옵션** +✓ 우리동네TV (반경 500m~1km) +✓ 링고비즈 (통화 연결음) +✓ 지니TV (저녁 시간대) +✓ SNS (Instagram, Naver, Kakao) +✓ 오프라인 QR코드 +end note + +DistSystem --> Owner : **Event**: 배포채널 선택됨 + +== 원클릭 다중 채널 배포 == + +Owner -> DistSystem : **Command**: 원클릭 배포 실행 + +par 병렬 배포 처리 + + DistSystem -> LocalTV : 우리동네TV 배포 요청\n(데이터: 15초 영상, 타겟팅[반경 500m-1km]) + activate LocalTV + + note right of LocalTV + **Policy**: 지역 기반 타겟팅 + - 반경 500m~1km + - 지니TV 사용자 대상 + - 15초 영상 자동 송출 + end note + + LocalTV --> DistSystem : **Event**: 우리동네TV 배포됨\n(데이터: 예상노출수, 배포ID) + deactivate LocalTV + + DistSystem -> RingoBiz : 링고비즈 배포 요청\n(데이터: 이벤트 안내 음성, 매장 전화번호) + activate RingoBiz + + RingoBiz --> DistSystem : **Event**: 링고비즈 배포됨\n(데이터: 연결음 업데이트 완료) + deactivate RingoBiz + + DistSystem -> GenieTV : 지니TV 광고 배포 요청\n(데이터: 광고 영상, 타겟팅[1km 이내, 저녁 시간대]) + activate GenieTV + + note right of GenieTV + **배포 설정** + - 주변 1km 이내 가정 + - 저녁 시간대 자동 노출 + - 주말 우선 배치 + end note + + GenieTV --> DistSystem : **Event**: 지니TV 배포됨\n(데이터: 광고 스케줄, 예상 노출수) + deactivate GenieTV + + DistSystem -> Instagram : Instagram 포스팅 요청\n(데이터: 이미지[3종], 홍보문구, 해시태그) + activate Instagram + Instagram --> DistSystem : **Event**: Instagram 포스팅 완료\n(데이터: 게시물 URL) + deactivate Instagram + + DistSystem -> NaverBlog : Naver Blog 포스팅 요청\n(데이터: 이벤트 상세 설명, 이미지) + activate NaverBlog + NaverBlog --> DistSystem : **Event**: Naver Blog 포스팅 완료\n(데이터: 게시물 URL) + deactivate NaverBlog + + DistSystem -> KakaoTalk : KakaoTalk 채널 메시지 발송\n(데이터: 이벤트 안내, 참여 링크) + activate KakaoTalk + KakaoTalk --> DistSystem : **Event**: KakaoTalk 메시지 발송 완료\n(데이터: 발송 건수) + deactivate KakaoTalk + + DistSystem -> QRSystem : QR코드 생성 요청\n(데이터: 이벤트 참여 URL, 매장 정보) + activate QRSystem + QRSystem --> DistSystem : **Event**: QR코드 생성됨\n(데이터: QR코드 이미지, 포스터 PDF) + deactivate QRSystem + +end + +== 배포 완료 및 결과 확인 == + +DistSystem -> DistDB : 배포 이력 저장\n(데이터: 채널별 배포 정보, 타임스탬프) +activate DistDB +DistDB --> DistSystem : 저장 완료 +deactivate DistDB + +DistSystem --> Owner : **Event**: 배포 완료됨\n(데이터: 채널별 배포 결과, 예상 총 노출수) + +note over Owner +**배포 완료 결과** +✓ 우리동네TV: 예상 노출 5,000명 +✓ 링고비즈: 연결음 업데이트 완료 +✓ 지니TV: 예상 노출 10,000가정 +✓ Instagram: 게시물 공개 +✓ Naver Blog: 게시물 공개 +✓ KakaoTalk: 구독자 500명 발송 +✓ QR코드: 매장 내 부착용 제공 +end note + +deactivate DistSystem + +@enduml diff --git a/think/es/04-이벤트참여및관리.puml b/think/es/04-이벤트참여및관리.puml new file mode 100644 index 0000000..a93259c --- /dev/null +++ b/think/es/04-이벤트참여및관리.puml @@ -0,0 +1,119 @@ +@startuml 04-이벤트참여및관리 +!theme mono + +title 유저플로우 04: 이벤트 참여 및 관리 + +actor "이벤트 참여자" as Customer +participant "이벤트 참여 시스템" as ParticipationSystem +participant "중복 체크 시스템" as DuplicateCheck +participant "알림 시스템" as NotificationSystem +database "참여자 DB" as ParticipantDB +database "이벤트 로그 DB" as EventLogDB + +== 이벤트스토밍 요소 == + +note over Customer, EventLogDB +**Command**: 이벤트 조회, 참여 신청 +**Event**: 이벤트 발견됨, 참여신청됨, 중복체크 완료됨, + 참여 확인됨, 참여정보 저장됨 +**Actor**: 이벤트 참여자 (고객) +**Policy**: 중복 참여 불가, 자동 접수 처리 +end note + +== 이벤트 발견 및 조회 == + +Customer -> ParticipationSystem : **Command**: 이벤트 조회 요청\n(데이터: 채널 경로[우리동네TV/SNS/QR코드]) +activate ParticipationSystem + +note over Customer +**유입 경로** +- 우리동네TV 시청 +- Instagram 게시물 +- Naver Blog +- KakaoTalk 메시지 +- 매장 QR코드 스캔 +end note + +ParticipationSystem --> Customer : **Event**: 이벤트 발견됨\n(데이터: 이벤트 상세 정보, 경품 정보, 참여 방법) + +== 이벤트 참여 신청 == + +Customer -> ParticipationSystem : **Command**: 참여 신청\n(데이터: 이름, 전화번호, 참여 경로) + +ParticipationSystem -> EventLogDB : 참여 로그 기록\n(데이터: 참여 시간, 경로, 디바이스 정보) +activate EventLogDB +EventLogDB --> ParticipationSystem : 로그 저장 완료 +deactivate EventLogDB + +== 중복 참여 체크 == + +ParticipationSystem -> DuplicateCheck : 중복 확인 요청\n(데이터: 전화번호, 이벤트ID) +activate DuplicateCheck + +note right of DuplicateCheck +**Policy**: 중복 참여 불가 +- 전화번호 기반 확인 +- 이벤트별 1회 제한 +- 실시간 중복 체크 +end note + +DuplicateCheck -> ParticipantDB : 참여 이력 조회 +activate ParticipantDB +ParticipantDB --> DuplicateCheck : 조회 결과 +deactivate ParticipantDB + +DuplicateCheck --> ParticipationSystem : **Event**: 중복체크 완료됨\n(데이터: 중복 여부) +deactivate DuplicateCheck + +alt 중복 없음 (정상 참여) + + ParticipationSystem -> ParticipantDB : 참여자 정보 저장\n(데이터: 참여자 정보, 참여 시간, 경로) + activate ParticipantDB + ParticipantDB --> ParticipationSystem : **Event**: 참여정보 저장됨\n(데이터: 참여번호) + deactivate ParticipantDB + + ParticipationSystem -> NotificationSystem : 참여 확인 알림 발송 요청\n(데이터: 전화번호, 참여번호) + activate NotificationSystem + NotificationSystem --> Customer : **Event**: 참여 확인됨\n(알림톡: 참여 완료, 당첨자 발표 일정) + deactivate NotificationSystem + + ParticipationSystem --> Customer : 참여 완료 화면\n(데이터: 참여번호, 경품 정보, 발표 일정) + + note over Customer + **참여 완료** + ✓ 참여번호: #12345 + ✓ 경품: KT 멤버십 5,000P + ✓ 발표: 2025-10-24 18:00 + ✓ 당첨 시 알림톡 발송 + end note + +else 중복 참여 + + ParticipationSystem --> Customer : 중복 참여 불가 안내\n(사유: 이미 참여한 이벤트) + + note over Customer + **중복 참여 제한** + - 1인 1회 참여 제한 + - 공정한 당첨 기회 보장 + end note + +end + +deactivate ParticipationSystem + +== 실시간 참여 현황 집계 == + +ParticipationSystem -> EventLogDB : 실시간 집계 업데이트 +activate EventLogDB +EventLogDB --> ParticipationSystem : 집계 완료 +deactivate EventLogDB + +note over ParticipationSystem +**실시간 집계 데이터** +- 총 참여자 수 +- 채널별 참여 분포 +- 시간대별 참여 추이 +→ 효과 측정 시스템 전달 +end note + +@enduml diff --git a/think/es/05-효과측정및분석.puml b/think/es/05-효과측정및분석.puml new file mode 100644 index 0000000..0e054d6 --- /dev/null +++ b/think/es/05-효과측정및분석.puml @@ -0,0 +1,148 @@ +@startuml 05-효과측정및분석 +!theme mono + +title 유저플로우 05: 효과 측정 및 분석 + +actor "소상공인" as Owner +participant "실시간 모니터링 시스템" as MonitoringSystem +participant "데이터 분석 엔진" as AnalyticsEngine +participant "AI 개선 제안 시스템" as AIImprovement +participant "매출 연동 시스템" as SalesSystem +database "참여자 DB" as ParticipantDB +database "채널 로그 DB" as ChannelLogDB +database "매출 DB" as SalesDB +database "분석 결과 DB" as AnalyticsDB + +== 이벤트스토밍 요소 == + +note over Owner, AnalyticsDB +**Command**: 실시간 모니터링 조회, 분석 리포트 요청 +**Event**: 참여자수 집계됨, 채널별 노출수 집계됨, + 매장방문자 증가 감지됨, ROI 계산됨, + 분석리포트 생성됨, 개선안 제시됨 +**Actor**: 소상공인 +**External System**: 분석 시스템, AI 개선안 생성 시스템 +**Policy**: 실시간 모니터링, AI 자동 분석 및 개선 제안 +end note + +== 실시간 효과 모니터링 == + +Owner -> MonitoringSystem : **Command**: 실시간 모니터링 조회 +activate MonitoringSystem + +MonitoringSystem -> ParticipantDB : 참여자 수 조회 +activate ParticipantDB +ParticipantDB --> MonitoringSystem : **Event**: 참여자수 집계됨\n(데이터: 총 참여자 수, 시간대별 추이) +deactivate ParticipantDB + +MonitoringSystem -> ChannelLogDB : 채널별 노출 수 조회 +activate ChannelLogDB +ChannelLogDB --> MonitoringSystem : **Event**: 채널별 노출수 집계됨\n(데이터: 우리동네TV, 지니TV, SNS 노출 수) +deactivate ChannelLogDB + +note over MonitoringSystem +**실시간 지표** +- 참여자 수 +- 채널별 노출 수 +- 참여율 (참여/노출) +- 시간대별 추이 +end note + +MonitoringSystem --> Owner : 실시간 대시보드 제공\n(데이터: 참여자 수, 노출 수, 참여율) + +== 매장 방문자 및 매출 분석 == + +MonitoringSystem -> SalesSystem : 매장 방문자 데이터 요청\n(데이터: 이벤트 기간, 매장ID) +activate SalesSystem + +SalesSystem -> SalesDB : 매출 데이터 조회\n(데이터: 이벤트 전후 매출 비교) +activate SalesDB +SalesDB --> SalesSystem : 매출 데이터 +deactivate SalesDB + +SalesSystem --> MonitoringSystem : **Event**: 매장방문자 증가 감지됨\n(데이터: 방문자 증가율, 매출 증가율) +deactivate SalesSystem + +note right of SalesSystem +**Policy**: 실시간 매출 연동 +- 이벤트 전후 비교 +- 방문자 증가율 계산 +- 매출 증가율 분석 +end note + +== ROI 계산 및 분석 == + +MonitoringSystem -> AnalyticsEngine : 종합 분석 요청\n(데이터: 참여 데이터, 노출 데이터, 매출 데이터) +activate AnalyticsEngine + +AnalyticsEngine -> AnalyticsEngine : ROI 계산\n(수식: (매출 증가 - 이벤트 비용) / 이벤트 비용 × 100) + +note right of AnalyticsEngine +**분석 항목** +- 참여율 = 참여자 / 노출 수 +- 전환율 = 구매자 / 참여자 +- 매출 증가율 +- ROI = (수익 - 비용) / 비용 +- 채널별 효율성 +end note + +AnalyticsEngine --> MonitoringSystem : **Event**: ROI 계산됨\n(데이터: ROI 300%, 채널별 효율성) +deactivate AnalyticsEngine + +== 분석 리포트 생성 == + +Owner -> MonitoringSystem : **Command**: 분석 리포트 요청 + +MonitoringSystem -> AnalyticsEngine : 상세 리포트 생성 요청 +activate AnalyticsEngine + +AnalyticsEngine -> AnalyticsDB : 분석 결과 저장 +activate AnalyticsDB +AnalyticsDB --> AnalyticsEngine : 저장 완료 +deactivate AnalyticsDB + +AnalyticsEngine --> MonitoringSystem : **Event**: 분석리포트 생성됨\n(데이터: 종합 분석 보고서) +deactivate AnalyticsEngine + +MonitoringSystem --> Owner : 분석 리포트 제공 + +note over Owner +**분석 리포트 내용** +✓ 총 참여자: 1,250명 +✓ 채널별 노출: 15,000명 +✓ 참여율: 8.3% +✓ 매출 증가: 20% +✓ ROI: 300% +✓ 채널 효율: 우리동네TV(최고) +end note + +== AI 개선 제안 == + +MonitoringSystem -> AIImprovement : AI 개선안 요청\n(데이터: 이벤트 결과, 분석 지표) +activate AIImprovement + +note right of AIImprovement +**AI 분석 기준** +- 성공/실패 요인 분석 +- 채널별 성과 비교 +- 타겟팅 정확도 +- 최적화 기회 식별 +end note + +AIImprovement --> MonitoringSystem : **Event**: 개선안 제시됨\n(데이터: 다음 이벤트 개선 제안) +deactivate AIImprovement + +MonitoringSystem --> Owner : AI 개선 제안 제공 + +note over Owner +**AI 개선 제안** +✓ 우리동네TV 노출 확대 추천 +✓ 저녁 시간대 집중 배치 +✓ 경품 매력도 상향 조정 +✓ 참여 방법 단순화 +✓ 예상 ROI: 350% +end note + +deactivate MonitoringSystem + +@enduml diff --git a/think/es/06-당첨자선정및알림.puml b/think/es/06-당첨자선정및알림.puml new file mode 100644 index 0000000..9cbe09c --- /dev/null +++ b/think/es/06-당첨자선정및알림.puml @@ -0,0 +1,162 @@ +@startuml 06-당첨자선정및알림 +!theme mono + +title 유저플로우 06: 당첨자 선정 및 알림 + +actor "소상공인" as Owner +actor "당첨자" as Winner +participant "당첨자 선정 시스템" as LotterySystem +participant "알림 발송 시스템" as NotificationSystem +participant "KT 멤버십 시스템" as KTMembership +participant "경품 지급 시스템" as RewardSystem +database "참여자 DB" as ParticipantDB +database "당첨 이력 DB" as WinnerDB + +== 이벤트스토밍 요소 == + +note over Owner, WinnerDB +**Command**: 당첨자 선정, 알림 발송, 경품 지급 확인 +**Event**: 이벤트 종료됨, 당첨자 자동선정됨, + 당첨자 알림발송됨, 경품지급 완료됨 +**Actor**: 소상공인, 당첨자 +**External System**: 알림톡 시스템, KT 멤버십 포인트 시스템 +**Policy**: 공정한 자동 추첨, 즉시 알림 발송 +end note + +== 이벤트 종료 및 당첨자 선정 == + +Owner -> LotterySystem : **Command**: 당첨자 선정 요청\n(데이터: 이벤트ID, 당첨자 수) +activate LotterySystem + +LotterySystem --> Owner : **Event**: 이벤트 종료됨 + +LotterySystem -> ParticipantDB : 전체 참여자 목록 조회 +activate ParticipantDB +ParticipantDB --> LotterySystem : 참여자 목록\n(데이터: 1,250명) +deactivate ParticipantDB + +note right of LotterySystem +**Policy**: 공정한 자동 추첨 +- 난수 생성기 사용 +- 중복 당첨 방지 +- 투명한 선정 기준 +- 블록체인 기록 (선택) +end note + +LotterySystem -> LotterySystem : 무작위 추첨 실행\n(알고리즘: Cryptographically Secure Random) + +LotterySystem -> WinnerDB : 당첨자 정보 저장\n(데이터: 당첨자 목록, 추첨 시간, 추첨 알고리즘) +activate WinnerDB +WinnerDB --> LotterySystem : 저장 완료 +deactivate WinnerDB + +LotterySystem --> Owner : **Event**: 당첨자 자동선정됨\n(데이터: 당첨자 목록[10명], 추첨 로그) + +note over Owner +**당첨자 선정 완료** +✓ 총 참여: 1,250명 +✓ 당첨자: 10명 +✓ 당첨 확률: 0.8% +✓ 추첨 방식: 무작위 +✓ 추첨 시간: 2025-10-24 18:00 +end note + +== 당첨자 알림 발송 == + +LotterySystem -> NotificationSystem : 알림 발송 요청\n(데이터: 당첨자 목록, 경품 정보) +activate NotificationSystem + +par 병렬 알림 발송 + + loop 각 당첨자에게 + NotificationSystem -> Winner : **Event**: 당첨자 알림발송됨\n(알림톡: 당첨 축하, 경품 수령 안내) + + note over Winner + **당첨 알림** + 🎉 축하합니다! + ✓ 경품: KT 멤버십 5,000P + ✓ 수령 방법: 자동 지급 + ✓ 유효 기간: 30일 + end note + end + + NotificationSystem -> Owner : 알림 발송 현황 보고\n(데이터: 발송 완료 건수) + +end + +NotificationSystem --> LotterySystem : 알림 발송 완료 +deactivate NotificationSystem + +== 경품 자동 지급 == + +alt 경품 유형: KT 멤버십 포인트 + + LotterySystem -> KTMembership : 포인트 지급 요청\n(데이터: 당첨자 전화번호, 포인트 금액) + activate KTMembership + + note right of KTMembership + **자동 포인트 지급** + - 즉시 지급 처리 + - 30일 유효 기간 + - 사용 내역 추적 + end note + + loop 각 당첨자 + KTMembership -> Winner : 포인트 자동 적립\n(데이터: 5,000P) + KTMembership --> Winner : 포인트 적립 완료 알림 + end + + KTMembership --> LotterySystem : **Event**: 경품지급 완료됨\n(데이터: 지급 완료 목록) + deactivate KTMembership + +else 경품 유형: 실물 경품 + + LotterySystem -> RewardSystem : 경품 배송 요청\n(데이터: 당첨자 정보, 배송 주소) + activate RewardSystem + + RewardSystem -> Winner : 배송지 정보 수집\n(알림톡: 배송지 입력 요청) + Winner --> RewardSystem : 배송지 정보 제공 + + RewardSystem --> LotterySystem : 배송 처리 완료 + deactivate RewardSystem + + RewardSystem -> Winner : 배송 시작 알림\n(데이터: 송장 번호) + +end + +== 경품 지급 확인 및 완료 == + +LotterySystem -> WinnerDB : 경품 지급 이력 업데이트 +activate WinnerDB +WinnerDB --> LotterySystem : 업데이트 완료 +deactivate WinnerDB + +LotterySystem --> Owner : 경품 지급 완료 보고\n(데이터: 지급 완료 목록, 지급 방식) + +note over Owner +**경품 지급 완료** +✓ 포인트 지급: 10명 완료 +✓ 총 지급액: 50,000P +✓ 즉시 지급 처리 +✓ 수령 확인: 100% +end note + +deactivate LotterySystem + +== 이벤트 종료 후 피드백 == + +NotificationSystem -> Winner : 이벤트 참여 감사 메시지\n(내용: 재방문 유도, 다음 이벤트 안내) +activate NotificationSystem + +note over Winner +**감사 메시지** +✓ 이벤트 참여 감사 +✓ 매장 재방문 혜택 안내 +✓ 다음 이벤트 예고 +end note + +deactivate NotificationSystem + +Owner -> Owner : 이벤트 결과 검토 및\n다음 이벤트 기획 + +@enduml diff --git a/think/es/userflow.puml b/think/es/userflow.puml new file mode 100644 index 0000000..cac0e3b --- /dev/null +++ b/think/es/userflow.puml @@ -0,0 +1,57 @@ +@startuml userflow +!theme mono + +title KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 유저플로우 연결도 + +actor "소상공인" as Owner +actor "이벤트 참여자" as Customer +participant "회원가입 및 매장등록\n(01-회원가입및매장등록)" as Flow01 +participant "AI 이벤트 기획 생성\n(02-AI이벤트기획생성)" as Flow02 +participant "이벤트 채널 배포\n(03-이벤트채널배포)" as Flow03 +participant "이벤트 참여 및 관리\n(04-이벤트참여및관리)" as Flow04 +participant "효과 측정 및 분석\n(05-효과측정및분석)" as Flow05 +participant "당첨자 선정 및 알림\n(06-당첨자선정및알림)" as Flow06 + +== 소상공인 여정 == + +Owner -> Flow01 : 1. 서비스 가입 및 매장 등록 +Flow01 --> Owner : 회원가입 완료 + +Owner -> Flow02 : 2. AI 이벤트 기획 생성 요청 +Flow02 --> Owner : 이벤트 기획안 제공 + +Owner -> Flow03 : 3. 다중 채널 배포 실행 +Flow03 --> Owner : 배포 완료 확인 + +Owner -> Flow05 : 4. 실시간 효과 모니터링 +Flow05 --> Owner : 분석 리포트 제공 + +Owner -> Flow06 : 5. 당첨자 선정 및 경품 지급 +Flow06 --> Owner : 당첨자 알림 완료 + +== 이벤트 참여자 여정 == + +Customer -> Flow03 : 6. 채널을 통해 이벤트 발견 +Flow03 --> Customer : 이벤트 정보 제공 + +Customer -> Flow04 : 7. 이벤트 참여 신청 +Flow04 --> Customer : 참여 접수 완료 + +Customer -> Flow06 : 8. 당첨 여부 확인 +Flow06 --> Customer : 당첨 알림 수신 + +== 시스템 데이터 흐름 == + +Flow02 -> Flow03 : 이벤트 콘텐츠 전달 +Flow03 -> Flow04 : 참여 경로 정보 전달 +Flow04 -> Flow05 : 참여 데이터 집계 +Flow04 -> Flow06 : 참여자 목록 전달 +Flow05 -> Flow02 : AI 개선 제안 피드백 + +note over Flow01, Flow06 +소상공인은 가입 → 기획 → 배포 → 모니터링 → 선정의 +순환 구조로 서비스를 이용하며, +고객은 발견 → 참여 → 당첨의 간단한 여정을 경험합니다. +end note + +@enduml diff --git a/tools/check-plantuml.ps1 b/tools/check-plantuml.ps1 new file mode 100644 index 0000000..9aca9c9 --- /dev/null +++ b/tools/check-plantuml.ps1 @@ -0,0 +1,66 @@ +param( + [Parameter(Mandatory=$false)] + [string]$FilePath = "C:\home\workspace\tripgen\design\backend\system\azure-physical-architecture.txt" +) + +Write-Host "=== PlantUML Syntax Checker ===" -ForegroundColor Cyan +Write-Host "Target file: $FilePath" -ForegroundColor Yellow + +# Check if file exists +if (-not (Test-Path $FilePath)) { + Write-Host "❌ File not found: $FilePath" -ForegroundColor Red + exit 1 +} + +# Execute directly in PowerShell +$timestamp = Get-Date -Format 'yyyyMMddHHmmss' +$tempFile = "/tmp/puml_$timestamp.puml" + +# Copy file +Write-Host "`n1. Copying file..." -ForegroundColor Gray +Write-Host " Temporary file: $tempFile" +docker cp $FilePath "plantuml:$tempFile" + +if ($LASTEXITCODE -ne 0) { + Write-Host "❌ File copy failed" -ForegroundColor Red + exit 1 +} +Write-Host " ✅ Copy completed" -ForegroundColor Green + +# Find JAR file path +Write-Host "`n2. Looking for PlantUML JAR file..." -ForegroundColor Gray +$JAR_PATH = docker exec plantuml sh -c "find / -name 'plantuml*.jar' 2>/dev/null | head -1" +Write-Host " JAR path: $JAR_PATH" +Write-Host " ✅ JAR file confirmed" -ForegroundColor Green + +# Syntax check +Write-Host "`n3. Running syntax check..." -ForegroundColor Gray +$syntaxOutput = docker exec plantuml sh -c "java -jar $JAR_PATH -checkonly $tempFile 2>&1" + +if ($LASTEXITCODE -eq 0) { + Write-Host "`n✅ Syntax check passed!" -ForegroundColor Green + Write-Host " No syntax errors found in the diagram." -ForegroundColor Green +} else { + Write-Host "`n❌ Syntax errors detected!" -ForegroundColor Red + Write-Host "Error details:" -ForegroundColor Red + Write-Host $syntaxOutput -ForegroundColor Yellow + + # Detailed error check + Write-Host "`nAnalyzing detailed errors..." -ForegroundColor Yellow + $detailError = docker exec plantuml sh -c "java -jar $JAR_PATH -failfast -v $tempFile 2>&1" + $errorLines = $detailError | Select-String "Error line" + + if ($errorLines) { + Write-Host "`n📍 Error locations:" -ForegroundColor Magenta + $errorLines | ForEach-Object { + Write-Host " $($_.Line)" -ForegroundColor Red + } + } +} + +# Clean up temporary file +Write-Host "`n4. Cleaning up temporary files..." -ForegroundColor Gray +docker exec plantuml sh -c "rm -f $tempFile" 2>$null +Write-Host " ✅ Cleanup completed" -ForegroundColor Green + +Write-Host "`n=== Check completed ===" -ForegroundColor Cyan \ No newline at end of file