이미지·미디어 (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. 관련¶
- teams/engineering/domains/teaching-note (TeachingNoteImage), teams/engineering/domains/homework, teams/engineering/domains/qna
- teams/engineering/infra/architecture (S3/CloudFront)