이벤트스토밍 유저플로우 설계 완료

- 유저플로우 연결도 작성 (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 <noreply@anthropic.com>
This commit is contained in:
merrycoral 2025-10-17 13:06:49 +09:00
parent 81fde7d183
commit 59625f59dd
9 changed files with 954 additions and 0 deletions

82
claude/plantuml-guide.md Normal file
View File

@ -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. 다이어그램 타입별로 유효한 화살표가 다름

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

57
think/es/userflow.puml Normal file
View File

@ -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

66
tools/check-plantuml.ps1 Normal file
View File

@ -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