## 변경사항
### 보안 강화
- gradle.properties를 .gitignore에 추가 (로컬 환경 설정 제외)
### 공통 모듈
- ErrorCode에 Legacy 호환용 에러 코드 추가 (NOT_FOUND, INVALID_INPUT_VALUE)
### Event Service
- hibernate-types 라이브러리 제거 (Hibernate 6 네이티브 지원으로 대체)
### Kafka 인프라 추가
- Kafka 메시지 DTO 3개 추가
* AIEventGenerationJobMessage: AI 이벤트 생성 작업 메시지
* EventCreatedMessage: 이벤트 생성 완료 메시지
* ImageGenerationJobMessage: 이미지 생성 작업 메시지
- Kafka Producer/Consumer 3개 추가
* EventKafkaProducer: 이벤트 메시지 발행
* AIJobKafkaConsumer: AI 작업 메시지 소비
* ImageJobKafkaConsumer: 이미지 작업 메시지 소비
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- WinnerController에 Swagger 어노테이션 추가 (Operation, Parameter, ParameterObject)
- 당첨자 목록 조회 API 기본 정렬 설정 (winnerRank ASC, size=20)
- ParticipationService에서 이벤트/참여자 구분 로직 개선
- 이벤트 없음: EventNotFoundException 발생
- 참여자 없음: ParticipantNotFoundException 발생
- EventCacheService 제거 (Redis 기반 검증에서 DB 기반 검증으로 변경)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
주요 변경사항:
- UserPrincipal 및 JWT 인증 시스템을 Long에서 UUID로 변경
- Event 엔티티 JPA 설정 최적화 (Lazy loading 및 fetch 전략 개선)
- 개발 환경용 DevAuthenticationFilter 추가 (User Service 구현 전까지 임시 사용)
- EventServiceApplication 문법 오류 수정
- Hibernate multiple bags 문제 해결 (List를 Set으로 변경)
기술 세부사항:
- common/UserPrincipal: Long → UUID 타입 변경, @Builder 어노테이션 추가
- common/JwtTokenProvider: UUID 지원 추가
- event-service/Event: Set 컬렉션 사용, Lazy loading 최적화
- event-service/EventService: Hibernate.initialize()로 컬렉션 초기화
- event-service/EventRepository: fetch join 쿼리 최적화
- event-service/SecurityConfig: DevAuthenticationFilter 통합
테스트 결과:
- 모든 Event CRUD API 정상 작동 확인
- PostgreSQL 연결 정상
- 비즈니스 로직 검증 정상 작동
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Redis 연동 구현 (패스워드 인증 지원)
- RedisConfig에 password 설정 추가
- RedisGateway에 ContentReader/Writer 인터페이스 구현
- application-dev.yml 프로파일 추가
- 이미지 삭제 기능 구현
- DeleteImageUseCase 인터페이스 추가
- DeleteImageService 구현
- ContentWriter.deleteImageById() 메서드 추가
- RedisGateway 및 MockRedisGateway 삭제 로직 구현
- 이미지 필터링 기능 추가
- GetImageListUseCase에 style, platform 파라미터 추가
- GetImageListService에 Stream filter 로직 구현
- ContentController에서 String → Enum 변환 처리
- Mock 서비스 dev 프로파일 지원
- MockGenerateImagesService dev 프로파일 추가
- MockRegenerateImageService dev 프로파일 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- convertToChannelStatus 메서드에 completedAt 파라미터 추가
- completedAt이 항상 createdAt 이후 시간으로 설정되도록 수정
- LocalDateTime.now() 대신 메서드 파라미터로 전달된 completedAt 사용
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
변경 사항:
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>
- 다른 서비스 개발자들의 운영 토픽과 충돌 방지
- 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>
- OpenApiConfig 추가: Swagger UI 기본 설정 및 API 정보 정의
- application.yml: Springdoc 설정 추가 및 웹 로깅 레벨 강화
- DistributionController: Swagger 어노테이션 추가 (@Tag, @Operation, @ApiResponses)
- API path 주석 수정: /api prefix 제거하여 실제 경로와 일치
- ChannelType 열거형 값 수정 (URIDONGNETV, RINGOBIZ, GINITV 등)
- DistributionRequest 스키마 변경 (title, description, imageUrl 추가)
- DistributionResponse 스키마 변경 (success, successCount, failureCount 등)
- ChannelDistributionResult 스키마 단순화
- 모든 예제 코드 실제 구현에 맞게 업데이트
- IntelliJ 서비스 실행 프로파일 추가
- Distribution 서비스 엔티티, 매퍼, 리포지토리 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Domain Entity 단위 테스트 (ParticipantUnitTest, DrawLogUnitTest)
- Service 단위 테스트 (ParticipationServiceUnitTest, WinnerDrawServiceUnitTest)
- 테스트코드표준 준용: Given-When-Then 패턴, BDD 스타일, Mockito 활용
- 총 29개 테스트 케이스 작성 및 검증 완료 (BUILD SUCCESSFUL)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Analytics 5분 단위 배치 스케줄러 추가
- 초기 데이터 로딩 기능 구현 (서버 시작 30초 후)
- Redis 설정 업데이트 (외부 Redis 서버 연결)
- Redis 읽기 전용 오류 처리 추가
- IntelliJ 실행 프로파일 생성
- @EnableScheduling 활성화
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- 이벤트 참여 API 구현
- 참여자 목록/상세 조회 API 구현
- 당첨자 추첨 및 조회 API 구현
- PostgreSQL 데이터베이스 연동
- Kafka 이벤트 발행 연동
- 로깅 설정 및 실행 프로파일 추가
- .gradle 폴더 Git 추적 제거
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
모든 테이블의 외래키 제약조건을 주석처리:
- event_channels.fk_event_channels_event
- generated_images.fk_generated_images_event
- ai_recommendations.fk_ai_recommendations_event
- jobs.fk_jobs_event
사유:
- JPA에서 연관관계 관리로 충분
- 개발 환경에서 유연성 확보
- 필요시 운영 환경에서 활성화 가능
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- application.yml에 로그 파일 Rolling 설정 추가
- .run 폴더를 Git 추적에 포함하도록 .gitignore 수정
- logs 디렉토리는 Git에서 제외
- IntelliJ 실행 프로파일 구조 개선
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Critical 및 High 우선순위 이슈 수정:
1. Event 엔티티 nullable 필드 변경
- eventName: nullable로 변경 (AI 추천 후 설정)
- startDate, endDate: nullable로 변경 (AI 추천 후 설정)
2. Event.publish() 검증 로직 강화
- eventName 필수 검증 추가
- startDate, endDate 필수 검증 추가
- 기간 유효성 검증 추가 (시작일 <= 종료일)
3. DDL 스키마 수정
- event_name NOT NULL 제거
- start_date, end_date NOT NULL 제거
- chk_event_period 제약조건 수정 (NULL 허용)
4. jobs 테이블 외래키 추가
- event_id에 대한 외래키 제약조건 추가
- ON DELETE CASCADE 설정으로 데이터 무결성 보장
영향:
- 이벤트 생성 시 eventName, startDate, endDate를 NULL로 허용
- 배포(publish) 시점에 필수 필드 검증으로 데이터 무결성 보장
- 이벤트 삭제 시 관련 Job 자동 삭제로 고아 레코드 방지
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- events 테이블: 이벤트 마스터
- event_channels 테이블: 배포 채널
- generated_images 테이블: 생성된 이미지
- ai_recommendations 테이블: AI 추천 기획안
- jobs 테이블: 비동기 작업 관리
- updated_at 자동 업데이트 트리거 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
주요 변경사항:
- JPA Entity 3개 삭제 (JobEntity, GeneratedImageEntity, ContentEntity)
- JPA Repository 3개 삭제 (JobJpaRepository, GeneratedImageJpaRepository, ContentJpaRepository)
- JPA Gateway 2개 삭제 (JobGateway, ContentGateway)
- Port 인터페이스 정리: backward compatibility 메서드 제거
- Service 레이어 Redis DTO 전환 (JobManagementService, MockGenerateImagesService, MockRegenerateImageService)
- MockRedisGateway에 ContentReader/ContentWriter 구현 추가 및 Immutable 패턴 처리
- application.yml에서 JPA/H2 설정 제거
- build.gradle에서 JPA 의존성 exclude 처리
- ContentApplication에서 JPA 어노테이션 제거
서비스는 이제 순수 Redis 기반 스토리지로 동작합니다.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- JWT 토큰에 매장 ID(storeId) 필드 추가
- event-service 구현 (이벤트 생성/조회 API)
- hibernate-types 의존성 추가 (UUID 지원)
- API 매핑 문서 추가
- IntelliJ 실행 프로파일 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Phase 2 작업으로 Clean Architecture의 의존성 역전 원칙을 적용하여
Service 계층이 Port 인터페이스에만 의존하도록 구조를 개선했습니다.
주요 변경사항:
1. Redis DTO 생성 (Phase 1)
- RedisAIEventData: AI 이벤트 데이터 DTO
- RedisImageData: 이미지 데이터 DTO
- RedisJobData: Job 데이터 DTO
2. Port 인터페이스 생성
- ImageWriter: 이미지 저장 Port
- ImageReader: 이미지 조회 Port
- JobWriter: Job 저장 Port
- JobReader: Job 조회 Port
3. Gateway 구현
- RedisGateway: 4개 Port 인터페이스 구현 (Production용)
- MockRedisGateway: 4개 Port 인터페이스 구현 (Local/Test용)
- JobGateway: 2개 Port 인터페이스 구현 + @Primary 추가 (Phase 3 삭제 예정)
4. 하위 호환성 유지
- Port 인터페이스에 레거시 메서드 추가 (save, findById)
- Service 계층 코드 변경 없이 점진적 마이그레이션
- "Phase 3에서 삭제 예정" 주석 표시
검증 완료:
- 컴파일 성공
- 서비스 정상 시작 (포트 8084)
- API 정상 작동 확인
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
주요 구현 사항:
- 이벤트 참여 등록 및 중복 검증 (Redis Cache + DB)
- 참여자 목록 조회 (필터링, 검색, 페이징)
- 당첨자 추첨 (Fisher-Yates Shuffle 알고리즘)
- Kafka 이벤트 발행 (ParticipantRegistered)
- Redis 캐싱으로 성능 최적화
- 전화번호 마스킹 (개인정보 보호)
- 전역 예외 처리 및 검증
기술 스택:
- Spring Boot 3.x + JPA
- MySQL (참여자, 추첨 로그)
- Redis (캐싱, 중복 검증)
- Kafka (이벤트 발행)
API 엔드포인트:
- POST /events/{eventId}/participate
- GET /events/{eventId}/participants
- GET /events/{eventId}/participants/search
- POST /events/{eventId}/draw-winners
- GET /events/{eventId}/winners
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
주요 구현 사항:
- 이벤트 참여 등록 및 중복 검증 (Redis Cache + DB)
- 참여자 목록 조회 (필터링, 검색, 페이징)
- 당첨자 추첨 (Fisher-Yates Shuffle 알고리즘)
- Kafka 이벤트 발행 (ParticipantRegistered)
- Redis 캐싱으로 성능 최적화
- 전화번호 마스킹 (개인정보 보호)
- 전역 예외 처리 및 검증
기술 스택:
- Spring Boot 3.x + JPA
- MySQL (참여자, 추첨 로그)
- Redis (캐싱, 중복 검증)
- Kafka (이벤트 발행)
API 엔드포인트:
- POST /events/{eventId}/participate
- GET /events/{eventId}/participants
- GET /events/{eventId}/participants/search
- POST /events/{eventId}/draw-winners
- GET /events/{eventId}/winners
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- RedisConfig.java: Production용 Redis 설정 추가
- RedisGateway.java: Redis 읽기/쓰기 Gateway 구현
- application-local.yml: Redis/Kafka auto-configuration 제외 설정
- test-backend.md: 7개 API 테스트 결과서 작성 (100% 성공)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- REST API Controller 구현 (이미지 생성, Job 조회, 콘텐츠 조회 등)
- Gateway 어댑터 구현 (ContentGateway, JobGateway)
- Mock Gateway 구현 (Redis, CDN, AI 이미지 생성기)
- Mock UseCase 구현 (실제 이미지 생성 시뮬레이션)
- Security 및 Swagger 설정 추가
- 로컬 테스트를 위한 H2 데이터베이스 설정 (application-local.yml)
- 비동기 처리를 위한 @EnableAsync 설정
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>