파일 저장
Doggy 파일 저장 시스템은 League Flysystem 기반으로 구축되었으며 로컬 저장과 S3 호환 저장을 지원하고 파일 업로드, 이미지 최적화, URL 생성 등의 기능을 제공합니다.
개요
저장 시스템은 src/Service/Storage/에 있습니다:
src/Service/Storage/
├── StorageManager.php # 저장 관리자 (어댑터 선택)
├── FileUploadService.php # 파일 업로드 서비스
├── FileUrlGenerator.php # URL 생성/캐시
├── ImageOptimizerService.php # 이미지 최적화 (Imagine 라이브러리)
└── Adapter/
├── StorageAdapterInterface.php
├── LocalStorageAdapter.php
└── S3StorageAdapter.php관련 엔티티는 src/Entity/Storage/에 있습니다:
| 엔티티 | 설명 |
|---|---|
File.php | 파일 기록 |
StorageConfig.php | 저장 설정(어댑터 유형, 파라미터, CDN 도메인) |
UploadSession.php | 업로드 세션 |
저장 백엔드
| 백엔드 | 어댑터 | 적용 시나리오 |
|---|---|---|
| Local | LocalStorageAdapter | 개발 환경, 소규모 배포 |
| AWS S3 | S3StorageAdapter | 클라우드 배포(CDN 도메인 지원) |
로컬 저장
php
// 기본 로컬 저장: public/uploads/
$adapter = new LocalStorageAdapter(
rootPath: '/var/www/public/uploads',
publicUrl: '/uploads'
);S3 저장
php
// S3 호환 저장 (AWS, MinIO, 알리바바 OSS 등 지원)
$adapter = new S3StorageAdapter([
'access_key' => '...',
'secret_key' => '...',
'region' => 'us-east-1',
'bucket' => 'doggy-files',
'endpoint' => 'https://oss-cn-hangzhou.aliyuncs.com',
'cdn_domain' => 'https://cdn.example.com',
]);파일 업로드
FileUploadService가 전체 업로드 흐름을 제공합니다:
php
$file = $fileUploadService->upload($uploadedFile, [
'disk' => 'default',
'optimize' => true,
'max_size' => 52428800, // 50MB
]);업로드 흐름:
FileUploadingEvent디스패치(옵션 수정 가능한 인터셉트)- 파일 보안 검사(유형, 크기, 확장자, MIME)
- SHA-256 해시 중복 제거
- 날짜 전략에 따라 저장 경로 생성(
Y/m/uuid.ext또는uuid.ext) - 어댑터에 업로드
- File 엔티티 생성
FileUploadedEvent디스패치- 비동기 이미지 압축 메시지(
ImageCompressMessage)
이미지 최적화
ImageOptimizerService는 Imagine 라이브러리 기반:
php
$optimizer->optimize($sourcePath, $targetPath, [
'max_width' => 1920,
'max_height' => 1080,
'quality' => 80,
'format' => 'webp',
]);URL 생성
FileUrlGenerator는 캐시 및 임시 URL을 지원합니다:
php
$url = $urlGenerator->getUrl($file); // 캐시 포함
$tempUrl = $urlGenerator->getTemporaryUrl($file, $expiresAt); // 서명 URL
$urlGenerator->invalidateUrl($file); // 캐시 지우기관리 인터페이스
진입점: App\Controller\Admin\StorageConfigController
템플릿: templates/admin/storage/