diff --git a/claude/common-principles.md b/claude/common-principles.md new file mode 100644 index 0000000..31b8354 --- /dev/null +++ b/claude/common-principles.md @@ -0,0 +1,197 @@ +# 공통설계원칙 + +모든 설계 단계에서 공통으로 적용되는 핵심 원칙과 전략 + +## 🎯 핵심 원칙 + +### 1. 🚀 실행 우선 원칙 +- **프롬프트 우선**: 바로 실행할 수 있는 프롬프트로 작업 시작 +- **가이드 학습**: 원리와 방법론은 가이드로 깊이 있게 학습 +- **점진적 이해**: 실행 → 결과 확인 → 원리 학습 순서 + +### 2. 🔄 병렬 처리 전략 +- **서브 에이전트 활용**: Task 도구로 서비스별 동시 작업 +- **의존성 기반 그룹화**: 의존 관계에 따른 순차/병렬 처리 결정 +- **통합 검증**: 병렬 작업 완료 후 전체적 일관성 검증 + +### 3. 🏗️ 마이크로서비스 설계 원칙 +- **서비스 독립성**: 캐시를 통한 직접 의존성 최소화 +- **선택적 비동기**: 장시간 작업(AI 일정 생성)만 비동기 처리 +- **캐시 우선**: Redis를 통한 성능 최적화 +- **독립 배포**: 서비스별 독립적 배포 가능한 구조 + +### 4. 📝 표준화 원칙 +- **PlantUML**: 모든 다이어그램 표준 (`!theme mono`) +- **OpenAPI 3.0**: API 명세 표준 +- **자동 검증**: PlantUML, OpenAPI 문법 검사 필수 +- **일관된 네이밍**: kebab-case 파일명, 표준화된 스키마명 + +### 5. ✅ 검증 우선 원칙 +- **각 단계마다 자동 검증**: 품질 보장 +- **실시간 피드백**: 오류 조기 발견 및 수정 +- **CI/CD 통합**: 자동화된 검증 프로세스 +- **PlantUML 스크립트 파일 생성 즉시 검사 실행**: 'PlantUML 문법 검사 가이드' 준용 + +### 6. 🚀 점진적 구현 원칙 +- **MVP → 확장 → 고도화**: 단계별 접근 +- **YAGNI 적용**: 꼭 필요한 기능만 구현(YAGNI원칙:You aren't gonna need it) +- **지속적 개선**: 피드백 기반 점진적 발전 + +## 🔧 의존성 분석 및 병렬 처리 + +### 의존성 분석 방법 + +1. **서비스 간 의존성 파악** + ``` + 일정 서비스 → 프로파일 서비스 (멤버/여행 정보 조회) + 일정 서비스 → 장소 서비스 (장소 정보 조회) + 장소 서비스: 독립적 (외부 API만 사용) + ``` + +2. **의존성 기반 그룹화** + ``` + Group A (순차 처리): 프로파일 → 일정 서비스 + Group B (독립 처리): 장소 서비스 + ``` + +3. **에이전트 할당 및 병렬 처리** + ``` + Agent 1: Group A 담당 + - 프로파일 서비스 설계 + - 일정 서비스 설계 (프로파일 참조) + + Agent 2: Group B 담당 + - 장소 서비스 설계 (독립적) + ``` + +### 병렬 처리 적용 가이드 + +#### API 설계 단계 +- **독립 서비스**: 각각 별도 에이전트 +- **의존 서비스**: 동일 에이전트 내 순차 처리 +- **공통 검증**: 모든 에이전트 완료 후 swagger-cli 검증 + +#### 시퀀스 설계 단계 +- **외부 시퀀스**: 플로우별 병렬 처리 (각 플로우는 독립적) +- **내부 시퀀스**: 서비스별 병렬 처리 (서비스 내부는 독립적) + +#### 클래스/데이터 설계 단계 +- **의존성 그룹별**: 참조 관계가 있는 서비스들은 순차 처리 +- **독립 서비스**: 병렬 처리 +- **공통 클래스**: 모든 서비스 설계 완료 후 마지막 처리 + +## 🎨 PlantUML 작성 표준 + +### 기본 템플릿 +```plantuml +@startuml +!theme mono + +title [다이어그램 제목] + +' 다이어그램 내용 +@enduml +``` + +### 필수 검증 +- **각 파일 생성 직후 PlantUML 문법 검사 수행** +- **파이프 방식 권장**: `cat "파일" | docker exec -i plantuml ...` +- **화살표 문법 주의**: sequence diagram에서 `..>` 사용 금지 + +### 스타일 가이드 +- **폰트 크기**: 적절한 가독성 확보 +- **색상 구분**: 서비스별, 레이어별 색상 구분 +- **설명 추가**: note를 활용한 상세 설명 + +## 🔌 API 설계 표준 + +### 파일 구조 +``` +design/backend/api/{service-name}-api.yaml +``` + +### 필수 필드 +```yaml +paths: + /endpoint: + get: + summary: API 목적 설명 + operationId: 고유 식별자 + x-user-story: 유저스토리 ID + x-controller: 담당 컨트롤러 + tags: [API 그룹] +``` + +### 스키마 원칙 +- **서비스별 독립**: 각 서비스 파일에 모든 스키마 포함 +- **중복 허용**: 초기에는 중복을 허용하고 점진적으로 공통화 +- **명확한 네이밍**: Request/Response DTO 네이밍 표준 + +## 🔄 시퀀스 설계 표준 + +### 외부 시퀀스 (서비스 간) +- **참여 서비스만**: 해당 플로우에 참여하는 서비스만 표시 +- **API 호출 중심**: 서비스 간 API 호출 순서 표현 +- **한글 설명**: 각 호출의 목적을 한글로 명시 + +### 내부 시퀀스 (서비스 내부) +- **모든 API 표시**: 해당 서비스의 모든 API 포함 +- **내부 처리 흐름**: 컨트롤러 → 서비스 → 레포지토리 플로우 +- **기술적 세부사항**: 캐시, DB 접근 등 포함 + +### 동기/비동기 구분 +- **실선 (→)**: 동기 호출 +- **점선 (->>)**: 비동기 호출 +- **양방향**: 필요시에만 사용 + +## 📊 클래스 설계 표준 + +### 아키텍처 적용 +- **Clean Architecture**: Port/Adapter 용어 대신 표준 Clean 용어 사용 +- **멀티프로젝트**: 서비스별 독립 모듈 +- **패키지 구조 표준**: 일관된 패키지 구조 적용 + +### 관계 표현 +- **Generalization**: 상속 관계 +- **Realization**: 인터페이스 구현 +- **Dependency**: 의존 관계 +- **Association**: 연관 관계 +- **Aggregation/Composition**: 집약/합성 관계 + +### 상세 정보 +- **프로퍼티와 메소드**: 모두 명시 +- **접근 제한자**: 적절한 가시성 설정 +- **타입 정보**: 정확한 데이터 타입 명시 + +## 🗄️ 데이터 설계 표준 + +### 서비스별 DB 분리 +- **각 서비스마다 독립적인 데이터베이스** +- **서비스 간 데이터 공유 최소화** +- **캐시를 통한 성능 최적화** + +### 클래스 설계와 일치 +- **Entity 클래스와 테이블 매핑** +- **일관된 네이밍 컨벤션** +- **적절한 정규화 수준** + +## 🚨 주의사항 + +### PlantUML 문법 +- **sequence diagram에서 `..>` 사용 금지** +- **비동기는 `->>` 또는 `-->>` 사용** +- **테마는 반드시 `mono` 사용** + +### 병렬 처리 +- **의존성 분석 선행**: 병렬 처리 전 반드시 의존성 파악 +- **순차 처리 필요시**: 무리한 병렬화보다는 안전한 순차 처리 +- **검증 단계 필수**: 병렬 처리 후 통합 검증 + +### API 설계 +- **유저스토리 ID 필수**: x-user-story 필드 누락 금지 +- **Controller 명시**: x-controller 필드로 담당 컨트롤러 명시 +- **스키마 완전성**: 모든 Request/Response 스키마 정의 + +--- + +💡 **이 원칙들은 모든 설계 단계에서 일관되게 적용되어야 하며, 각 단계별 세부 가이드에서 구체적으로 구현됩니다.** \ No newline at end of file diff --git a/claude/logical-architecture-design.md b/claude/logical-architecture-design.md new file mode 100644 index 0000000..ca4d2ba --- /dev/null +++ b/claude/logical-architecture-design.md @@ -0,0 +1,64 @@ +# 논리아키텍처설계가이드 + +[요청사항] +- <작성원칙>을 준용하여 설계 +- <작성순서>에 따라 설계 +- [결과파일] 안내에 따라 파일 작성 +- 완료 후 mermaid 스크립트 테스트 방법 안내 + - https://mermaid.live/edit 에 접근 + - 스크립트 내용을 붙여넣어 확인 + +[가이드] +<작성원칙> +- **유저스토리와 매칭**되어야 함. **불필요한 추가 설계 금지** +- UI/UX설계서의 '사용자 플로우'참조하여 설계 +- '아키텍처패턴'에 선정된 클라우드 디자인 패턴을 적용하여 설계 +- 사용자 관점의 컴포넌트 다이어그램 작성 +- Context Map 스타일로 서비스 내부 구조는 생략하고 서비스 간 관계에 집중 +- 클라이언트에서 API Gateway로는 단일 연결선으로 표현 +<작성순서> +- 준비: + - 유저스토리, UI/UX설계서, 아키텍처패턴 분석 및 이해 + - "@analyze --play" 프로토타입이 있는 경우 웹브라우저에서 실행하여 서비스 이해 +- 실행: + - 논리아키텍처 설계서(logical-architecture.md) 작성: 아래 항목은 필수 포함하고 필요 시 항목 추가 + - 개요: 설계 원칙, 핵심 컴포넌트 정의 + - 서비스 아키텍처 + - 서비스별 책임 + - 서비스 간 통신 전략 + - 주요 사용자 플로우 + - 데이터 흐름 및 캐싱 전략 + - 확장성 및 성능 고려사항 + - 보안 고려사항 + - 논리아키텍처 다이어그램 + - Mermaid 형식으로 작성하며 별도 파일로 작성: logical-architecture.mmd + - <통신전략>과 <의존성 표현 방법>을 준수 + - **Mermaid 스크립트 파일 검사 실행**: 'Mermaid문법검사가이드' 준용 +- 검토: + - <작성원칙> 준수 검토 + - 스쿼드 팀원 리뷰: 누락 및 개선 사항 검토 + - 수정 사항 선택 및 반영 +<통신 전략> +- **동기 통신**: 즉시 응답이 필요한 단순 조회 +- **캐시 우선**: 자주 사용되는 데이터는 캐시에서 직접 읽기 +- **비동기 처리**: 외부 API 다중 호출 등 장시간 작업 +<의존성 표현 방법> +- 실선 화살표(→): 동기적 의존성 (필수) +- 비동기 화살표(->>): 비동기 의존성 (fire-and-forget) +- 점선 화살표(-->): 선택적 의존성 또는 느슨한 결합 +- 양방향 화살표(↔): 상호 의존성 +- 의존성 레이블에 목적 명시 (예: "멤버 정보 조회") +- 플로우 라벨 형식: [요청서비스약어]액션 (예: [Trip]AI 일정 생성 요청) + +[참고자료] +- 유저스토리 +- UI/UX설계서 +- 프로토타입 +- 아키텍처패턴 + +[예시] +- 논리아키텍처 다이어그램: https://raw.githubusercontent.com/cna-bootcamp/clauding-guide/refs/heads/main/samples/sample-논리아키텍처.mmd + +[결과파일] +- design/backend/logical/logical-architecture.md +- design/backend/logical/logical-architecture.mmd diff --git a/claude/mermaid-guide.md b/claude/mermaid-guide.md new file mode 100644 index 0000000..6d6b3f0 --- /dev/null +++ b/claude/mermaid-guide.md @@ -0,0 +1,300 @@ +# Mermaid문법검사가이드 + +## 개요 + +Mermaid 다이어그램의 문법 오류를 사전에 검출하여 렌더링 실패를 방지하기 위한 가이드입니다. Docker 기반 Mermaid CLI를 활용하여 로컬에서 빠르게 문법을 검증할 수 있습니다. + +## Mermaid CLI 서버 설치 및 검사 + +### Docker로 Mermaid CLI 컨테이너 실행 + +```bash +# Mermaid CLI 컨테이너가 실행 중인지 확인 +docker ps | grep mermaid-cli + +# ⚠️ 중요: 첫 실행 시 이미지 다운로드를 먼저 진행 (큰 이미지로 인한 타임아웃 방지) +docker pull minlag/mermaid-cli:latest + +# Mermaid CLI 컨테이너가 없으면 설치 및 실행 (root 권한으로 실행, 포트 48080 사용) +docker run -d --rm --name mermaid-cli -u root -p 48080:8080 --entrypoint sh minlag/mermaid-cli:latest -c "while true;do sleep 3600; done" + +# 컨테이너 상태 확인 +docker logs mermaid-cli +``` + +#### 💡 Docker 이미지 다운로드 관련 주의사항 + +**첫 실행 시 발생할 수 있는 문제:** +- `minlag/mermaid-cli:latest` 이미지가 큰 용량(약 700MB+)이므로 다운로드에 시간이 오래 걸림 +- `docker run` 명령 실행 시 이미지가 없으면 자동 다운로드하지만 타임아웃 발생 가능 +- **해결방법**: `docker pull` 명령으로 이미지를 먼저 다운로드한 후 컨테이너 실행 + +**권장 실행 순서:** +1. `docker pull minlag/mermaid-cli:latest` (이미지 다운로드) +2. `docker run` 명령으로 컨테이너 실행 +3. 필수 설정 진행 + +#### ⚠️ 중요: 최초 컨테이너 생성 후 필수 설정 + +Mermaid CLI는 Puppeteer를 사용하여 다이어그램을 렌더링하므로 Chromium 브라우저가 필요합니다. +컨테이너를 처음 생성한 후 다음 명령을 실행하여 필요한 패키지를 설치해야 합니다: + +```bash +# Chromium 및 필요한 종속성 설치 +docker exec mermaid-cli sh -c "apk add --no-cache chromium chromium-chromedriver nss freetype harfbuzz ca-certificates ttf-freefont" + +# Puppeteer가 사용할 설정 파일 생성 +docker exec mermaid-cli sh -c "echo '{\"executablePath\": \"/usr/bin/chromium-browser\", \"args\": [\"--no-sandbox\", \"--disable-setuid-sandbox\", \"--disable-dev-shm-usage\"]}' > /tmp/puppeteer-config.json" +``` + +이 설정은 컨테이너가 실행되는 동안 유지되므로 한 번만 실행하면 됩니다. + +문법검사 후 Container를 중지하지 않고 계속 사용함 + +## 문법 검사 방법 +현재 OS에 맞게 수행. + +### Linux/macOS 버전 +**스크립트 파일(tools/check-mermaid.sh)을 이용하여 수행** + +1. tools/check-mermaid.sh 파일 존재 여부 확인 +2. 스크립트 파일이 없으면 "Mermaid문법검사기(Linux/Mac)"를 tools/check-mermaid.sh 파일로 다운로드하여 스크립트 파일을 만듦 +3. 스크립트 파일이 있으면 그 스크립트 파일을 이용하여 검사 + +```bash +# 1. 스크립트 실행 권한 부여 (최초 1회) +chmod +x tools/check-mermaid.sh + +# 2. 문법 검사 실행 +./tools/check-mermaid.sh {검사할 파일} + +# 예시 +./tools/check-mermaid.sh design/backend/physical/physical-architecture.mmd +``` + +### Windows PowerShell 버전 +**스크립트 파일(tools/check-mermaid.ps1)을 이용하여 수행** + +1. tools/check-mermaid.ps1 파일 존재 여부 확인 +2. 스크립트 파일이 없으면 "Mermaid문법검사기(Window)"를 tools/check-mermaid.ps1 파일로 다운로드하여 스크립트 파일을 만듦 +3. 스크립트 파일이 있으면 그 스크립트 파일을 이용하여 검사 + +```powershell +# 문법 검사 실행 +.\tools\check-mermaid.ps1 {검사할 파일} + +# 예시 +.\tools\check-mermaid.ps1 design\backend\physical\physical-architecture.mmd +``` + +### 수동 검사 방법 (스크립트 없이) + +```bash +# 1. 고유 파일명 생성 (충돌 방지) +TEMP_FILE="/tmp/mermaid_$(date +%s)_$$.mmd" + +# 2. 파일 복사 +docker cp {검사할 파일} mermaid-cli:${TEMP_FILE} + +# 3. 문법 검사 (Puppeteer 설정 파일 사용) +docker exec mermaid-cli sh -c "cd /home/mermaidcli && node_modules/.bin/mmdc -i ${TEMP_FILE} -o /tmp/output.svg -p /tmp/puppeteer-config.json -q" + +# 4. 임시 파일 삭제 +docker exec mermaid-cli rm -f ${TEMP_FILE} /tmp/output.svg +``` + +**주의**: Puppeteer 설정 파일(`/tmp/puppeteer-config.json`)이 있어야 합니다. 없다면 위의 "최초 컨테이너 생성 후 필수 설정"을 먼저 실행하세요. + +### 검사 결과 해석 + +| 출력 | 의미 | 대응 방법 | +|------|------|-----------| +| "Success: Mermaid syntax is valid!" | 문법 오류 없음 ✅ | 정상, 렌더링 가능 | +| "Parse error on line X" | X번째 줄 구문 오류 ❌ | 해당 라인 문법 확인 | +| "Expecting 'XXX'" | 예상 토큰 오류 ❌ | 누락된 문법 요소 추가 | +| "Syntax error" | 일반 문법 오류 ❌ | 전체 구조 재검토 | + +## Mermaid 다이어그램 타입별 주의사항 + +### 1. Graph/Flowchart +```mermaid +graph TB + %% 올바른 사용법 ✅ + A[Node A] --> B[Node B] + C[Node C] -.-> D[Node D] + E[Node E] ==> F[Node F] + + %% 주의사항 + %% - 노드 ID에 공백 불가 (대신 [Label] 사용) + %% - subgraph와 end 개수 일치 필요 + %% - 따옴표 안에서 특수문자 주의 +``` + +### 2. Sequence Diagram +```mermaid +sequenceDiagram + %% 올바른 사용법 ✅ + participant A as Service A + participant B as Service B + + A->>B: Request + B-->>A: Response + A->>+B: Call with activation + B-->>-A: Return with deactivation + + %% 주의사항 + %% - participant 선언 권장 + %% - 활성화(+)/비활성화(-) 쌍 맞추기 + %% - Note 블록 종료 확인 +``` + +### 3. Class Diagram +```mermaid +classDiagram + %% 올바른 사용법 ✅ + class Animal { + +String name + +int age + +makeSound() void + } + + class Dog { + +String breed + +bark() void + } + + Animal <|-- Dog : inherits + + %% 주의사항 + %% - 메서드 괄호 필수 + %% - 관계 표현 정확히 + %% - 접근 제한자 기호 확인 +``` + +### 4. State Diagram +```mermaid +stateDiagram-v2 + %% 올바른 사용법 ✅ + [*] --> Idle + Idle --> Processing : start + Processing --> Completed : finish + Processing --> Error : error + Error --> Idle : reset + Completed --> [*] + + %% 주의사항 + %% - [*]는 시작/종료 상태 + %% - 상태 이름에 공백 불가 + %% - 전이 레이블 콜론(:) 사용 +``` + +## 일반적인 오류와 해결 방법 + +### 1. 괄호 불균형 +```mermaid +%% 잘못된 예 ❌ +graph TB + A[Node (with parenthesis)] %% 괄호 안에 괄호 + +%% 올바른 예 ✅ +graph TB + A[Node with parenthesis] +``` + +### 2. 특수 문자 이스케이프 +```mermaid +%% 잘못된 예 ❌ +graph TB + A[Security & Management] %% & 문자 직접 사용 + +%% 올바른 예 ✅ +graph TB + A[Security & Management] %% HTML 엔티티 사용 +``` + +### 3. subgraph/end 불일치 +```mermaid +%% 잘못된 예 ❌ +graph TB + subgraph One + A --> B + subgraph Two + C --> D + end %% Two만 닫힘, One은 안 닫힘 + +%% 올바른 예 ✅ +graph TB + subgraph One + A --> B + subgraph Two + C --> D + end + end %% 모든 subgraph 닫기 +``` + +### 4. 노드 참조 오류 +```mermaid +%% 잘못된 예 ❌ +graph TB + A --> UnknownNode %% 정의되지 않은 노드 + +%% 올바른 예 ✅ +graph TB + A[Node A] --> B[Node B] %% 모든 노드 정의 +``` + +## 컨테이너 관리 + +### 컨테이너 중지 및 삭제 +```bash +# 컨테이너 중지 +docker stop mermaid-cli + +# 컨테이너 삭제 +docker rm mermaid-cli + +# 한 번에 중지 및 삭제 +docker stop mermaid-cli && docker rm mermaid-cli +``` + +### 컨테이너 재시작 +```bash +# 컨테이너 재시작 +docker restart mermaid-cli +``` + +## 성능 최적화 팁 + +1. **컨테이너 유지**: 검사 후 컨테이너를 중지하지 않고 유지하여 다음 검사 시 빠르게 실행 +2. **배치 검사**: 여러 파일을 연속으로 검사할 때 컨테이너 재시작 없이 진행 +3. **로컬 파일 사용**: 네트워크 경로보다 로컬 파일 경로 사용 권장 + +## 문제 해결 + +### Docker 관련 오류 +```bash +# Docker 데몬 실행 확인 +docker ps + +# Docker Desktop 시작 (Windows/Mac) +# Docker 서비스 시작 (Linux) +sudo systemctl start docker +``` + +### 권한 오류 +```bash +# Linux/Mac에서 스크립트 실행 권한 +chmod +x tools/check-mermaid.sh + +# Docker 권한 (Linux) +sudo usermod -aG docker $USER +``` + +### 컨테이너 이미지 오류 +```bash +# 이미지 재다운로드 +docker pull minlag/mermaid-cli:latest + +# 기존 컨테이너 삭제 후 재생성 +docker stop mermaid-cli && docker rm mermaid-cli +``` \ No newline at end of file diff --git a/claude/sample-logical-architecture.mmd b/claude/sample-logical-architecture.mmd new file mode 100644 index 0000000..e2b4a08 --- /dev/null +++ b/claude/sample-logical-architecture.mmd @@ -0,0 +1,83 @@ +graph TB + %% TripGen 논리 아키텍처 - Context Map + + %% Client Layer + subgraph "Client Layer" + Mobile["모바일 클라이언트"] + end + + %% Gateway Layer + subgraph "Gateway Layer" + Gateway["API Gateway
• 인증/인가
• 라우팅
• 로드밸런싱"] + end + + %% Service Layer + subgraph "Service Layer" + UserSvc["User Service
• 사용자 인증
• 프로필 관리
• 세션 관리"] + TripSvc["Trip Service
• 여행 관리
• 멤버 설정
• 일정 조회"] + AISvc["AI Service
• 일정 생성
• 맞춤 추천
• 날씨 반영"] + LocationSvc["Location Service
• 장소 검색
• 상세 정보
• 리뷰 통합"] + end + + %% Data Layer + subgraph "Data Layer" + Cache["Redis Cache
• 세션 정보
• 장소 데이터
• AI 결과"] + Queue["Message Queue
• AI 작업 큐
• Priority Queue
• Location 비동기"] + end + + %% External APIs + subgraph "External APIs" + Claude["Claude API"] + Kakao["카카오맵 API"] + Google["구글맵 API"] + Weather["날씨 API"] + end + + %% Client to Gateway (단일 연결) + Mobile -->|HTTPS| Gateway + + %% Gateway to Services (동기) + Gateway -->|인증/프로필| UserSvc + Gateway -->|여행 관리| TripSvc + Gateway -->|장소 검색| LocationSvc + + %% Service Dependencies + TripSvc -.->|"AI 일정 생성 요청
(비동기)"| Queue + Queue -.->|작업 처리| AISvc + + %% AI Service Dependencies + AISvc -.->|"장소 정보 조회
(Cache-Aside)"| Cache + AISvc -.->|"Location 요청
(Async Fallback)"| Queue + Queue -.->|백그라운드 처리| LocationSvc + + %% Cache Dependencies + UserSvc -.->|세션 관리| Cache + TripSvc -.->|여행 정보| Cache + LocationSvc -.->|장소 캐싱| Cache + + %% External API Dependencies + AISvc -->|일정 생성| Claude + LocationSvc -->|장소 검색| Kakao + LocationSvc -->|상세/리뷰| Google + LocationSvc -->|날씨 조회| Weather + + %% Styling + classDef client fill:#BFDBFE,stroke:#3B82F6,stroke-width:2px + classDef gateway fill:#2E86AB,stroke:#1E3A8A,stroke-width:2px,color:#fff + classDef user fill:#4ECDC4,stroke:#14B8A6,stroke-width:2px + classDef trip fill:#F18F01,stroke:#F97316,stroke-width:2px + classDef ai fill:#10B981,stroke:#059669,stroke-width:2px + classDef location fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff + classDef cache fill:#F59E0B,stroke:#F97316,stroke-width:2px + classDef queue fill:#EC4899,stroke:#DB2777,stroke-width:2px + classDef external fill:#E5E7EB,stroke:#9CA3AF,stroke-width:2px + + class Mobile client + class Gateway gateway + class UserSvc user + class TripSvc trip + class AISvc ai + class LocationSvc location + class Cache cache + class Queue queue + class Claude,Kakao,Google,Weather external \ No newline at end of file diff --git a/design/backend/logical/logical-architecture.md b/design/backend/logical/logical-architecture.md new file mode 100644 index 0000000..a8f3553 --- /dev/null +++ b/design/backend/logical/logical-architecture.md @@ -0,0 +1,626 @@ +# KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 논리 아키텍처 + +## 문서 정보 +- **작성일**: 2025-10-21 +- **버전**: 1.0 +- **작성자**: System Architect +- **관련 문서**: + - [유저스토리](../../userstory.md) + - [아키텍처 패턴](../../pattern/architecture-pattern.md) + - [UI/UX 설계서](../../uiux/uiux.md) + +--- + +## 목차 +1. [개요](#1-개요) +2. [서비스 아키텍처](#2-서비스-아키텍처) +3. [주요 사용자 플로우](#3-주요-사용자-플로우) +4. [데이터 흐름 및 캐싱 전략](#4-데이터-흐름-및-캐싱-전략) +5. [확장성 및 성능 고려사항](#5-확장성-및-성능-고려사항) +6. [보안 고려사항](#6-보안-고려사항) +7. [논리 아키텍처 다이어그램](#7-논리-아키텍처-다이어그램) + +--- + +## 1. 개요 + +### 1.1 설계 원칙 + +본 논리 아키텍처는 다음 원칙을 기반으로 설계되었습니다: + +#### 유저스토리 기반 설계 +- 20개 유저스토리와 정확히 매칭 +- 불필요한 추가 기능 배제 +- 비즈니스 요구사항 우선 반영 + +#### 마이크로서비스 아키텍처 +- **서비스 독립성**: 각 서비스는 독립적으로 배포 및 확장 가능 +- **캐시 우선 전략**: Redis를 통한 서비스 간 데이터 공유 최소화 +- **선택적 비동기**: AI 및 이미지 생성 등 장시간 작업만 비동기 처리 +- **느슨한 결합**: 서비스 간 직접 의존성 최소화 + +#### 클라우드 디자인 패턴 적용 +- **Cache-Aside**: AI 응답, 이미지 생성 결과 캐싱 (응답 시간 90% 개선) +- **API Gateway**: 중앙집중식 인증/라우팅/Rate Limiting +- **Asynchronous Request-Reply**: AI 추천, 이미지 생성 비동기 처리 +- **Circuit Breaker**: 7개 외부 API 장애 격리 (가용성 99% 목표) + +### 1.2 핵심 컴포넌트 정의 + +#### Client Layer +- **Web/Mobile Client**: 반응형 React 애플리케이션 + - Mobile First 설계 (60% 모바일 사용자) + - Progressive Web App (PWA) 지원 + +#### Gateway Layer +- **API Gateway**: Kong 또는 AWS API Gateway + - JWT 토큰 기반 인증/인가 + - URL 기반 서비스 라우팅 + - Rate Limiting (사용자당 100 req/min) + - 중앙집중식 로깅 및 모니터링 + +#### Service Layer (7개 마이크로서비스) +1. **User Service**: 사용자 인증 및 매장정보 관리 +2. **Event Service**: 이벤트 CRUD 및 상태 관리 +3. **AI Service**: 트렌드 분석 및 이벤트 추천 +4. **Content Service**: SNS 이미지 자동 생성 +5. **Distribution Service**: 다중 채널 배포 관리 +6. **Participation Service**: 이벤트 참여 및 당첨자 관리 +7. **Analytics Service**: 실시간 성과 대시보드 + +#### Data Layer +- **Redis Cache**: + - 세션 정보 (User) + - AI 추천 결과 (TTL 24시간) + - 이미지 생성 결과 (TTL 7일) + - 사업자번호 검증 결과 (TTL 7일) + - 대시보드 데이터 (TTL 5분) +- **Message Queue** (RabbitMQ/Kafka): + - AI 작업 큐 (비동기 처리) + - 이미지 생성 큐 + - 배포 작업 큐 +- **Database** (PostgreSQL): + - 서비스별 독립 데이터베이스 + - User DB, Event DB, Participation DB, Analytics DB + +#### External APIs +- **국세청 사업자등록정보 진위확인 API**: 사업자번호 검증 +- **Claude API / GPT-4 API**: AI 트렌드 분석 및 이벤트 추천 +- **Stable Diffusion / DALL-E API**: SNS 이미지 생성 +- **우리동네TV API**: 영상 배포 +- **링고비즈 API**: 연결음 업데이트 +- **지니TV 광고 API**: TV 광고 배포 +- **SNS APIs** (Instagram, Naver, Kakao): SNS 자동 포스팅 + +--- + +## 2. 서비스 아키텍처 + +### 2.1 서비스별 책임 + +#### User Service +**핵심 책임**: +- 회원가입/로그인 (JWT 토큰 발급) +- 프로필 관리 (매장 정보 포함) +- 사업자번호 검증 (국세청 API 연동) +- 로그아웃 및 세션 관리 + +**관련 유저스토리**: UFR-USER-010, 020, 030, 040 + +**주요 기능**: +- JWT 기반 인증/인가 +- Redis를 통한 세션 관리 +- 사업자번호 검증 결과 캐싱 (TTL 7일) +- 매장 정보 CRUD + +**데이터 저장**: +- User DB: users, stores 테이블 +- Redis: 세션 정보, 사업자번호 검증 결과 + +#### Event Service +**핵심 책임**: +- 이벤트 CRUD 및 상태 관리 +- 이벤트 생성 플로우 오케스트레이션 +- 이벤트 목록 조회 및 필터링 +- 이벤트 상세 정보 조회 + +**관련 유저스토리**: UFR-EVENT-010, 020, 030, 040, 050, 060, 070 + +**주요 기능**: +- 이벤트 생성 플로우 관리 (목적 선택 → AI 추천 → 콘텐츠 생성 → 배포) +- 이벤트 상태 관리 (진행중/예정/종료) +- 대시보드용 이벤트 목록 제공 +- 이벤트 검색 및 필터링 + +**데이터 저장**: +- Event DB: events, event_objectives, event_prizes 테이블 + +#### AI Service +**핵심 책임**: +- 업종/지역/시즌 트렌드 분석 +- 3가지 이벤트 기획안 자동 생성 +- 예상 성과 계산 (참여자 수, 비용, ROI) + +**관련 유저스토리**: UFR-AI-010 + +**주요 기능**: +- Claude/GPT-4 API 연동 +- 비동기 처리 (Job 기반) +- 트렌드 분석 결과 캐싱 (TTL 24시간) +- 3가지 옵션 차별화 (저비용/중비용/고비용) + +**처리 시간**: +- 캐시 HIT: 0.1초 +- 캐시 MISS: 10초 이내 (비동기 Job 처리) + +**데이터 저장**: +- Redis: AI 추천 결과 (TTL 24시간) +- Redis: Job 상태 정보 (TTL 1시간) + +#### Content Service +**핵심 책임**: +- 3가지 스타일 SNS 이미지 자동 생성 +- 플랫폼별 이미지 최적화 (Instagram, Naver, Kakao) +- 이미지 편집 기능 제공 + +**관련 유저스토리**: UFR-CONT-010, 020 + +**주요 기능**: +- Stable Diffusion/DALL-E API 연동 +- 비동기 이미지 생성 (Job 기반) +- 3가지 스타일 카드 생성 (심플/화려한/트렌디) +- 생성 이미지 캐싱 및 CDN 업로드 + +**처리 시간**: +- 캐시 HIT: 0.1초 +- 캐시 MISS: 5초 이내 (비동기 Job 처리) + +**데이터 저장**: +- Redis: 이미지 생성 결과 (CDN URL, TTL 7일) +- CDN: 생성된 이미지 파일 + +#### Distribution Service +**핵심 책임**: +- 다중 채널 동시 배포 (우리동네TV, 링고비즈, 지니TV, SNS) +- 배포 상태 모니터링 +- 채널별 독립적 처리 및 실패 재시도 + +**관련 유저스토리**: UFR-DIST-010, 020 + +**주요 기능**: +- 7개 외부 API 병렬 연동 (Circuit Breaker 적용) +- 채널별 독립 처리 (하나 실패해도 다른 채널 계속) +- 자동 재시도 (최대 3회) +- Fallback 전략 (배포 스킵 + 알림) + +**처리 시간**: 1분 이내 (모든 채널 배포 완료) + +**데이터 저장**: +- Event DB: distribution_logs 테이블 + +#### Participation Service +**핵심 책임**: +- 고객 이벤트 참여 접수 +- 참여자 목록 관리 +- 당첨자 자동 추첨 + +**관련 유저스토리**: UFR-PART-010, 020, 030 + +**주요 기능**: +- 중복 참여 체크 (전화번호 기반) +- 참여자 목록 조회 및 필터링 +- 난수 기반 무작위 추첨 +- 매장 방문 고객 가산점 옵션 + +**데이터 저장**: +- Participation DB: participants, winners 테이블 + +#### Analytics Service +**핵심 책임**: +- 실시간 성과 대시보드 +- 채널별 성과 분석 +- 투자 대비 수익률 계산 + +**관련 유저스토리**: UFR-ANAL-010 + +**주요 기능**: +- 다중 데이터 소스 통합 (7개 외부 API + 내부 서비스) +- 5분 간격 데이터 폴링 및 캐싱 +- 실시간 차트 및 그래프 생성 +- POS 시스템 연동 (선택) + +**처리 시간**: 0.5초 (캐시 기반) + +**데이터 저장**: +- Analytics DB: event_stats, channel_stats 테이블 +- Redis: 대시보드 데이터 (TTL 5분) + +### 2.2 서비스 간 통신 전략 + +#### 동기 통신 (Synchronous) +**사용 시나리오**: 즉시 응답이 필요한 단순 조회 + +- **User → Redis**: 세션 정보 조회 +- **Event → User**: 사용자 정보 검증 (Token 검증은 API Gateway에서 처리) +- **Participation → Event**: 이벤트 정보 조회 +- **Analytics → Event/Participation**: 통계 데이터 조회 + +**통신 방식**: REST API (HTTP/JSON) + +#### 캐시 우선 전략 (Cache-Aside) +**사용 시나리오**: 자주 사용되는 데이터, 외부 API 결과 + +- **AI Service**: 트렌드 분석 및 이벤트 추천 결과 + - 캐시 키: `ai:recommendation:{업종}:{지역}:{목적}` + - TTL: 24시간 + - 히트율 목표: 80% + +- **Content Service**: 생성된 이미지 URL + - 캐시 키: `content:image:{이벤트ID}:{스타일}` + - TTL: 7일 + - 히트율 목표: 80% + +- **User Service**: 사업자번호 검증 결과 + - 캐시 키: `user:business:{사업자번호}` + - TTL: 7일 + - 히트율 목표: 90% + +- **Analytics Service**: 대시보드 데이터 + - 캐시 키: `analytics:dashboard:{이벤트ID}` + - TTL: 5분 + - 히트율 목표: 95% + +**효과**: +- AI 응답 시간: 10초 → 0.1초 (99% 개선, 캐시 히트 시) +- 이미지 생성 시간: 5초 → 0.1초 (98% 개선, 캐시 히트 시) +- 대시보드 로딩 시간: 3초 → 0.5초 (83% 개선) + +#### 비동기 처리 (Asynchronous Request-Reply) +**사용 시나리오**: 장시간 작업 (10초 이상 소요) + +- **AI Service**: 트렌드 분석 + 이벤트 추천 (10초) + 1. 클라이언트 → Event Service: POST /api/ai/recommendations + 2. Event Service → AI Service: Job 생성 + 3. AI Service → 클라이언트: Job ID 즉시 반환 (0.1초) + 4. 백그라운드: AI Service → Claude API (10초) + 5. 폴링: 클라이언트 → Event Service: GET /api/jobs/{id} (5초 간격) + 6. 완료: AI Service → 클라이언트: 최종 결과 반환 + +- **Content Service**: 이미지 생성 (5초) + 1. 클라이언트 → Event Service: POST /api/content/images + 2. Event Service → Content Service: Job 생성 + 3. Content Service → 클라이언트: Job ID 즉시 반환 (0.1초) + 4. 백그라운드: Content Service → Stable Diffusion API (5초) + 5. 폴링: 클라이언트 → Event Service: GET /api/jobs/{id} (3초 간격) + 6. 완료: Content Service → 클라이언트: 최종 결과 반환 + +**Message Queue 사용**: +- RabbitMQ 또는 Kafka +- Priority Queue: AI 작업 우선순위 관리 +- Dead Letter Queue: 실패 작업 처리 + +#### Circuit Breaker 패턴 +**사용 시나리오**: 외부 API 장애 격리 + +- **적용 대상**: 7개 외부 API + - 국세청 API + - Claude/GPT-4 API + - Stable Diffusion/DALL-E API + - 우리동네TV API + - 링고비즈 API + - 지니TV API + - SNS APIs (Instagram, Naver, Kakao) + +- **동작 방식**: + - Closed (정상): 실패율 5% 미만 + - Open (차단): 실패율 5% 초과 시 Circuit Open → 모든 요청 Fallback + - Half-Open (테스트): 30초 후 1개 요청 시도 → 성공 시 Closed로 전환 + +- **Fallback 전략**: + - AI Service: 캐시된 이전 추천 결과 + 안내 메시지 + - Distribution Service: 해당 채널 배포 스킵 + 알림 + - User Service: 사업자번호 검증 스킵 (수동 확인으로 대체) + +**효과**: 가용성 95% → 99% 개선 + +--- + +## 3. 주요 사용자 플로우 + +### 3.1 이벤트 생성 플로우 (핵심 플로우) + +``` +1. [User] 07-이벤트목적선택 + - 클라이언트 → API Gateway → Event Service + - Event: 목적 저장 (신규 고객 유치/재방문 유도/매출 증대/인지도 향상) + +2. [AI] 08-AI이벤트추천 + - 클라이언트 → API Gateway → Event Service → AI Service + - AI: Job ID 즉시 반환 (0.1초) + - 백그라운드: AI Service → Claude API (10초) + * 캐시 확인 (Cache-Aside) + * 캐시 MISS: Claude API 호출 → 결과 캐싱 (TTL 24시간) + - 폴링: 클라이언트 → Event Service (5초 간격) + - 완료: AI 추천 결과 (3가지 옵션) 반환 + +3. [Content] 09-SNS이미지생성 + - 클라이언트 → API Gateway → Event Service → Content Service + - Content: Job ID 즉시 반환 (0.1초) + - 백그라운드: Content Service → Stable Diffusion API (5초) + * 캐시 확인 (Cache-Aside) + * 캐시 MISS: Stable Diffusion API 호출 → 이미지 CDN 업로드 → 결과 캐싱 (TTL 7일) + - 폴링: 클라이언트 → Event Service (3초 간격) + - 완료: 3가지 스타일 이미지 URL 반환 + +4. [Content] 10-콘텐츠편집 + - 클라이언트 → API Gateway → Content Service + - Content: 텍스트/색상 편집 적용 → 새 이미지 생성 + +5. [Distribution] 11-배포채널선택 + - 클라이언트 → API Gateway → Event Service + - Event: 배포 채널 정보 저장 + +6. [Event] 12-최종승인 + - 클라이언트 → API Gateway → Event Service + - Event: 이벤트 생성 완료 → Distribution Service 호출 + - Distribution: 다중 채널 배포 시작 (Circuit Breaker 적용) + * 우리동네TV API (영상 업로드) + * 링고비즈 API (연결음 업데이트) + * 지니TV API (광고 등록) + * SNS APIs (Instagram, Naver, Kakao 자동 포스팅) + - 배포 완료: 대시보드로 이동 +``` + +### 3.2 고객 참여 플로우 + +``` +1. [Participation] 15-이벤트참여 + - 외부 채널 (SNS/TV/연결음) → 이벤트 발견 + - 클라이언트 → API Gateway → Participation Service + - Participation: 중복 참여 체크 (전화번호 기반) + - 참여 접수 완료 → 응모 번호 발급 +``` + +### 3.3 성과 분석 플로우 + +``` +1. [Analytics] 17-실시간대시보드 + - 클라이언트 → API Gateway → Analytics Service + - Analytics: 캐시 확인 (TTL 5분) + * 캐시 HIT: 즉시 반환 (0.5초) + * 캐시 MISS: 다중 데이터 소스 통합 + - Participation Service: 참여자 데이터 + - Distribution Service: 채널별 노출 수 + - 외부 APIs: 우리동네TV, 지니TV, SNS 통계 + - POS 시스템: 매출 데이터 (선택) + * 결과 캐싱 (TTL 5분) + - 실시간 차트/그래프 렌더링 +``` + +--- + +## 4. 데이터 흐름 및 캐싱 전략 + +### 4.1 데이터 흐름 + +#### 읽기 플로우 (Cache-Aside 패턴) +``` +1. Application → Cache 확인 + - Cache HIT: 캐시된 데이터 즉시 반환 + - Cache MISS: + 2. Application → Database/External API 조회 + 3. Database/External API → Application 데이터 반환 + 4. Application → Cache 데이터 저장 (TTL 설정) + 5. Application → Client 데이터 반환 +``` + +#### 쓰기 플로우 (Write-Through 패턴) +``` +1. Application → Database 쓰기 +2. Database → Application 성공 응답 +3. Application → Cache 무효화 또는 업데이트 +4. Application → Client 성공 응답 +``` + +### 4.2 캐싱 전략 + +#### Redis 캐시 구조 + +| 서비스 | 캐시 키 패턴 | 데이터 타입 | TTL | 예상 크기 | 히트율 목표 | +|--------|-------------|-----------|-----|----------|-----------| +| User | `user:session:{token}` | String | 7일 | 1KB | - | +| User | `user:business:{사업자번호}` | String | 7일 | 0.5KB | 90% | +| AI | `ai:recommendation:{업종}:{지역}:{목적}` | Hash | 24시간 | 10KB | 80% | +| Content | `content:image:{이벤트ID}:{스타일}` | String | 7일 | 0.2KB (URL) | 80% | +| Analytics | `analytics:dashboard:{이벤트ID}` | Hash | 5분 | 5KB | 95% | +| AI | `job:{jobId}` | Hash | 1시간 | 1KB | - | +| Content | `job:{jobId}` | Hash | 1시간 | 1KB | - | + +#### Redis 메모리 산정 +- **예상 동시 사용자**: 100명 +- **예상 이벤트 수**: 50개 +- **예상 캐시 항목 수**: 10,000개 +- **예상 총 메모리**: 약 50MB (운영 환경 2GB 할당) + +#### 캐시 무효화 전략 +- **TTL 기반 자동 만료**: 대부분의 캐시 +- **수동 무효화**: 이벤트 수정/삭제 시 관련 캐시 삭제 +- **Lazy 무효화**: 데이터 변경 시 다음 조회 시점에 갱신 + +### 4.3 데이터베이스 전략 + +#### 서비스별 독립 데이터베이스 +- **User DB**: users, stores +- **Event DB**: events, event_objectives, event_prizes, distribution_logs +- **Participation DB**: participants, winners +- **Analytics DB**: event_stats, channel_stats + +#### 데이터 일관성 전략 +- **Eventual Consistency**: 서비스 간 데이터는 최종 일관성 보장 +- **Strong Consistency**: 서비스 내부 트랜잭션은 강한 일관성 보장 +- **Saga 패턴**: 이벤트 생성 플로우 (보상 트랜잭션) + +--- + +## 5. 확장성 및 성능 고려사항 + +### 5.1 수평 확장 전략 + +#### 서비스별 확장 전략 +| 서비스 | 초기 인스턴스 | 확장 조건 | 최대 인스턴스 | Auto-scaling 메트릭 | +|--------|-------------|----------|-------------|-------------------| +| User | 2 | CPU > 70% | 5 | CPU, 메모리 | +| Event | 2 | CPU > 70% | 10 | CPU, 메모리 | +| AI | 1 | Job Queue > 10 | 3 | Queue 길이 | +| Content | 1 | Job Queue > 10 | 3 | Queue 길이 | +| Distribution | 2 | CPU > 70% | 5 | CPU, 메모리 | +| Participation | 1 | CPU > 70% | 3 | CPU, 메모리 | +| Analytics | 1 | CPU > 70% | 3 | CPU, 메모리 | + +#### Redis Cluster +- **초기 구성**: 3 노드 (Master 3, Replica 3) +- **확장**: 노드 추가를 통한 수평 확장 +- **HA**: Redis Sentinel을 통한 자동 Failover + +#### Database Replication +- **Primary-Replica 구조**: 읽기 부하 분산 +- **읽기 확장**: Read Replica 추가 (필요 시) +- **쓰기 확장**: Sharding (Phase 2 이후) + +### 5.2 성능 목표 + +#### 응답 시간 목표 +| 기능 | 목표 시간 | 캐시 HIT | 캐시 MISS | +|------|----------|---------|----------| +| 로그인 | 0.5초 | - | - | +| 이벤트 목록 조회 | 0.3초 | - | - | +| AI 트렌드 분석 + 추천 | 0.1초 | ✅ | 10초 (비동기) | +| SNS 이미지 생성 | 0.1초 | ✅ | 5초 (비동기) | +| 다중 채널 배포 | 1분 | - | - | +| 대시보드 로딩 | 0.5초 | ✅ | 3초 | + +#### 처리량 목표 +- **동시 사용자**: 100명 (MVP 목표) +- **API 요청**: 1,000 req/min +- **AI 작업**: 10 jobs/min +- **이미지 생성**: 10 jobs/min + +### 5.3 성능 최적화 기법 + +#### Frontend 최적화 +- **Code Splitting**: 페이지별 번들 분할 +- **Lazy Loading**: 차트 라이브러리 지연 로딩 +- **CDN**: 정적 자산 CDN 배포 +- **Compression**: Gzip/Brotli 압축 + +#### Backend 최적화 +- **Connection Pooling**: 데이터베이스 연결 풀 관리 +- **Query Optimization**: 인덱스 최적화, N+1 쿼리 방지 +- **Batch Processing**: 대량 데이터 일괄 처리 +- **Pagination**: 목록 조회 페이지네이션 + +#### Cache 최적화 +- **Multi-Level Caching**: Browser Cache → CDN → Redis → Database +- **Cache Warming**: 자주 사용되는 데이터 사전 로딩 +- **Cache Preloading**: 피크 시간 전 캐시 준비 + +--- + +## 6. 보안 고려사항 + +### 6.1 인증 및 인가 + +#### JWT 기반 인증 +- **토큰 발급**: User Service에서 로그인 시 JWT 토큰 발급 +- **토큰 검증**: API Gateway에서 모든 요청의 JWT 토큰 검증 +- **토큰 저장**: Redis에 세션 정보 저장 (TTL 7일) +- **토큰 갱신**: Refresh Token 패턴 (선택) + +#### 역할 기반 접근 제어 (RBAC) +- **역할**: OWNER (매장 사장님), CUSTOMER (이벤트 참여자) +- **권한 관리**: API별 필요 역할 정의 +- **API Gateway 검증**: 요청자의 역할 확인 + +### 6.2 데이터 보안 + +#### 민감 정보 암호화 +- **비밀번호**: bcrypt 해싱 (Cost Factor: 10) +- **사업자번호**: AES-256 암호화 저장 +- **개인정보**: 전화번호 마스킹 (010-****-1234) + +#### 전송 보안 +- **HTTPS**: 모든 통신 TLS 1.3 암호화 +- **API Key**: 외부 API 호출 시 안전한 Key 관리 (AWS Secrets Manager) + +#### 데이터 접근 통제 +- **Database**: 서비스별 독립 계정, 최소 권한 원칙 +- **Redis**: 비밀번호 설정, ACL 적용 +- **백업**: 암호화된 백업 저장 + +### 6.3 보안 모니터링 + +#### 위협 탐지 +- **Rate Limiting**: API Gateway에서 사용자당 100 req/min +- **Brute Force 방지**: 로그인 5회 실패 시 계정 잠금 (삭제됨, 향후 추가 가능) +- **SQL Injection 방지**: Prepared Statement 사용 +- **XSS 방지**: 입력 데이터 Sanitization + +#### 로깅 및 감사 +- **Access Log**: 모든 API 요청 로깅 +- **Audit Log**: 민감 작업 (로그인, 이벤트 생성, 당첨자 추첨) 감사 로그 +- **중앙집중식 로깅**: ELK Stack 또는 CloudWatch Logs + +--- + +## 7. 논리 아키텍처 다이어그램 + +논리 아키텍처 다이어그램은 별도 Mermaid 파일로 작성되었습니다. + +**파일 위치**: `logical-architecture.mmd` + +**다이어그램 확인 방법**: +1. https://mermaid.live/edit 접속 +2. `logical-architecture.mmd` 파일 내용 붙여넣기 +3. 다이어그램 시각적 확인 + +**다이어그램 구성**: +- Client Layer: Web/Mobile Client +- Gateway Layer: API Gateway +- Service Layer: 7개 마이크로서비스 +- Data Layer: Redis Cache, Message Queue, Databases +- External APIs: 7개 외부 API + +**의존성 표현**: +- 실선 화살표 (→): 동기적 의존성 +- 점선 화살표 (-.->): 비동기 의존성 또는 캐시 접근 +- 화살표 레이블: 의존성 목적 명시 + +--- + +## 부록 + +### A. 참고 문서 +- [유저스토리](../../userstory.md) +- [아키텍처 패턴](../../pattern/architecture-pattern.md) +- [UI/UX 설계서](../../uiux/uiux.md) +- [클라우드 디자인 패턴](../../../claude/cloud-design-patterns.md) + +### B. 주요 결정사항 +1. **Cache-Aside 패턴 채택**: AI 응답 시간 90% 개선 목표 +2. **Asynchronous Request-Reply 패턴 채택**: AI/이미지 생성 비동기 처리 +3. **Circuit Breaker 패턴 채택**: 외부 API 장애 격리 +4. **서비스별 독립 Database**: 마이크로서비스 독립성 보장 +5. **Redis 캐시 우선 전략**: 서비스 간 직접 의존성 최소화 + +### C. 향후 개선 방안 (Phase 2 이후) +1. **Saga 패턴**: 복잡한 분산 트랜잭션 관리 +2. **CQRS 패턴**: 읽기/쓰기 분리로 대시보드 성능 최적화 +3. **Event Sourcing**: 이벤트 변경 이력 추적 및 감사 +4. **Service Mesh**: Istio를 통한 고급 트래픽 관리 +5. **Database Sharding**: 쓰기 확장성 개선 + +--- + +**문서 버전**: 1.0 +**최종 수정일**: 2025-10-21 +**작성자**: System Architect diff --git a/design/backend/logical/logical-architecture.mmd b/design/backend/logical/logical-architecture.mmd new file mode 100644 index 0000000..c255328 --- /dev/null +++ b/design/backend/logical/logical-architecture.mmd @@ -0,0 +1,128 @@ +graph TB + %% KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 논리 아키텍처 (Context Map) + + %% Client Layer + subgraph "Client Layer" + Mobile["Web/Mobile Client
• React PWA
• Mobile First
• 반응형 디자인"] + end + + %% Gateway Layer + subgraph "Gateway Layer" + Gateway["API Gateway
• JWT 인증/인가
• 라우팅
• Rate Limiting
• 중앙 로깅"] + end + + %% Service Layer + subgraph "Service Layer" + UserSvc["User Service
• 회원가입/로그인
• 프로필 관리
• 사업자번호 검증"] + EventSvc["Event Service
• 이벤트 CRUD
• 플로우 오케스트레이션
• 상태 관리"] + AISvc["AI Service
• 트렌드 분석
• 3가지 이벤트 추천
• 비동기 Job 처리"] + ContentSvc["Content Service
• SNS 이미지 생성
• 3가지 스타일
• 비동기 Job 처리"] + DistSvc["Distribution Service
• 다중 채널 배포
• Circuit Breaker
• 배포 모니터링"] + PartSvc["Participation Service
• 이벤트 참여
• 참여자 관리
• 당첨자 추첨"] + AnalSvc["Analytics Service
• 실시간 대시보드
• 채널별 성과
• ROI 분석"] + end + + %% Data Layer + subgraph "Data Layer" + Cache["Redis Cache
• 세션 정보
• AI 추천 결과 (24h)
• 이미지 URL (7d)
• 대시보드 데이터 (5m)"] + Queue["Message Queue
• AI 작업 큐
• 이미지 생성 큐
• 배포 작업 큐"] + UserDB["User DB
• users
• stores"] + EventDB["Event DB
• events
• distribution_logs"] + PartDB["Participation DB
• participants
• winners"] + AnalDB["Analytics DB
• event_stats
• channel_stats"] + end + + %% External APIs + subgraph "External APIs" + TaxAPI["국세청 API
사업자번호 검증"] + ClaudeAPI["Claude/GPT-4 API
AI 트렌드 분석
이벤트 추천"] + SDAPI["Stable Diffusion
DALL-E API
이미지 생성"] + UriAPI["우리동네TV API
영상 배포"] + RingoAPI["링고비즈 API
연결음 업데이트"] + GenieAPI["지니TV API
TV 광고"] + SNSAPI["SNS APIs
Instagram
Naver
Kakao"] + end + + %% Client to Gateway (단일 연결) + Mobile -->|HTTPS| Gateway + + %% Gateway to Services (동기) + Gateway -->|인증/프로필| UserSvc + Gateway -->|이벤트 관리| EventSvc + Gateway -->|참여자 관리| PartSvc + Gateway -->|성과 분석| AnalSvc + + %% Event Service Dependencies + EventSvc -.->|"[Event]AI 추천 요청
(Job 생성)"| Queue + Queue -.->|비동기 작업 처리| AISvc + + EventSvc -.->|"[Event]이미지 생성 요청
(Job 생성)"| Queue + Queue -.->|비동기 작업 처리| ContentSvc + + EventSvc -->|배포 시작| DistSvc + + %% AI Service Dependencies + AISvc -.->|"AI 추천 캐싱
(Cache-Aside, 24h)"| Cache + AISvc -->|"트렌드 분석
이벤트 추천
(Circuit Breaker)"| ClaudeAPI + + %% Content Service Dependencies + ContentSvc -.->|"이미지 URL 캐싱
(Cache-Aside, 7d)"| Cache + ContentSvc -->|"이미지 생성
(Circuit Breaker)"| SDAPI + + %% Distribution Service Dependencies + DistSvc -->|"영상 배포
(Circuit Breaker)"| UriAPI + DistSvc -->|"연결음 업데이트
(Circuit Breaker)"| RingoAPI + DistSvc -->|"TV 광고
(Circuit Breaker)"| GenieAPI + DistSvc -->|"SNS 자동 포스팅
(Circuit Breaker)"| SNSAPI + + %% User Service Dependencies + UserSvc -.->|세션 관리| Cache + UserSvc -.->|"사업자번호 캐싱
(Cache-Aside, 7d)"| Cache + UserSvc -->|"사업자번호 검증
(Circuit Breaker)"| TaxAPI + UserSvc -.->|사용자 정보| UserDB + + %% Event Service Database + EventSvc -.->|이벤트 정보| EventDB + + %% Participation Service Dependencies + PartSvc -.->|참여자 데이터| PartDB + PartSvc -->|이벤트 정보 조회| EventSvc + + %% Analytics Service Dependencies + AnalSvc -.->|"대시보드 캐싱
(Cache-Aside, 5m)"| Cache + AnalSvc -.->|통계 데이터| AnalDB + AnalSvc -->|이벤트 정보| EventSvc + AnalSvc -->|참여자 데이터| PartSvc + AnalSvc -->|배포 통계| DistSvc + AnalSvc -->|"채널별 노출 수
(Circuit Breaker)"| UriAPI + AnalSvc -->|"채널별 노출 수
(Circuit Breaker)"| GenieAPI + AnalSvc -->|"SNS 통계
(Circuit Breaker)"| SNSAPI + + %% Styling + classDef client fill:#BFDBFE,stroke:#3B82F6,stroke-width:2px + classDef gateway fill:#2E86AB,stroke:#1E3A8A,stroke-width:2px,color:#fff + classDef user fill:#4ECDC4,stroke:#14B8A6,stroke-width:2px + classDef event fill:#F18F01,stroke:#F97316,stroke-width:2px + classDef ai fill:#10B981,stroke:#059669,stroke-width:2px + classDef content fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff + classDef dist fill:#EC4899,stroke:#DB2777,stroke-width:2px,color:#fff + classDef part fill:#F59E0B,stroke:#F97316,stroke-width:2px + classDef anal fill:#06B6D4,stroke:#0891B2,stroke-width:2px + classDef cache fill:#FCD34D,stroke:#F59E0B,stroke-width:2px + classDef queue fill:#FB923C,stroke:#EA580C,stroke-width:2px + classDef db fill:#A78BFA,stroke:#8B5CF6,stroke-width:2px,color:#fff + classDef external fill:#E5E7EB,stroke:#9CA3AF,stroke-width:2px + + class Mobile client + class Gateway gateway + class UserSvc user + class EventSvc event + class AISvc ai + class ContentSvc content + class DistSvc dist + class PartSvc part + class AnalSvc anal + class Cache cache + class Queue queue + class UserDB,EventDB,PartDB,AnalDB db + class TaxAPI,ClaudeAPI,SDAPI,UriAPI,RingoAPI,GenieAPI,SNSAPI external diff --git a/tools/check-mermaid.sh b/tools/check-mermaid.sh new file mode 100755 index 0000000..abb29cb --- /dev/null +++ b/tools/check-mermaid.sh @@ -0,0 +1,107 @@ +#!/bin/bash +# Mermaid Syntax Checker using Docker Container +# Similar to PlantUML checker - keeps container running for better performance + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +CYAN='\033[0;36m' +GRAY='\033[0;90m' +NC='\033[0m' # No Color + +# Check if file path is provided +if [ -z "$1" ]; then + echo -e "${RED}Error: No file path provided${NC}" + echo "Usage: $0 " + exit 1 +fi + +FILE_PATH="$1" + +# Check if file exists +if [ ! -f "$FILE_PATH" ]; then + echo -e "${RED}Error: File not found: $FILE_PATH${NC}" + exit 1 +fi + +# Get absolute path +ABSOLUTE_PATH=$(realpath "$FILE_PATH") +FILE_NAME=$(basename "$ABSOLUTE_PATH") + +echo -e "\n${CYAN}Checking Mermaid syntax for: $FILE_NAME${NC}" +echo -e "${GRAY}$(printf '=%.0s' {1..60})${NC}" + +# Check if mermaid container is running +CONTAINER_RUNNING=$(docker ps --filter "name=mermaid-cli" --format "{{.Names}}" 2>/dev/null) + +if [ -z "$CONTAINER_RUNNING" ]; then + echo -e "${RED}Error: Mermaid CLI container is not running.${NC}" + echo -e "${YELLOW}Please follow the setup instructions in the Mermaid guide to start the container.${NC}" + echo -e "\n${CYAN}Quick setup commands:${NC}" + echo "" + echo -e "${GREEN}# 1. Start container with root privileges (port 48080)${NC}" + echo -e "${NC}docker run -d --rm --name mermaid-cli -u root -p 48080:8080 --entrypoint sh minlag/mermaid-cli:latest -c \"while true;do sleep 3600; done\"${NC}" + echo "" + echo -e "${GREEN}# 2. Install Chromium and dependencies${NC}" + echo -e "${NC}docker exec mermaid-cli sh -c \"apk add --no-cache chromium chromium-chromedriver nss freetype harfbuzz ca-certificates ttf-freefont\"${NC}" + echo "" + echo -e "${GREEN}# 3. Create Puppeteer configuration${NC}" + echo -e "${NC}docker exec mermaid-cli sh -c \"echo '{\\\"executablePath\\\": \\\"/usr/bin/chromium-browser\\\", \\\"args\\\": [\\\"--no-sandbox\\\", \\\"--disable-setuid-sandbox\\\", \\\"--disable-dev-shm-usage\\\"]}' > /tmp/puppeteer-config.json\"${NC}" + echo "" + exit 1 +fi + +# Set Puppeteer configuration file path +PUPPETEER_CONFIG_FILE="/tmp/puppeteer-config.json" + +# Generate unique temp filename +TIMESTAMP=$(date +"%Y%m%d%H%M%S") +PID=$$ +TEMP_FILE="/tmp/mermaid_${TIMESTAMP}_${PID}.mmd" +OUTPUT_FILE="/tmp/mermaid_${TIMESTAMP}_${PID}.svg" + +# Copy file to container +echo -e "${GRAY}Copying file to container...${NC}" +docker cp "$ABSOLUTE_PATH" "mermaid-cli:$TEMP_FILE" >/dev/null 2>&1 + +if [ $? -ne 0 ]; then + echo -e "${RED}Error: Failed to copy file to container${NC}" + exit 1 +fi + +# Run syntax check with Puppeteer configuration +echo -e "${GRAY}Running syntax check...${NC}" +OUTPUT=$(docker exec mermaid-cli sh -c "cd /home/mermaidcli && node_modules/.bin/mmdc -i '$TEMP_FILE' -o '$OUTPUT_FILE' -p '$PUPPETEER_CONFIG_FILE' -q" 2>&1) +EXIT_CODE=$? + +if [ $EXIT_CODE -eq 0 ]; then + echo -e "\n${GREEN}Success: Mermaid syntax is valid!${NC}" +else + echo -e "\n${RED}Error: Mermaid syntax validation failed!${NC}" + echo -e "\n${RED}Error details:${NC}" + + # Parse and display error messages + while IFS= read -r line; do + if [[ $line == *"Error:"* ]] || [[ $line == *"Parse error"* ]] || [[ $line == *"Expecting"* ]] || [[ $line == *"Syntax error"* ]]; then + echo -e " ${RED}$line${NC}" + elif [[ $line == *"line"* ]] && [[ $line =~ [0-9]+ ]]; then + echo -e " ${YELLOW}$line${NC}" + elif [[ ! -z "$line" ]]; then + echo -e " ${RED}$line${NC}" + fi + done <<< "$OUTPUT" + + # Clean up and exit with error + docker exec mermaid-cli rm -f "$TEMP_FILE" "$OUTPUT_FILE" >/dev/null 2>&1 + exit 1 +fi + +# Clean up temp files +echo -e "\n${GRAY}Cleaning up...${NC}" +docker exec mermaid-cli rm -f "$TEMP_FILE" "$OUTPUT_FILE" >/dev/null 2>&1 + +echo -e "\n${CYAN}Validation complete!${NC}" + +# Note: Container is kept running for subsequent checks +# To stop: docker stop mermaid-cli && docker rm mermaid-cli \ No newline at end of file