2026년 1월 변경 이력
2026-01-30
📧 이메일 시스템(Email System) 도입 및 설계
사용자 보안 강화와 안정적인 커뮤니케이션을 위한 이메일 발송 시스템 설계를 완료했습니다.
- AWS SES 기반 인프라: 고비용 SMTP 대신 확장성과 신뢰성이 높은 AWS SES를 메인 프로바이더로 채택했습니다.
- Redis 활용 비동기 인증:
- 링크 인증 방식: 사용자 경험(UX)을 고려한 이메일 내 버튼 클릭 인증 방식을 설계했습니다.
- 토큰 관리: 인증 토큰을 Redis에 TTL(30분)과 함께 저장하여 DB 부하를 줄이고 보안을 강화했습니다.
- 비동기 처리: 이메일 전송 작업을 백그라운드 큐에서 처리하여 회원가입 시 사용자 응답 지연을 방지하는 아키텍처를 수립했습니다.
- 문서화: 이메일 시스템 설계 문서를 신설하여 아키텍처와 구현 로드맵을 기록했습니다.
2026-01-21
👤 페르소나(Persona) 기반 서비스 전환 및 인프라 구축
단순 생성 도구를 넘어 '나만의 AI 인플루언서'를 만들고 관리할 수 있는 서비스로 진화하기 위한 핵심 인프라를 구축했습니다.
-
Backend: 페르소나 관리 시스템
- 데이터 모델:
Persona엔티티를 추가하여 유저별 캐릭터 정보를 관리합니다. (이름, 설명, 기본 프롬프트, 원본/썸네일 이미지 경로 포함) - DB 마이그레이션:
personas및workflow_mappings테이블 생성을 위한 마이그레이션을 완료했습니다. - 워크플로우 매핑: 특정 기능(예: 페르소나 사진 생성)이 실제 어떤 워크플로우를 사용할지 관리자가 동적으로 설정할 수 있는
WorkflowMapping시스템을 도입했습니다. - S3 스토리지 확장:
StorageController에서bucketType('temp' | 'permanent')을 지원하여 페르소나와 같은 영구 데이터를 분리 저장할 수 있도록 개선했습니다.
- 데이터 모델:
-
Frontend: 사용자 중심 페르소나 UI
- 이미지 크롭(Cropping):
react-easy-crop을 도입하여 페르소나 등록 시 유저가 직접 원형 아바타 영역을 지정할 수 있는 UI를 구현했습니다. - UUID 파일명: 업로드 시 파일명을 UUID로 강제 변환하여 특수문자로 인한 경로 깨짐 문제를 원천 방지했습니다.
- 레이아웃 개편:
- 페르소나 목록 페이지(
/personas) 신설 및 '추가 카드' 디자인 적용. - 페르소나 상세 페이지(
/personas/[id]) 레이아웃 구축. - 사이드 메뉴에 페르소나 바로가기 추가.
- 페르소나 목록 페이지(
- 화면 최적화: 고정된
maxWidth를 제거하고 화면 폭을 최대로 활용하는 시원한 레이아웃으로 변경했습니다.
- 이미지 크롭(Cropping):
2026-01-19
💰 자동 환불 시스템 구축 (Auto-Refund System)
- 문서: Vivid Token 설계
- 내용: 시스템 장애나 예외 상황 발생 시 사용자 자산을 보호하기 위한 자동 환불 메커니즘을 도입했습니다.
- 즉시 환불: 생성 실패(
FAILED) 시 즉시 환불. - 대기열 타임아웃: 대기(
PENDING) 1시간 초과 시 자동 취소 및 환불. - 워커 장애 감지: 실행 중(
PROCESSING) 10분 이상 무응답 시 자동 취소 및 환불.
- 즉시 환불: 생성 실패(
2026-01-12
🚀 시스템 관리 및 보안 강화
서버 웜업 매니저 (Server Warmup Manager) 고도화
- 스테이징/라이브 패턴 도입: 관리자 UI에서 설정을 즉시 반영하지 않고 '스테이징' 상태로 관리한 뒤, 'S3 배포(Sync)' 버튼을 통해 한꺼번에 반영하는 워크플로우를 구축했습니다.
- 트랜잭션 기반 S3 동기화: DB 업데이트와 S3 파일 업로드를 하나의 트랜잭션으로 묶어, 어느 한 쪽이 실패할 경우 전체 롤백되도록 구현하여 데이터 정합성을 확보했습니다.
- 변경 감지 (MD5 Hashing): DB에 저장된 JSON과 S3의 실제 파일 내용을 비교하기 위해 MD5 해시값을 메타데이터로 관리합니다. 이를 통해 UI에서 "Changed(변경됨)" 상태를 시각적으로 표시합니다.
- 백엔드 캐싱 최적화: S3 메타데이터 조회 비용을 절감하기 위해 백엔드에서 60초간 S3 데이터를 캐싱하며, Sync 성공 시 즉시 캐시를 무효화합니다.
- Revert 기능: 현재 DB 설정을 버리고 S3의 최신 라이브 상태로 복구하는 기능을 추가했습니다.
다중 계층 속도 제한 시스템 (Multi-layer Rate Limiting)
- 글로벌 표준 제한: 백엔드 전역에 분당 120회의 요청 제한을 적용하여 일반적인 공격과 무분별한 스크랩을 방지합니다.
- 버스트 보호 (Burst Protection): 페이지 로딩 시 발생하는 동시 API 요청을 수용하기 위해 전역 초당 제한을 20회로 상향 조정했습니다.
- 민감 기능 정밀 제어: S3 비용과 직결되는 웜업 매니저 API에는 분당 10회, 초당 5회의 엄격한 제한을 적용했습니다.
- 프론트엔드 UX 가이드:
- 생성 버튼 쿨다운: 생성 요청 성공 시 5초간 버튼을 비활성화하고 타이머를 표시하여 사용자의 실수 및 연타를 방지합니다.
- 관리자 쿨다운: 웜업 매니저의 새로고침(30초) 및 배포(60초) 버튼에 로컬 타이머를 적용하고 차단 시 토스트 알림을 제공합니다.
- 시스템 헬스체크 예외: Kubernetes의 Readiness Probe가 차단되지 않도록
/v1엔드포인트에 넉넉한 전용 제한(분당 300회)을 설정했습니다.
📝 문서화
ROADMAP.md: 시스템 관리 및 보안 섹션을 추가하고 진행 상황을 업데이트했습니다.OVERVIEW.md: 프로젝트 핵심 목표에 시스템 관리 및 보안 강화 내용을 반영했습니다.
2026-01-07
🚀 인프라 개선 및 보안 설정
EKS 네트워크 보안 및 연결성 강화
- 보안 그룹 최적화: EKS 클러스터와 AWS 리소스(RDS, ElastiCache) 간의 통신을 위해 필수 포트(3000, 53 UDP/TCP, 6379, 443, 10250, 9443)를 식별하고 보안 그룹에 반영했습니다.
- 애플리케이션 가용성 확보: ALB Load Balancer Controller에 의해 관리되는 3000번 포트 규칙의 중요성을 확인하고 가이드에 추가했습니다.
- DNS 장애 해결: DNS 조회 시 발생하던
EAI_AGAIN에러의 원인이 UDP 53번 포트 차단임을 확인하고, 이를 허용하여 Redis 및 외부 서비스 연결 안정성을 확보했습니다.
🚀 데이터베이스 마이그레이션 체계 도입 및 환경 동기화
마이그레이션 중심의 개발 프로세스 전환
- Synchronize 비활성화: 모든 환경(Local, Dev, Prod)에서 TypeORM의
synchronize: false를 설정하여 의도치 않은 스키마 변경을 방지합니다. - Initial Schema 통합: 모든 환경의 데이터베이스를 초기화하고,
initialSchema마이그레이션 파일을 통해 동일한 스키마 상태로 동기화했습니다. - 자동 마이그레이션(MigrationsRun): 서버 기동 시 미적용 마이그레이션 파일이 있다면 자동으로 실행되도록
migrationsRun: true를 설정했습니다. 이제 배포 시 마이그레이션 파일만 포함하면 DB가 자동으로 업데이트됩니다.
Multi-Variant 기반 동적 미디어 처리 강화
- Media Input Panel:
Advanced Settings내에 'Media' 탭을 신설하여 모델의inputConfig에 따라 필요한 이미지/비디오 슬롯이 동적으로 나타나도록 구현했습니다. - 지연 업로드(Lazy Upload): 생성 버튼 클릭 시점에만 S3로 업로드하고, 반환된 S3 경로를 워크플로우 매핑 값으로 치환하는 효율적인 프로세스를 도입했습니다.
- S3-ComfyUI 연동:
ai-node-agent가 워크플로우 내의s3://주소를 감지하여 ComfyUI의 로컬input디렉토리로 자동 다운로드 및 경로 치환을 수행하도록 개선했습니다.
📝 문서화
SECURITY_GROUPS.md: EKS 환경에서 필요한 핵심 포트 목록과 DNS 트러블슈팅 가이드를 포함한 신규 문서를 작성했습니다.README.md: 인프라 섹션에 보안 그룹 설정 가이드 링크를 추가했습니다.BACKEND_README.md: 데이터베이스 마이그레이션 가이드 및 신규 개발 워크플로우 정책을 업데이트했습니다.
2026-01-06
🚀 기능 추가 및 개선
Multi-Variant Workflow 시스템 도입
- Backend:
Workflow엔티티를WorkflowGroup과WorkflowVariant로 분리하여 1:N 구조를 지원합니다.- WorkflowGroup: 제품(Product) 레벨의 메타데이터(이름, 설명, 가격, 카테고리 등) 관리.
- WorkflowVariant: 구현(Implementation) 레벨의 ComfyUI 워크플로우 및 매핑 정보 관리.
- 동적 라우팅: 사용자의 입력 데이터(
text_1,image_1등) 조합을 분석하여 적절한 Variant를 자동으로 선택하는 로직 구현.
- Frontend:
- Admin Panel: 4단계 워크플로우 생성 마법사(Basic Info -> Variants -> Mappings -> User Inputs) 구현.
- User UI:
GlobalGenerator에서 선택된 그룹의 Variant 정보를 기반으로 동적으로 입력 폼을 렌더링하도록 개선.
프롬프트 데이터 표준화
- 키 표준화: 기존의
positive_prompt,prompt등의 혼재된 키를text_1,text_2등의 표준화된 키로 통합 관리합니다. - UI 반영: Frontend 갤러리 및 상세 페이지에서
text_1필드를 우선적으로 사용하여 프롬프트를 표시하도록 로직을 수정했습니다.
UI/UX 및 성능 개선
- Grid System: MUI v6 표준에 맞춰
Grid item속성을 제거하고size속성을 도입했습니다. - 이미지 최적화: Next.js
Image컴포넌트에sizesprop을 추가하고width/height스타일(auto)을 보완하여 레이아웃 시프트 및 성능 경고를 해결했습니다. - 가상 스크롤:
CreationVirtualList로직을CreationPage에 통합하여 상태 업데이트 충돌을 해결하고,smooth스크롤 동작을 최적화했습니다.
🐛 버그 수정
- 갤러리 렌더링 오류: 가상 스크롤 컴포넌트 분리로 인한 렌더링 충돌 문제를 해결했습니다.
- 빈 이미지 소스 처리: 지갑 아이콘 및 생성 중인 이미지 Placeholder에서 빈 문자열(
"")이src로 전달되어 발생하는 네트워크 오류를 수정했습니다.
📝 문서화
ARCHITECTURE.md: Multi-Variant 시스템 아키텍처 반영 확인 및 데이터 모델 설명 업데이트.