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