Skip to content

PinLog AI 컬렉션 표지 기능 협의 요청 #97

Description

@ghkim1632

공통 확정사항

  • 컬렉션은 표지 생성을 기다리지 않고 즉시 생성한다.
  • 표지는 비동기로 생성한다.
  • 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
  • PENDINGFAILED 상태에서 프런트가 기본 표지를 선택할 수 있도록 응답을 구성할 수 있는가?
  • 이미지 응답에 ETagCache-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
    • 약한 밝기·채도 정규화
    • 공통 종이 질감 적용 가능 여부
  • 최대 파일 크기를 어느 정도로 제한하는 것이 적절한가?
    • 제안: 300KB
  • 잘못된 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 작업 수
  • 폐기된 이전 버전 결과 수
  • 표지 데이터의 총 저장 용량

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions