코디 모듈 개발 착수 계획 (MVP)
기준일: 2026-03-04
1. 적용 고정 사항 (결정 확정)
coordis와outfits는 분리 테이블로 유지한다.outfits.coordiId는 필수(NOT NULL)다.- 공유 적용은 원본 참조가 아니라 내 계정 복제 방식만 허용한다.
- 착장 생성 기본 배치는 4장(batch_size=4) 이다.
- Scene 생성에서
image_1은 항상outfit이다. - Scene 생성에서
image_2,image_3는 선택 참조 입력으로 허용한다. - 코디 텍스트 프롬프트가 있으면 Scene 프롬프트 합성에 포함한다.
- MVP 범위에서
coordi_cards,persona_versions, coordi versioning은 도입하지 않는다.
2. 모듈 분해
2.1 Backend 서브모듈
coordis- CRUD
- 공개 코디 복제(
copy to my account)
outfits- 착장 생성 요청(배치 4)
- 후보 선택 저장
- CRUD
default-assets- 관리자용
기본 에셋 관리 USER/SYSTEM출처 분리- 관리자 업로드 이미지/영상 저장소
- 사용자 조회용
includeSystem필터
- 관리자용
generation-bridge- Persona/Coordi/Scene 입력 주입 규칙
creations.snapshot및 projection 저장creation_results정렬/seed 저장
2.2 Frontend 서브모듈
/personas/[id]허브- 탭:
코디 | 착장 - 코디 선택 -> 착장 생성 -> Scene 진입
- 탭:
- 각 좌측 목록
기본 에셋 포함체크박스- 기본값은 포함
SYSTEM에셋은 읽기 전용 렌더링
/personas/[id]/prepare/image|video- Scene 생성 전 공통 촬영 준비 단계
- 현재는
착장선택만 활성 - 향후
헤어,메이크업등 외형 프리셋 카테고리로 확장
- Scene 페이지(i2i/i2v)
- 고정 컨텍스트:
persona + outfit - 코디+Scene 프롬프트 합성 표시
- 히스토리 배치 렌더링(4장)
- 고정 컨텍스트:
2.3 Data/Persistence 서브모듈
coordis저장 계약outfits저장 계약 (coordiIdFK)default assets저장 계약 (assetSource, 관리자 업로드 미디어)creations/creation_results저장 계약
3. 데이터 모델
3.1 coordis
- 필수 필드
id,userId,nameassetSource(USER | SYSTEM)positivePrompt,negativePrompt(빈 문자열 허용)refImageS3Path,refImage2S3Path(nullable)s3Path,thumbnailS3Pathvisibility,createdAt,updatedAt
3.2 outfits
- 필수 필드
id,personaId,userId,nameassetSource(USER | SYSTEM)coordiId(NOT NULL)s3Path,thumbnailS3PathoutfitPrompt,outfitNegativePrompt(nullable)visibility,createdAt,updatedAt
3.3 personas
- 필수 필드
id,userId,nameassetSource(USER | SYSTEM)s3Path,thumbnailS3PathbasePrompt,identityPromptcreatedAt,updatedAt
3.4 persona_media_assets (신규)
- 목적
- 관리자가 직접 업로드한 기본 이미지/영상 보관
- 필수 필드
id,personaIdoutfitId(nullable)mediaType(IMAGE | VIDEO)assetSource(SYSTEM)s3Path,thumbnailS3PathsortOrder,isActivecreatedByUserId,createdAt,updatedAt
- 비고
- 생성 결과를 나타내는
creations와 분리한다. - 일반 유저가 수정/삭제하지 못하는 운영 카탈로그 자산으로 취급한다.
- 생성 결과를 나타내는
4. 생성 계약
4.1 코디 생성 (PERSONA_COORDI_GEN)
- t2i/i2i 통합 기능
- 입력:
text_1,text_2, 선택 참조 이미지 - 출력: 코디 이미지 + 프롬프트
4.2 착장 생성 (PERSONA_OUTFIT_GEN)
- 필수 입력:
personaId,coordiId - 기본 배치: 4
- 출력: 후보 4장, 선택 후
outfits저장
4.3 Scene 생성 (PERSONA_TO_IMAGE_GEN, PERSONA_TO_VIDEO_GEN)
- 준비 단계:
/personas/[id]/prepare/image|video- 현재는
outfitId선택만 활성
- 필수 입력:
outfitId - 주입
image_1 = outfit.s3Pathimage_2,image_3= 사용자 선택 참조
- 프롬프트 합성
resolved_positive = join(coordi.positivePrompt, scene.text_1)resolved_negative = join(coordi.negativePrompt, scene.text_2)- 빈 값 제외 후 최종 빈 문자열 허용
5. 저장 계약
5.1 creations.snapshot (jsonb)
필수 키:
text_1,text_2personaId,featureKey,workflowGroupId,variantId
조건부 키:
coordiId(코디/착장/Scene 맥락)outfitId(Scene 맥락)
비고:
- 미래의 준비 단계 확장 카테고리(
hairStyleId,makeupId)는 MVP 범위에서 snapshot 계약에 포함하지 않는다.
5.2 creations projection
resolved_prompt,resolved_negative_prompt,ratio,refs
5.3 creation_results
seed,resultIndex,s3Path,thumbnailS3Path- 정렬 규칙:
Creation(1):CreationResult(N), 내부resultIndex ASC
6. API 초안
Coordis
GET /api/v1/coordis?includeSystem=true|falsePOST /api/v1/coordisPATCH /api/v1/coordis/:coordiIdDELETE /api/v1/coordis/:coordiIdPOST /api/v1/coordis/:coordiId/copy
Outfits
GET /api/v1/personas/:personaId/outfits?includeSystem=true|falsePOST /api/v1/personas/:personaId/outfits/generatePOST /api/v1/personas/:personaId/outfits(후보 선택 저장)PATCH /api/v1/personas/:personaId/outfits/:outfitIdDELETE /api/v1/personas/:personaId/outfits/:outfitId
Personas
GET /api/v1/personas?includeSystem=true|falseGET /api/v1/personas/:idPOST /api/v1/personasPATCH /api/v1/personas/:idDELETE /api/v1/personas/:id
Default Assets (Admin)
GET /api/v1/admin/default-assets/personasPOST /api/v1/admin/default-assets/personasGET /api/v1/admin/default-assets/coordisPOST /api/v1/admin/default-assets/coordisGET /api/v1/admin/default-assets/outfitsPOST /api/v1/admin/default-assets/outfitsGET /api/v1/admin/default-assets/mediaPOST /api/v1/admin/default-assets/mediaPATCH /api/v1/admin/default-assets/:assetType/:idDELETE /api/v1/admin/default-assets/:assetType/:id
7. 구현 단계 (MVP 우선순위)
- DB 계약 확정
outfits.coordiId NOT NULL강제- 인덱스/외래키 점검
- Backend 계약 고정
- 코디 복제 API
- 착장 생성(batch=4) + 저장 API
- Scene 실행 시
outfitId필수 검증
- Generation 주입/저장
image_1=outfit고정 주입- 코디+Scene 프롬프트 합성 저장
- snapshot/projection/result 저장 계약 적용
- Frontend 허브/Scene 연결
/personas/[id]에서 코디 -> 착장 -> 촬영 준비 -> Scene 흐름 연결- 준비 단계에서는 현재
착장만 선택 가능하도록 구현 - 코디 미완성 시 Scene 진입 차단
- 히스토리/정렬 검증
- 배치 4 pending/완료 렌더링
- 새로고침 복구 및 순서 검증
- 기본 에셋 도입
personas,coordis,outfits에assetSource추가- 관리자용
기본 에셋 관리메뉴 추가 - 기본 이미지/영상 전용 테이블 및 CRUD 추가
- 사용자 페이지의
기본 에셋 포함필터 연결 SYSTEM에셋 읽기 전용 정책 적용
8. 테스트 체크리스트
outfits.coordiId없는 저장 차단- 공개 코디 복제 시 새
userId로 생성 검증 - Scene 실행 시
outfitId소유권/페르소나 일치 검증 image_1=outfit,image_2/3선택 주입 검증creation_results.resultIndex정렬 및 seed 저장 검증includeSystem=true|false에 따른 목록 결과 차이 검증- 일반 유저가
SYSTEM에셋을 수정/삭제하지 못하는지 검증 - 관리자 업로드 기본 이미지/영상이
creations와 분리 조회되는지 검증