Skip to content

파일 저장 ​

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업로드 세션

저장 백엔드 ​

백엔드어댑터적용 시나리오
LocalLocalStorageAdapter개발 환경, 소규모 배포
AWS S3S3StorageAdapter클라우드 배포(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
]);

업로드 흐름:

  1. FileUploadingEvent 디스패치(옵션 수정 가능한 인터셉트)
  2. 파일 보안 검사(유형, 크기, 확장자, MIME)
  3. SHA-256 해시 중복 제거
  4. 날짜 전략에 따라 저장 경로 생성(Y/m/uuid.ext 또는 uuid.ext)
  5. 어댑터에 업로드
  6. File 엔티티 생성
  7. FileUploadedEvent 디스패치
  8. 비동기 이미지 압축 메시지(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/

MIT 라이선스 오픈소스 | Copyright © 2026 Doggy