33 Commits

Author SHA1 Message Date
Hyowon Yang
108ee10293
Merge branch 'develop' into feature/analytics 2025-10-29 19:31:10 +09:00
Hyowon Yang
20e0d24930 이벤트별 성과분석 대시보드 상세 정보 추가 및 Timeline 날짜 수정
## 주요 변경사항

### 1. Timeline 데이터 날짜 로직 수정
- **파일**: SampleDataLoader.java
- **변경**: 이벤트 ID에서 날짜를 파싱하여 실제 이벤트 시작일 기준으로 Timeline 생성
  - 기존: 모든 이벤트가 2024-09-24부터 시작
  - 수정: evt_2025012301 → 2025-01-23부터 30일치 생성
- **채널 분포**: 가중치 기반 랜덤 배정으로 변경
  - SNS: 45% (최고 비율)
  - 우리동네TV: 25%
  - 지니TV: 20%
  - 링고비즈: 10%

### 2. 이벤트별 API 상세 정보 추가
- **파일**: AnalyticsDashboardResponse.java
- **추가 필드**:
  - investment: InvestmentDetails (투자 비용 상세)
  - revenue: RevenueDetails (수익 상세)
  - costEfficiency: CostEfficiency (비용 효율성)

### 3. 이벤트별 상세 계산 로직 구현
- **파일**: AnalyticsService.java
- **추가 메서드**:
  - buildInvestmentDetails(): 투자 비용 상세 계산
    - 경품비용 50%, 콘텐츠제작비 30%, 운영비 20%, 채널배포비용(실제)
  - buildRevenueDetails(): 수익 상세 계산
    - 직접매출 70%, 예상추가매출 30%, 신규고객 40%, 기존고객 60%
  - buildCostEfficiency(): 비용 효율성 계산
    - 참여자당 비용, 참여자당 수익

### 4. ROI 전용 API 필드 수정
- **파일**: ROICalculator.java
- **수정**: UserRoiAnalyticsService와 동일한 비율 적용
  - investmentDetails에 prizeCost, channelCost 추가
  - revenueDetails에 newCustomerRevenue, existingCustomerRevenue 추가
- **기존 문제**: null 값 반환
- **해결**: 통합분석과 동일한 계산 로직 적용

## API 응답 구조

### GET /api/v1/events/{eventId}/analytics
```json
{
  "investment": {
    "total": 5000000,
    "prizeCost": 1250000,
    "contentCreation": 750000,
    "operation": 500000,
    "distribution": 2500000,
    "channelCost": 2500000
  },
  "revenue": {
    "total": 15000000,
    "directSales": 10500000,
    "expectedSales": 4500000,
    "newCustomerRevenue": 6000000,
    "existingCustomerRevenue": 9000000
  },
  "costEfficiency": {
    "costPerParticipant": 50000,
    "revenuePerParticipant": 150000
  }
}
```

## 테스트 결과
-  Timeline 날짜가 이벤트별로 정확하게 생성됨
-  채널별 참여자 분포가 가중치대로 배정됨
-  이벤트별 API에서 상세 투자/수익 정보 제공
-  ROI API에서 null 값 문제 해결

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 19:28:58 +09:00
Hyowon Yang
98ed508a6f User-level Analytics API 구현 및 Kafka Consumer 설정 개선
주요 변경사항:
- User-level Analytics API 기간 파라미터 제거 (전체 기간 자동 계산)
  * /api/v1/users/{userId}/analytics/dashboard
  * /api/v1/users/{userId}/analytics/channels
  * /api/v1/users/{userId}/analytics/roi
  * /api/v1/users/{userId}/analytics/timeline

- Kafka Consumer 안정성 개선
  * Consumer Group ID를 analytics-service-consumers-v3로 변경
  * Redis 멱등성 키 v2 버전 사용 (processed_events_v2, distribution_completed_v2, processed_participants_v2)
  * ParticipantRegisteredConsumer 멱등성 키를 eventId:participantId 조합으로 변경하여 중복 방지 강화

- 설정 개선
  * UTF-8 인코딩 명시적 설정 추가
  * Kafka auto.offset.reset 설정 명확화

- 테스트 도구 추가
  * tools/reset-analytics-data.ps1: 테스트 데이터 초기화 스크립트
  * DebugController: 개발 환경 디버깅용 엔드포인트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 18:07:20 +09:00
wonho
3da9303091 백엔드 서비스 설정 및 배포 구성 개선
- CORS 설정 업데이트 (모든 서비스)
- Swagger UI 경로 및 설정 수정
- Kubernetes 배포 설정 개선 (Ingress, Deployment)
- distribution-service SecurityConfig 및 Controller 개선
- IntelliJ 실행 프로파일 업데이트
- 컨테이너 이미지 빌드 문서화 (deployment/container/build-image.md)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 15:55:30 +09:00
wonho
e7ffdcfe44 GitHub Actions CI/CD 파이프라인 및 Kustomize 다중 환경 배포 설정
- GitHub Actions workflow로 백엔드 서비스 자동 빌드/배포 구성
- Kustomize를 통한 dev/staging/prod 환경별 설정 관리
- 각 마이크로서비스별 Dockerfile 추가
- 배포 자동화 스크립트 및 환경 변수 설정
- CI/CD 가이드 문서 작성
2025-10-29 13:24:04 +09:00
wonho
df04f85346 백엔드 서비스 AKS 배포 및 설정 완료
- Kubernetes 매니페스트 파일 생성 (7개 서비스)
  * user-service, event-service, ai-service, content-service
  * participation-service, analytics-service, distribution-service
  * 공통 리소스: Ingress, ConfigMap, Secret, ImagePullSecret

- analytics-service 배포 문제 해결
  * Hibernate PostgreSQL dialect 추가
  * DB 자격증명 수정 (eventuser/Hi5Jessica!)
  * analytics_db 데이터베이스 생성

- content-service Probe 경로 수정
  * Context path 포함 (/api/v1/content/actuator/health)

- distribution-service 신규 배포
  * Docker 이미지 빌드 및 ACR 푸시
  * K8s 매니페스트 생성 및 배포
  * Ingress 경로 추가 (/distribution)

- Gradle bootJar 설정 추가
  * 5개 서비스에 archiveFileName 설정

- 배포 가이드 문서 추가
  * deployment/k8s/deploy-k8s-guide.md
  * claude/deploy-k8s-back.md
  * deployment/container/build-image.md 업데이트

배포 완료: 모든 백엔드 서비스(7개) 정상 실행 중

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 10:59:09 +09:00
Hyowon Yang
4421f4447f Analytics Service 프론트엔드 연동을 위한 DTO 필드명 수정 및 증감 데이터 추가
- DTO 필드명 통일 (프론트엔드 호환)
  - totalParticipants → participants
  - channelName → channel
  - totalInvestment → totalCost

- 증감 데이터 필드 추가
  - participantsDelta: 참여자 증감 (현재 0, TODO)
  - targetRoi: 목표 ROI (EventStats에서 가져옴)

- EventStats 엔티티 스키마 변경
  - targetRoi 컬럼 추가 (BigDecimal, default: 0)

- Service 로직 수정
  - AnalyticsService: 필드명 변경 및 증감 데이터 적용
  - ROICalculator: totalCost 필드명 변경
  - UserAnalyticsService: 필드명 변경 및 증감 데이터 적용

- 검증 문서 추가
  - frontend-backend-validation.md: 수정 내용 및 다음 단계 정리

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 15:59:49 +09:00
Hyowon Yang
02fd82e0af Analytics Service DDL_AUTO를 create로 변경하여 스키마 재생성
문제 해결:
- storeId → userId 필드명 변경으로 인한 스키마 불일치
- PostgreSQL ERROR: column "user_id" of relation "event_stats" contains null values
- update 모드는 컬럼명 변경(rename)을 자동 처리하지 못함

변경사항:
- DDL_AUTO: update → create
- 서비스 시작 시 테이블을 DROP 후 재생성
- MVP 환경: SampleDataLoader가 샘플 데이터 자동 생성

주의사항:
- create 모드는 매번 테이블을 재생성함 (데이터 손실)
- MVP 환경에서만 사용, 실제 운영 시 update/validate로 변경 필요

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 15:31:51 +09:00
Hyowon Yang
ea4aa5d072 Analytics Service storeId → userId 변환 및 User 통합 분석 API 개발 완료
주요 변경사항:
- EventStats 엔티티 storeId → userId 필드 변경
- EventStatsRepository 메소드명 변경 (findAllByStoreId → findAllByUserId)
- MVP 환경 1:1 관계 적용 (1 user = 1 store)
- EventCreatedConsumer에서 storeId → userId 매핑 처리

User 통합 분석 API 4개 신규 개발:
1. GET /api/v1/users/{userId}/analytics - 사용자 전체 성과 대시보드
2. GET /api/v1/users/{userId}/analytics/channels - 채널별 성과 분석
3. GET /api/v1/users/{userId}/analytics/roi - ROI 상세 분석
4. GET /api/v1/users/{userId}/analytics/timeline - 시간대별 참여 추이

기술 스택:
- Spring Boot 3.3.0, Java 21
- JPA/Hibernate, Redis 캐싱 (TTL 30분)
- Kafka Event-Driven 아키텍처

문서:
- test-backend.md: 백엔드 테스트 결과서 작성 완료

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 15:19:43 +09:00
Hyowon Yang
50043add5d analytics 서비스 동시성 충돌 해결
[문제]
- ParticipantRegistered 이벤트 처리 시 StaleObjectStateException 발생
- 100개의 이벤트가 동시에 발행되어 EventStats 동시 업데이트 충돌
- TransactionRequiredException 발생 (트랜잭션 컨텍스트 부재)

[해결]
1. 비관적 락(Pessimistic Lock) 적용
   - EventStatsRepository에 findByEventIdWithLock 메서드 추가
   - PESSIMISTIC_WRITE 락으로 읽는 순간부터 다른 트랜잭션 차단

2. 트랜잭션 추가
   - 모든 Consumer 메서드에 @Transactional 어노테이션 추가
   - EventCreatedConsumer, ParticipantRegisteredConsumer, DistributionCompletedConsumer

3. 이벤트 발행 속도 조절
   - SampleDataLoader에서 10개마다 100ms 대기
   - 동시성 충돌 빈도 감소

[수정 파일]
- EventStatsRepository.java: 비관적 락 메서드 추가
- ParticipantRegisteredConsumer.java: @Transactional 추가, 락 메서드 사용
- DistributionCompletedConsumer.java: @Transactional 추가, 락 메서드 사용
- EventCreatedConsumer.java: @Transactional 추가
- SampleDataLoader.java: 이벤트 발행 속도 조절

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 09:16:55 +09:00
Hyowon Yang
25ff21f684 analytics-백엔드테스트완료 2025-10-27 15:04:03 +09:00
Hyowon Yang
180e5978a0 kafka 설정변경 2025-10-27 14:42:03 +09:00
Hyowon Yang
97a3c41fff analytics 서비스 api개발 2025-10-27 11:23:56 +09:00
Hyowon Yang
a34037cdd1 TimelineData 샘플 데이터 생성 기능 추가
- 각 이벤트당 30일 치 daily 데이터 생성
- 참여자, 조회수, 참여행동, 전환수, 누적 참여자 수 포함
- 총 90건의 시간대별 데이터 생성 (3 이벤트 × 30일)
2025-10-27 11:14:54 +09:00
Hyowon Yang
884c964af6 Kafka Consumer 자동 시작 활성화 (autoStartup=true) 2025-10-27 10:59:31 +09:00
Hyowon Yang
704a4ae4d1 Kafka 활성화 설정 추가 (KAFKA_ENABLED=true) 2025-10-27 10:43:51 +09:00
Hyowon Yang
7fa1f8cc89 .gitignore에 Gradle 추가 및 빌드 파일 제거 2025-10-27 10:21:43 +09:00
Hyowon Yang
0ed0309e66 kafka 환경변수설정 2025-10-27 10:13:06 +09:00
Hyowon Yang
f3901c8ef8 kafka 설정 변경
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 16:37:05 +09:00
Hyowon Yang
7735c8472b totalViews 필드 추가 및 배포완료 이벤트 개선
변경 사항:
1. EventStats에 totalViews 필드 추가 (모든 채널 노출 수 합계)
2. DistributionCompletedEvent에 expectedViews 필드 추가
3. DistributionCompletedConsumer 개선:
   - ChannelStats.impressions에 expectedViews 저장
   - updateTotalViews() 메서드로 전체 노출 수 집계
4. SampleDataLoader에 채널별 예상 노출 수 설정:
   - 이벤트1: 총 20,000 (우리동네TV 5K, 지니TV 10K, 링고비즈 3K, SNS 2K)
   - 이벤트2: 총 14,000
   - 이벤트3: 총 6,000

설계 다이어그램과 일치:
- 채널별 예상 노출 수 저장
- 총 노출 수 실시간 집계
- 멱등성 및 캐시 무효화 유지

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 16:08:32 +09:00
Hyowon Yang
7b3ca40e22 샘플 데이터 발행량 축소 (타임아웃 방지)
- ParticipantRegistered 이벤트: 27,610건 → 180건
- 이벤트별 참여자 수:
  - 이벤트1: 15,420명 → 100명
  - 이벤트2: 8,950명 → 50명
  - 이벤트3: 3,240명 → 30명
- Kafka 발행 지연 로직 제거 (불필요)
- MVP 테스트에 충분한 데이터 유지

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 15:27:30 +09:00
Hyowon Yang
4c8165bd20 샘플 토픽명으로 변경 (sample. 접두사 추가)
- 다른 서비스 개발자들의 운영 토픽과 충돌 방지
- MVP용 샘플 토픽: sample.event.created, sample.participant.registered, sample.distribution.completed
- KafkaTopicConfig, SampleDataLoader, 3개 Consumer 모두 업데이트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 15:15:30 +09:00
Hyowon Yang
31fb1c541b kafka활성화
🚀 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 14:59:24 +09:00
Hyowon Yang
21b8fe5efb 배치-redis,db조회수정
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 14:26:11 +09:00
Hyowon Yang
b0b0ba3263 배치서비스개발, redis설정
- Analytics 5분 단위 배치 스케줄러 추가
- 초기 데이터 로딩 기능 구현 (서버 시작 30초 후)
- Redis 설정 업데이트 (외부 Redis 서버 연결)
- Redis 읽기 전용 오류 처리 추가
- IntelliJ 실행 프로파일 생성
- @EnableScheduling 활성화

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 13:39:10 +09:00
Hyowon Yang
fb60c6f8a6 외부 API 호출 임시 비활성화 - 샘플 데이터 사용 2025-10-24 12:41:50 +09:00
Hyowon Yang
db761cd7be Analytics API 엔드포인트 인증 제거 (테스트용) 2025-10-24 11:30:09 +09:00
Hyowon Yang
ab99a26211 런타임에러해결 2025-10-24 11:00:02 +09:00
Hyowon Yang
9b10f915e3 Analytics 대시보드 샘플 데이터 자동 적재 기능 추가 2025-10-24 10:35:30 +09:00
Hyowon Yang
43e23eb7aa Kafka 조건부 활성화 설정 2025-10-24 10:31:58 +09:00
Hyowon Yang
887b46ab46 실행프로파일, 로그설정 2025-10-24 10:04:28 +09:00
Hyowon Yang
46fc1663a5 analytics 서비스개발
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 09:44:02 +09:00
cherry2250
ea82ff4748 add common module 2025-10-23 17:54:36 +09:00