287 Commits

Author SHA1 Message Date
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
sunmingLee
074be336d6 distribution-service Swagger UI 설정 추가 및 API 문서화
- OpenApiConfig 추가: Swagger UI 기본 설정 및 API 정보 정의
- application.yml: Springdoc 설정 추가 및 웹 로깅 레벨 강화
- DistributionController: Swagger 어노테이션 추가 (@Tag, @Operation, @ApiResponses)
- API path 주석 수정: /api prefix 제거하여 실제 경로와 일치
2025-10-24 14:13:23 +09:00
sunmingLee
b0d8a6d10e distribution-service API 명세서를 실제 구현에 맞게 수정
- 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>
2025-10-24 13:45:45 +09:00
doyeon
958184c9d1 Participation Service 단위 테스트 작성 완료
- 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>
2025-10-24 13:44:14 +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
doyeon
04d417e34c Participation Service 백엔드 개발 완료
- 이벤트 참여 API 구현
- 참여자 목록/상세 조회 API 구현
- 당첨자 추첨 및 조회 API 구현
- PostgreSQL 데이터베이스 연동
- Kafka 이벤트 발행 연동
- 로깅 설정 및 실행 프로파일 추가
- .gradle 폴더 Git 추적 제거

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 13:29:10 +09:00
merrycoral
55c7b838dd DDL 외래키 제약조건 주석처리
모든 테이블의 외래키 제약조건을 주석처리:
- 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>
2025-10-24 13:28:08 +09:00
merrycoral
860293b2b9 Event Service DDL 최적화 작업 (Medium/Low 우선순위)
Medium 우선순위 수정:
1. created_at, updated_at 기본값 정책 정리
   - DEFAULT CURRENT_TIMESTAMP 제거
   - JPA @CreatedDate/@LastModifiedDate로 관리 명시
   - 주석으로 관리 주체 명확화

2. updated_at Trigger 비활성화
   - JPA 환경에서는 애플리케이션 레벨 관리
   - Trigger 코드는 주석으로 보존 (필요시 활성화 가능)
   - 이중 업데이트 메커니즘 제거로 성능 개선

Low 우선순위 추가:
3. 복합 인덱스 추가 (쿼리 성능 최적화)
   - events: (user_id, status, created_at DESC)
     → 사용자별 상태 필터링 + 최신순 정렬 최적화
   - generated_images: (event_id, is_selected)
     → 이벤트별 선택 이미지 조회 최적화
   - ai_recommendations: (event_id, is_selected)
     → 이벤트별 선택 추천 조회 최적화
   - jobs: (status, created_at DESC)
     → 상태별 최신 작업 조회 최적화

영향:
- JPA와 Database 역할 분담 명확화
- 불필요한 중복 메커니즘 제거
- 쿼리 성능 향상 (복합 인덱스)
- 유지보수성 개선

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 13:25:31 +09:00
doyeon
c6de9bd1d0 로깅 설정 추가 및 실행 프로파일 수정
- 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>
2025-10-24 13:22:39 +09:00
merrycoral
c63cf950eb Event Service 엔티티와 DDL 형상 일치화 작업
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>
2025-10-24 13:22:14 +09:00
sunmingLee
9f50c7feaa distribution-service에 PostgreSQL, Redis 연결 설정 추가
- application.yml에 DB 및 캐시 설정 추가
- IntelliJ 실행 프로파일에 환경 변수 설정
- Kafka 브로커 주소를 실제 서버로 변경
2025-10-24 13:08:42 +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
merrycoral
7b76e573ed Event Service 데이터베이스 테이블 생성 SQL 추가
- 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>
2025-10-24 11:23:55 +09:00
doyeon
e10814f83a .gitignore 업데이트 - 민감 정보 및 로컬 설정 제외
- .gradle/ 추가 (Gradle 캐시)
- .run/ 추가 (IntelliJ 실행 프로파일, DB 비밀번호 포함)
- backing-service/docker-compose.yml 추가 (로컬 개발용 Docker 설정)
2025-10-24 11:18:21 +09:00
sunmingLee
28a7a91ca2 Swagger 관련 변경사항 롤백 및 정리 2025-10-24 11:04:59 +09:00
Hyowon Yang
ab99a26211 런타임에러해결 2025-10-24 11:00:02 +09:00
cherry2250
ff83dca1a1 Phase 3: content-service JPA 완전 제거 및 Redis 전용 전환
주요 변경사항:
- 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>
2025-10-24 10:46:33 +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
merrycoral
379ab0f1f9 Merge branch 'feature/event' of https://github.com/ktds-dg0501/kt-event-marketing into feature/event 2025-10-24 10:27:36 +09:00
Hayoung Song
f3be6917b5
Merge pull request #1 from ktds-dg0501/main
되돌리기
2025-10-24 10:23:06 +09:00
merrycoral
5476fe9388 event-service 초기 구현 및 JWT 토큰 매장 ID 추가
- 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>
2025-10-24 10:17:45 +09:00
cherry2250
5e9e1759ce Content Service Phase 2: Port 인터페이스 구현 및 Gateway 통합
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>
2025-10-24 10:14:54 +09:00
Hyowon Yang
887b46ab46 실행프로파일, 로그설정 2025-10-24 10:04:28 +09:00
doyeon
ade2719dc7 Revert "Participation Service 백엔드 개발 완료"
This reverts commit e0c1066316dddddbe052bf6e639dc0d7d49b0b0d.
2025-10-24 10:00:48 +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
doyeon
e0c1066316 Participation Service 백엔드 개발 완료
주요 구현 사항:
- 이벤트 참여 등록 및 중복 검증 (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>
2025-10-24 09:29:03 +09:00
doyeon
50cf1dbcf1 Revert "Participation Service 백엔드 개발 완료"
This reverts commit 5c8aced0431d2f0757b7d93112faaf1a9375a868.
2025-10-24 09:25:23 +09:00
doyeon
5c8aced043 Participation Service 백엔드 개발 완료
주요 구현 사항:
- 이벤트 참여 등록 및 중복 검증 (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>
2025-10-24 09:21:39 +09:00
cherry2250
6dc6334c75 Content Service Redis 연동 및 테스트 완료
- 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>
2025-10-23 22:08:17 +09:00
cherry2250
06995864b9 Content Service API 테스트 구현 추가
- 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>
2025-10-23 21:30:21 +09:00
cherry2250
3d1dbda74b content-service 핵심 비즈니스 로직 및 영속성 계층 구현 완료
- Domain 모델 구현 (ImageStyle, Platform, GeneratedImage, Content, Job)
- JPA Entity 및 Repository 구현 (3개 엔티티, 3개 리포지토리)
- UseCase 인터페이스 정의 (Inbound 6개, Outbound 8개)
- Service 구현 (JobManagement, GetEventContent, GetImageList, GetImageDetail)
- DTO 구현 (ContentCommand, ContentInfo, ImageInfo, JobInfo)
- Application 설정 (ContentApplication, application.yml)
- 컴파일 오류 수정 및 검증 완료

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 20:48:56 +09:00
Hyowon Yang
25b1ec8b81 링고비즈api추가 2025-10-23 17:58:54 +09:00
cherry2250
ea82ff4748 add common module 2025-10-23 17:54:36 +09:00
wonho
8029d8f9ce 매장정보 조회 API에서 사업자등록번호 제거
- StoreDetailResponse 스키마에서 businessNumber 필드 제거
- 매장정보 조회 응답 예시에서 businessNumber 제거
- User Service의 모든 API에서 사업자등록번호 사용 중단

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 17:27:28 +09:00
wonho
e536e3dfc8 CLAUDE.md에 Lessons Learned 섹션 추가
- Spring Boot 설정 관리 가이드 추가
- 개발 워크플로우 핵심 원칙 추가
- 설정 파일 구조 및 환경 변수 관리 방법 명시
- 컴파일 및 서버 시작 프로세스 정리

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 17:22:43 +09:00
sunmingLee
dea202a3fd 불필요한 폴더 정리 2025-10-23 17:20:31 +09:00
Hyowon Yang
90645a6a42 Merge branch 'main' of https://github.com/ktds-dg0501/kt-event-marketing 2025-10-23 17:19:33 +09:00
Hyowon Yang
546593b9a1 analytics 링고비즈추가 2025-10-23 17:19:02 +09:00
wonho
74d03fd4bf User Service API에서 사업자등록번호 파라미터 제거
- 회원가입 API에서 businessNumber 필드 제거
- API 설명에서 사업자번호 검증 관련 내용 제거
- RegisterRequest 스키마에서 businessNumber required 및 property 제거
- 회원가입 예시에서 businessNumber 제거
- 사업자번호 검증 실패 에러 케이스 제거
- USER_002 에러 코드 제거

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 17:18:44 +09:00
cherry2250
29baa2dee9 edit folder 2025-10-23 17:17:09 +09:00
cherry2250
6b1c4224f7 7개 마이크로서비스 API 명세서 컨벤션 통일
- 공통 OpenAPI 3.0.3 컨벤션 문서 작성 (design/backend/api/API_CONVENTION.md)
- 7개 서비스 API 명세서 표준화 완료:
  * User Service (8081)
  * Event Service (8080)
  * Content Service (8082)
  * AI Service (8083)
  * Participation Service (8084)
  * Distribution Service (8085)
  * Analytics Service (8086)

주요 변경사항:
- API 경로에서 /api prefix 제거 (/api/users → /users)
- 서버 URL 패턴 통일 (Local → Dev → Prod)
- 연락처 정보 표준화 (Digital Garage Team)
- ErrorResponse 스키마 통일 (error → message, details 추가)
- securitySchemes 이름 통일 (BearerAuth)
- 포트 번호 명확히 할당

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 17:12:28 +09:00
cherry2250
b9745f24e5 7개 마이크로서비스 API 설계 완료
- User Service API (7 APIs, 31KB)
- Event Service API (14 APIs, 41KB)
- AI Service API (3 APIs, 26KB)
- Content Service API (6 APIs, 37KB)
- Distribution Service API (2 APIs, 21KB)
- Participation Service API (5 APIs, 25KB)
- Analytics Service API (4 APIs, 28KB)

총 41개 API 엔드포인트, 6,912줄, OpenAPI 3.0 표준 준수
유저스토리 기반 설계, JWT 인증, Kafka/Redis 통합 문서화
API 설계서 작성 완료 (종합 가이드 포함)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 16:56:54 +09:00
wonho
781c3944ed MQ 설치 결과서 작성 (개발 환경)
- Kafka 브로커 정보 추가 (4.230.50.63:9092)
- Consumer Group ID 설정 (ai, analytic)
- Spring Boot 연결 설정 예시 포함
- 토픽 설정 및 연결 테스트 방법 추가

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 16:50:09 +09:00
cherry2250
b571f52abd 파일명 변경: event-이미지* → content-이미지*
변경 이유:
- outer sequence 기준으로 이미지 생성은 Content Service 담당
- 파일명을 서비스 소유권에 맞게 변경

변경 파일:
- event-이미지생성요청.puml → content-이미지생성요청.puml
- event-이미지결과조회.puml → content-이미지결과조회.puml

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 16:37:54 +09:00
cherry2250
3fdde64dd6 Merge branch 'main' of https://github.com/ktds-dg0501/kt-event-marketing 2025-10-23 16:33:24 +09:00
cherry2250
e15b7b42e5 이미지 생성 및 AI 추천 inner sequence 수정
주요 변경사항:
- event-이미지생성요청.puml: Kafka 제거, ContentService 내부 Job 관리로 변경
- event-이미지결과조회.puml: ContentService 패턴으로 업데이트
- event-AI추천요청.puml: Gateway 패턴 추가, 한글화

아키텍처 구분:
- AI 추천: Kafka 사용 (ai-job-topic)
- 이미지 생성: 내부 Job 관리 (Kafka 사용 안 함)

모든 파일:
- Gateway 패턴 적용
- 레이어 아키텍처 (<<API Layer>>, <<Business Layer>>)
- 한글 요청/응답
- Redis 키 패턴 표준화

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 16:31:36 +09:00
cherry2250
d7d4b0a2da inner sequence 동기화 완료 - Gateway 패턴 및 한글화
- event-추천결과조회.puml: Gateway 패턴 추가, 레이어 아키텍처 적용, 한글화
- event-추천안선택.puml: Gateway 패턴 추가, 5단계 구조화, 한글화
- event-콘텐츠선택.puml: ContentService로 변경, Gateway 패턴, 한글화
- event-최종승인및배포.puml: Gateway 패턴 추가, 7단계 구조화, 한글화

모든 파일 공통 변경사항:
- Client actor 및 API Gateway 추가
- <<API Layer>>, <<Business Layer>>, <<Data Layer>> 레이어 구분
- 모든 요청/응답 한글 표시
- Repository CRUD 한글 설명 (SQL 제거)
- Redis 캐시 키 패턴 표준화

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 16:31:16 +09:00
박세원
56f05ba25b CDN에서 Azure Blob Storage로 이미지 저장소 변경
- CDNUploader를 BlobStorageUploader로 교체
- SAS Token 기반 접근 제어 추가 (유효기간 7일)
- Blob Storage Retry 로직 추가 (최대 3회, Exponential Backoff)
- 보안 강화: Public Access 비활성화, 읽기 전용 SAS Token
- Redis 캐싱에 Blob SAS URL 저장 (TTL 7일)
- 성능 영향 최소화 (+0.05-0.1초, 전체의 1-2%)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 16:30:47 +09:00