공통 확정사항
- 컬렉션은 표지 생성을 기다리지 않고 즉시 생성한다.
- 표지는 비동기로 생성한다.
- AI 이미지는 글자 없는 정사각형 삽화다.
- 제목과 공개 키워드 최대 4개는 프런트에서 표시한다.
- Context 원문과
PRIVATE_ONLY, BLOCKED 키워드는 사용하지 않는다.
- 모든 키워드 분석 완료를 기다리되 최대 10분까지만 기다린다.
- 이미지 생성 중 컬렉션이 변경되면 기존 작업을 무효화하고 최신 내용으로 다시 시작한다.
- 이전 버전의 결과가 늦게 도착하면 저장하지 않는다.
- 표지 생성이 완료된 이후 컬렉션이 변경되어도 재생성하지 않는다.
- 네트워크·429·5xx 오류는 최대 2회 재시도한다.
- 안전 정책 거절은 재시도하지 않고 즉시 실패 처리한다.
- 생성 중에는 별도 상태 문구 없이 공통 임시 표지를 표시한다.
- 생성 성공 시 AI 표지로 교체한다.
- 최종 실패 시 저장된 기본 일러스트 중 공개 키워드 벡터와 가장 유사한 이미지를 적용한다.
- 공개 키워드가 없으면 공통 기본 표지를 유지한다.
- 피드와 컬렉션 상세에만 표지를 표시하며 책장 책등은 기존 UI를 유지한다.
- 화면에 생성 중인 표지가 있으면 30초마다 상태를 갱신한다.
- 화풍은 자유롭게 하되 공통 프레임, 약한 밝기·채도 보정, 종이 질감을 적용한다.
- 작은 인물·뒷모습·실루엣은 허용하지만 얼굴 중심 이미지는 제외한다.
- 생성 성공 후 사용자나 운영자가 재생성·교체하는 기능은 제공하지 않는다.
Spring 백엔드 담당자에게 확인할 내용
1. 작업 생성과 상태 관리
- 컬렉션 생성 트랜잭션에서 표지 작업 상태를 함께
PENDING으로 생성할 수 있는가?
- 표지 상태를 어느 스키마와 테이블에서 관리하는 것이 적절한가?
- 다음 상태 모델에 문제가 없는가?
PENDING
PROCESSING
COMPLETED
FAILED
CANCELLED
generation_version 또는 input_hash를 사용해 이전 결과를 폐기할 수 있는가?
- 컬렉션 제목 수정, Record 추가·제거 시 아직 완료되지 않은 표지 버전을 자동으로 무효화할 수 있는가?
- 이미
COMPLETED된 표지는 컬렉션 변경 이벤트에서 제외할 수 있는가?
2. 키워드 대기와 작업 실행
- 컬렉션에 연결된 활성 Context의
keyword_status를 한 번의 집계 쿼리로 확인할 수 있는가?
- 모든 Context가 종료 상태가 되거나 10분이 경과했을 때 표지 요청을 시작할 수 있는가?
- 마지막 컬렉션 변경 시점부터 10분 제한을 다시 계산할 수 있는가?
- 연속 편집을 묶기 위한 대기 시간을 둘 필요가 있는가?
- 후보: 즉시, 마지막 변경 후 30초, 마지막 변경 후 1분
- 기존 AI 재스캔 스케줄러를 확장할지, 표지 전용 스케줄러를 둘지 의견이 필요한가?
3. AI 서버 요청 데이터
- Spring이 다음 데이터를 조립해 AI 서버에 전달하는 구조가 적절한가?
collectionId
generationVersion
- 컬렉션 제목
- 대표 장소명 목록
- PUBLIC 키워드 ID, 표시명, confidence
- 키워드 분석 종료 여부
- FastAPI의
core.* 접근 금지 원칙을 유지하기 위해 모든 Core 데이터는 Spring이 전달하는 것으로 합의 가능한가?
- Context 원문이 요청 DTO나 로그에 포함되지 않음을 어떻게 테스트할 것인가?
4. 프런트 API 계약
- 컬렉션 목록·상세·피드 응답에 다음 필드를 추가할 수 있는가?
coverStatus
coverUrl
fallbackCoverKey
- 성공한 표지를 제공할 고정 URL을 만들 수 있는가?
GET /api/core/v1/collections/{collectionId}/cover
PENDING과 FAILED 상태에서 프런트가 기본 표지를 선택할 수 있도록 응답을 구성할 수 있는가?
- 이미지 응답에
ETag와 Cache-Control을 적용할 수 있는가?
- 삭제되거나 비공개 대상이 된 컬렉션의 표지 접근을 차단할 수 있는가?
5. DB와 마이그레이션
- 표지 상태와 결과가 AI 파생 데이터라면
ai 스키마에 두는 것에 동의하는가?
- AI 테이블을 추가할 경우 Flyway 마이그레이션과 AI 테스트 스키마 스냅샷을 어떻게 함께 갱신할 것인가?
core.collection과 AI 표지 테이블 사이에 FK를 두지 않는 기존 AI 스키마 원칙을 유지할 것인가?
AI 서버 담당자에게 확인할 내용
1. GMS 이미지 생성 지원
- 현재 GMS에서 이미지 생성 모델을 지원하는가?
- 사용할 수 있는 모델명과 API 형식은 무엇인가?
- 정사각형 출력이 직접 지원되는가?
- 응답은 URL, base64, 바이너리 중 어떤 형식인가?
- 호출당 비용 또는 크레딧 차감량은 얼마인가?
- 분당·일일 호출 한도는 얼마인가?
- 평균 및 상위 95% 생성 시간을 실측할 수 있는가?
- 안전 정책 거절과 기술 오류를 응답에서 구분할 수 있는가?
2. 표지 프롬프트 입력
- 프런트에 표시하는 PUBLIC 키워드는 최대 4개로 합의됐다.
- 이미지 프롬프트에도 동일한 4개를 사용할 것인가?
- 다른 수 또는 다른 선정 기준을 사용할 경우 이유와 기준은 무엇인가?
- 키워드 선정 시 frequency와 confidence를 어떻게 반영할 것인가?
- 장소명은 최대 몇 개까지 전달하는 것이 적절한가?
- 장소가 100개인 컬렉션에서 대표 장소를 어떤 기준으로 선정할 것인가?
- 공개 키워드가 하나뿐이면 해당 키워드만 사용하는 것으로 충분한가?
- 공개 키워드가 없을 때 제목과 장소명만으로 생성할 것인가?
3. 공통 이미지 생성 규칙
- 다음 공통 프롬프트 규칙을 적용할 수 있는가?
- 정사각형 편집 일러스트
- 글자·문자·로고·워터마크 금지
- 하나의 명확한 중심 대상
- 가장자리 여유 공간
- 과도한 채도와 극단적인 명암 제한
- 얼굴 중심 인물 금지
- 작은 인물, 뒷모습, 실루엣 허용
- 화풍과 테마는 자유
- 프롬프트에 포함된 사용자 제목을 명령이 아닌 데이터로 안전하게 분리할 수 있는가?
- 제목이나 장소명이 프롬프트 지시문으로 해석되지 않도록 방어할 수 있는가?
4. 상태 전이와 경합 처리
- 요청의
generationVersion이 현재 버전과 일치할 때만 처리·저장할 수 있는가?
- 처리 중 컬렉션이 변경되면 실행 중인 외부 요청을 취소할 수 있는가?
- 실제 취소가 불가능하면 늦게 도착한 결과를 저장하지 않고 폐기할 수 있는가?
- 기술 오류는 최초 호출 이후 최대 2회 재시도하는 것으로 구현 가능한가?
- 안전 정책 거절은 재시도 없이
FAILED로 처리할 수 있는가?
- 재시도 시 최초에 고정한 동일 입력과 동일 버전을 사용할 수 있는가?
5. 이미지 후처리
- 생성 결과를 다음 규격으로 표준화할 수 있는가?
512×512
- sRGB
- WebP
- 약한 밝기·채도 정규화
- 공통 종이 질감 적용 가능 여부
- 최대 파일 크기를 어느 정도로 제한하는 것이 적절한가?
- 잘못된 MIME 타입, 손상된 파일, 비정상 크기를 검증할 수 있는가?
6. 실패용 기본 일러스트 유사도
context_embedding이 아니라 PUBLIC keyword_preset.embedding만 사용한다는 데 동의하는가?
- 공개 키워드가 여러 개면 confidence 가중 평균 벡터를 만들 수 있는가?
- 공개 키워드가 한 개면 해당 키워드 벡터를 그대로 사용할 수 있는가?
- 기본 일러스트 설명도 같은 embedding profile로 사전 임베딩할 수 있는가?
- 기본 일러스트가 적을 경우 정확한 cosine 검색만으로 충분한가?
- 최소 유사도 기준은 어떤 평가 데이터로 정할 것인가?
- 기준 미달 시 공통 기본 표지를 반환할 수 있는가?
- 동점일 때
collectionId 기반으로 결과를 고정할 수 있는가?
프런트엔드 담당자에게 확인할 내용
1. 표지 카드 구성
- AI 이미지 영역을
1:1 정사각형으로 표시할 수 있는가?
- 다음 카드 구성으로 피드와 상세 화면을 통일할 수 있는가?
- 정사각형 이미지
- 컬렉션 제목
- PUBLIC 키워드 최대 4개
- 공통 미색 프레임
- 얇은 테두리
- 종이 질감
- AI 이미지의 그림체가 달라도 같은 시리즈처럼 보이도록 공통 프레임을 적용할 수 있는가?
- 책장 화면의 책등은 기존 UI를 유지하는 데 문제가 없는가?
2. 상태별 표시
PENDING: 공통 임시 표지
COMPLETED: AI 생성 표지
FAILED이며 fallbackCoverKey 존재: 유사도 기반 기본 일러스트
FAILED이며 키워드 없음: 공통 기본 표지
위 상태별 표시를 별도 문구 없이 처리할 수 있는가?
3. 상태 갱신
- 현재 화면에
PENDING 항목이 있을 때만 30초 폴링을 실행할 수 있는가?
- 카드별 요청이 아니라 목록 API 하나를 다시 조회할 수 있는가?
- 모든 항목이 종료 상태가 되면 폴링을 중단할 수 있는가?
- 완료된 이미지로 교체될 때 레이아웃 이동 없이 자연스럽게 전환할 수 있는가?
4. 기본 일러스트 자산
- 기본 일러스트를 프런트 정적 자산으로 관리하는 것에 동의하는가?
- 필요한 기본 일러스트 수는 몇 장인가?
- 각 자산에 변경되지 않는
coverKey를 부여할 수 있는가?
- 이미지 파일명과
coverKey 매핑을 코드에서 안전하게 관리할 수 있는가?
- 존재하지 않는
coverKey를 받으면 공통 기본 표지로 대체할 수 있는가?
- 기본 일러스트 설명과 테마 정보를 AI 담당자에게 전달할 수 있는가?
5. 접근성과 실패 대응
- 이미지 대체 텍스트는 컬렉션 제목 기반으로 제공할 수 있는가?
- 이미지 다운로드 실패 시 공통 기본 표지로 대체할 수 있는가?
- 모바일·태블릿·PC에서 정사각형 비율과 제목·키워드 영역을 유지할 수 있는가?
인프라 담당자에게 확인할 내용
1. GMS 연결
- 현재 GMS 인증 정보로 이미지 생성 API도 호출할 수 있는가?
- 별도 API 키나 Secret이 필요한가?
- AI Pod에서 이미지 생성 엔드포인트로 나가는 네트워크가 허용되는가?
- 이미지 생성 호출의 쿼터와 비용을 어디에서 관측할 수 있는가?
- GMS 이미지 모델 장애를 감지할 메트릭이나 알림을 구성할 수 있는가?
2. 저장 위치 검토
현재 S3나 외부 오브젝트 스토리지는 사용하지 않는다. 다음 선택지를 비교해 달라.
- PostgreSQL
BYTEA
- 백엔드 PVC
- AI PVC
- 별도 파일 제공 서비스와 PVC
각 방식에 대해 다음을 확인해 달라.
- 현재 단일 노드·단일 디스크 구조에서 가장 안전한 방식
- 백엔드와 AI가 다른 네임스페이스에 있는 점
- AI 서버가 외부 Ingress를 사용하지 않는 점
- 백업과 복구 절차
- 롤링 배포 중 데이터 보존
- PVC 삭제 시
local-path-retain 복구 절차
- 서버 재이미징 시 외부 백업 가능 여부
3. PostgreSQL 저장안을 사용할 경우
- 현재 PostgreSQL 20Gi PVC에서 표지 저장 공간을 감당할 수 있는가?
- 백업 PVC 10Gi와 7일 보존 정책에 영향이 있는가?
pg_dump에 표지 바이너리가 포함됐을 때 백업 시간과 크기가 허용 범위인가?
- 주 1회 서버 외부 복사 대상에 표지 데이터도 포함되는가?
- 이미지당 300KB 제한과 예상 컬렉션 수를 기준으로 용량을 산정할 수 있는가?
- DB 용량 임계치 알림을 추가해야 하는가?
4. AI 서버 자원
- PNG를 WebP로 변환할 CPU·메모리 여유가 있는가?
- 현재 AI Pod의
384Mi request / 768Mi limit에서 이미지 후처리가 가능한가?
- 임시 파일이 필요하면
writableTmp를 활성화해야 하는가?
- 파일 전체를 메모리에 올리는 방식이 안전한가?
- 동시 이미지 생성 개수를 제한해야 하는가?
5. 서비스 간 통신
- 현재 운영 백엔드가 dev AI 서비스를 호출하는 구조를 표지 기능에도 그대로 사용할 것인가?
- 표지 기능의 운영 배포 전에 AI 서비스의 prod 승격이 필요한가?
- Spring → AI 내부 API에 필요한 NetworkPolicy가 이미 충분한가?
- 이미지 결과를 AI에서 Spring으로 전송하거나 DB에 저장할 때 요청 크기 제한 문제가 없는가?
6. 관측과 운영
다음 지표를 수집할 수 있는가?
PENDING, PROCESSING, COMPLETED, FAILED 작업 수
- 이미지 생성 성공률
- 안전 정책 거절 수
- 재시도 횟수
- 평균 및 상위 95% 생성 시간
- 생성 이미지 평균·최대 크기
- 오래된
PROCESSING 작업 수
- 폐기된 이전 버전 결과 수
- 표지 데이터의 총 저장 용량
공통 확정사항
PRIVATE_ONLY,BLOCKED키워드는 사용하지 않는다.Spring 백엔드 담당자에게 확인할 내용
1. 작업 생성과 상태 관리
PENDING으로 생성할 수 있는가?PENDINGPROCESSINGCOMPLETEDFAILEDCANCELLEDgeneration_version또는input_hash를 사용해 이전 결과를 폐기할 수 있는가?COMPLETED된 표지는 컬렉션 변경 이벤트에서 제외할 수 있는가?2. 키워드 대기와 작업 실행
keyword_status를 한 번의 집계 쿼리로 확인할 수 있는가?3. AI 서버 요청 데이터
collectionIdgenerationVersioncore.*접근 금지 원칙을 유지하기 위해 모든 Core 데이터는 Spring이 전달하는 것으로 합의 가능한가?4. 프런트 API 계약
coverStatuscoverUrlfallbackCoverKeyGET /api/core/v1/collections/{collectionId}/coverPENDING과FAILED상태에서 프런트가 기본 표지를 선택할 수 있도록 응답을 구성할 수 있는가?ETag와Cache-Control을 적용할 수 있는가?5. DB와 마이그레이션
ai스키마에 두는 것에 동의하는가?core.collection과 AI 표지 테이블 사이에 FK를 두지 않는 기존 AI 스키마 원칙을 유지할 것인가?AI 서버 담당자에게 확인할 내용
1. GMS 이미지 생성 지원
2. 표지 프롬프트 입력
3. 공통 이미지 생성 규칙
4. 상태 전이와 경합 처리
generationVersion이 현재 버전과 일치할 때만 처리·저장할 수 있는가?FAILED로 처리할 수 있는가?5. 이미지 후처리
512×5126. 실패용 기본 일러스트 유사도
context_embedding이 아니라 PUBLICkeyword_preset.embedding만 사용한다는 데 동의하는가?collectionId기반으로 결과를 고정할 수 있는가?프런트엔드 담당자에게 확인할 내용
1. 표지 카드 구성
1:1정사각형으로 표시할 수 있는가?2. 상태별 표시
PENDING: 공통 임시 표지COMPLETED: AI 생성 표지FAILED이며fallbackCoverKey존재: 유사도 기반 기본 일러스트FAILED이며 키워드 없음: 공통 기본 표지위 상태별 표시를 별도 문구 없이 처리할 수 있는가?
3. 상태 갱신
PENDING항목이 있을 때만 30초 폴링을 실행할 수 있는가?4. 기본 일러스트 자산
coverKey를 부여할 수 있는가?coverKey매핑을 코드에서 안전하게 관리할 수 있는가?coverKey를 받으면 공통 기본 표지로 대체할 수 있는가?5. 접근성과 실패 대응
인프라 담당자에게 확인할 내용
1. GMS 연결
2. 저장 위치 검토
현재 S3나 외부 오브젝트 스토리지는 사용하지 않는다. 다음 선택지를 비교해 달라.
BYTEA각 방식에 대해 다음을 확인해 달라.
local-path-retain복구 절차3. PostgreSQL 저장안을 사용할 경우
pg_dump에 표지 바이너리가 포함됐을 때 백업 시간과 크기가 허용 범위인가?4. AI 서버 자원
384Mi request / 768Mi limit에서 이미지 후처리가 가능한가?writableTmp를 활성화해야 하는가?5. 서비스 간 통신
6. 관측과 운영
다음 지표를 수집할 수 있는가?
PENDING,PROCESSING,COMPLETED,FAILED작업 수PROCESSING작업 수