Skip to content

app: object storage foundation 후속 설계 및 자산 메타데이터 통합 #756

@keIIy-kim

Description

@keIIy-kim

배경

  • 현재 PR feat(app): add shared object storage foundation #752ObjectStoragePort 공통 계약과 MinIO / Tencent COS / Blob adapter, ObjectStorageRegistry, blob backing store까지의 foundation만 추가합니다.
  • 이번 PR에서는 adapter correctness와 회귀 테스트에 집중했고, 상위 자산 메타데이터 모델은 의도적으로 분리했습니다.
  • storage_uri의 backend alias는 이번 PR에서 minio / tencent-cos / blob 같은 논리 이름으로 단순화했습니다.
  • 다음 단계는 이 foundation 위에 실제 서비스 자산 모델과 serving 정책을 올리는 작업입니다.

이번 PR에서 의도적으로 제외한 항목

  • meetpie namecard 내부 이미지의 persisted imageUrl/data:image 제거
  • deskpie note/file attachment 통합

목표

  1. object storage foundation 위에 올라갈 공통 자산 모델을 정한다.
  2. public/private asset serving 정책을 명확히 한다.
  3. meetpie를 1차 마이그레이션 대상으로 삼아 실제 사용처를 붙인다.

설계 방향

1. StorageUri는 internal locator로 유지

  • DB에는 public URL이 아니라 storage locator만 저장한다.
  • 예시:
    • s3://minio/deck-dev/workspaces/{workspaceId}/files/{fileId}
    • s3://tencent-cos/deck-prod-1250000000/workspaces/{workspaceId}/files/{fileId}
    • blob://blob/{objectId}
  • 클라이언트에는 raw storage_uri를 노출하지 않는다.
  • 다운로드/미리보기는 assetId 기반 resolver endpoint나 presigned redirect로 처리한다.

2. StoredAssetapp이 소유

  • common에는 계약만 둔다.
    • StorageUri
    • ObjectStoragePort
    • download/open 모델
  • app은 구현과 공통 자산 메타데이터를 소유한다.
  • meetpie, deskpiestored_asset_id만 참조하도록 붙인다.

1차 후보 필드

  • id
  • storage_uri
  • access_level (PUBLIC, PRIVATE)
  • original_filename
  • content_type
  • content_length
  • stored_length
  • checksum_sha256
  • media_type
  • width, height
  • attributes jsonb
  • created_at, created_by

3. 접근 정책은 PRIVATE 기본, PUBLIC 예외

  • 기본값은 PRIVATE
  • bucket/object는 private-first로 운영
  • PUBLIC은 명시적 publish 자산만 허용
    • 1차 후보: meetpie og_image
  • private asset은 앱에서 권한 체크 후 stream 또는 short-lived signed URL 발급
  • public asset은 public endpoint 또는 public redirect로 제공

4. 1차 적용 대상은 meetpie og_image

  • 현재 MyNamecardEntity.ogImage는 DB bytea 저장이다.
  • 1차는 og_image_asset_id로 바꾸고, 응답은 기존처럼 public OG endpoint를 유지한다.
  • 이 단계에서 object storage + StoredAsset의 end-to-end를 검증한다.

5. 후속 적용 대상

  • meetpie namecard 내부 이미지
    • persisted model에는 assetId만 두고, 렌더 URL은 서버/세션에서 해석
  • deskpie note/file attachment
    • attachment/link 모델은 서비스별 요구가 정리된 뒤 별도 도입

작업 단위 제안

  • StoredAsset migration / entity / repository 추가
  • asset public/private serving contract 추가
  • meetpie og_image_asset_id 전환
  • namecard 내부 이미지의 persisted imageUrl/data:image 제거 설계
  • deskpie note/file attachment 후속 스펙 작성

완료 기준

  • app이 공통 자산 메타데이터를 소유한다.
  • meetpie og_image가 object storage + StoredAsset를 실제 사용한다.
  • raw storage_uri를 FE로 직접 노출하지 않는다.
  • public/private asset serving 정책이 문서와 코드에 일치한다.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions