콘텐츠로 이동

이미지·미디어 (Presigned URL / S3)

첨부는 presigned URL 직접 업로드 방식. 본문(content)에는 mediaId만 보관, 조회 시 URL로 변환.

1. 업로드 플로우

1) POST /common/media/presign-batch   다건 presigned 업로드 URL 발급
2) PUT  {uploadUrl}                    클라가 S3로 직접 업로드 (Content-Type 헤더)
3) POST content 저장/수정              본문 안 이미지를 mediaId로 참조해 저장
4) GET  리소스 상세                    mediaId → presigned(또는 CloudFront) 조회 URL 변환

presign-batch 요청/응답 (요지)

// req: targetType(TEACHING_NOTE|QNA|HOMEWORK...) + mediaAssetList[{fileName, contentType, sizeBytes}]
// res: data.mediaAssetList[{fileName, mediaId, uploadUrl, headers}]

GET /teaching-notes/{id} 같은 content 상세 조회는 본문의 image_id를 조회용 URL로 치환해 반환.

2. S3 공개/비공개 분리 (계획)

targetType으로 서버가 public/private 판단 → S3 키에 prefix:

/{env}/public/uploader/{userId}/{image|file}/{mediaId}.{ext}
/{env}/private/uploader/{userId}/{image|file}/{mediaId}.{ext}
  • 공개 targetType: STUDY_ROOM_THUMBNAIL, COLUMN_ARTICLE, TEACHER_DESCRIPTION, REVIEW
  • 공개는 CloudFront 고정 URL(presign 불필요), 비공개는 presigned
  • 변경: MediaAsset.isPublic, MediaAssetEntity.is_public, CloudFront distribution, Flyway 컬럼 추가

3. 관련