대용량 파일 저장
이 페이지의 내용
개요
이 가이드 에서는 GridFS 를 사용하여 MongoDB 에 대용량 파일을 저장 하고 조회 하는 방법을 학습 수 있습니다. GridFS 는 MongoDB PHP 라이브러리에서 구현한 사양으로, 파일을 저장할 때 청크로 분할 하고 검색할 때 다시 조립하는 방법을 설명합니다. 라이브러리의 GridFS 구현 은 파일 저장 의 운영 및 조직 을 관리하는 추상화입니다.
파일 크기가 BSON 문서 크기 제한인 16MB를 초과하는 경우 GridFS 를 사용하세요. GridFS 가 해당 사용 사례 에 적합한지 여부에 대한 자세한 내용은 MongoDB Server 매뉴얼에서 GridFS 를 참조하세요.
GridFS 작동 방식
GridFS는 파일 청크와 파일을 설명하는 정보가 들어 있는 MongoDB 컬렉션 그룹인 버킷에 파일을 구성합니다. 버킷에는 GridFS 사양에 정의된 규칙을 사용하여 명명된 다음 컬렉션이 포함되어 있습니다.
chunks
컬렉션은 바이너리 파일 청크를 저장합니다.files
0} 컬렉션에 파일 메타데이터가 저장됩니다.
새 GridFS 버킷을 생성하면 라이브러리는 다른 이름을 지정하지 않는 한 기본값 버킷 이름 fs
접두사 앞에 앞의 컬렉션을 생성합니다. 또한 파일 및 관련 메타데이터 를 효율적으로 검색할 수 있도록 각 컬렉션 에 인덱스 를 생성합니다. 라이브러리는 GridFS 버킷이 존재하지 않는 경우 첫 번째 쓰기 (write) 작업이 수행될 때만 생성합니다. 라이브러리는 인덱스가 존재하지 않거나 버킷이 비어 있는 경우에만 인덱스를 생성합니다. GridFS 인덱스에 대한 자세한 내용은 MongoDB Server 매뉴얼에서 GridFS 인덱스 를 참조하세요.
GridFS 를 사용하여 파일을 저장 때 라이브러리는 파일을 작은 청크로 분할하며, 각 청크는 chunks
컬렉션 에서 별도의 문서 로 표시됩니다. 또한 files
컬렉션 에 파일 ID, 파일 이름 및 기타 파일 메타데이터 가 포함된 문서 를 만듭니다. 스트림 을 MongoDB PHP 라이브러리에 전달하여 소비하거나 새 스트림 을 생성하고 직접 작성하여 파일 을 업로드할 수 있습니다. 스트림에 학습 보려면 스트림 을 참조하세요. PHP 매뉴얼에서 확인할 수 있습니다.
다음 다이어그램을 보고 버킷에 업로드할 때 GridFS 가 파일을 분할하는 방법을 확인할 수 있습니다.
파일을 검색할 때 GridFS 는 지정된 버킷의 files
컬렉션 에서 메타데이터 를 가져오고 이 정보를 사용하여 chunks
컬렉션 의 문서에서 파일 을 재구성합니다. 파일 내용을 기존 스트림 에 쓰거나 파일 을 가리키는 새 스트림 을 만들어 파일 을 읽을 수 있습니다.
GridFS 버킷 만들기
GridFS 에서 파일을 저장 하거나 조회 하려면 데이터베이스 에서 MongoDB\Database::selectGridFSBucket()
메서드를 호출합니다. 이 메서드는 기존 버킷에 액세스하거나 버킷이 없는 경우 새 버킷을 생성합니다.
다음 예시 에서는 db
데이터베이스 에서 selectGridFSBucket()
메서드를 호출합니다.
$bucket = $client->db->selectGridFSBucket();
버킷 사용자 지정
You can customize the GridFS bucket configuration by passing an array that specifies option values to the selectGridFSBucket()
method. 다음 표에서는 배열 에서 설정하다 수 있는 몇 가지 옵션을 설명합니다.
옵션 | 설명 |
---|---|
| Specifies the bucket name to use as a prefix for the files and chunks collections.
The default value is 'fs' .Type: string |
| Specifies the chunk size that GridFS splits files into. The default value is 261120 .Type: integer |
| Specifies the read concern to use for bucket operations. The default value is the
database's read concern. Type: MongoDB\Driver\ReadConcern |
| Specifies the read preference to use for bucket operations. The default value is the
database's read preference. Type: MongoDB\Driver\ReadPreference |
| Specifies the write concern to use for bucket operations. The default value is the
database's write concern. Type: MongoDB\Driver\WriteConcern |
다음 예시 에서는 bucketName
옵션을 설정하는 selectGridFSBucket()
에 배열 을 전달하여 'myCustomBucket'
이라는 이름의 버킷을 만듭니다.
$custom_bucket = $client->db->selectGridFSBucket( ['bucketName' => 'myCustomBucket'] );
파일 업로드
다음 방법을 사용하여 GridFS 버킷에 파일을 업로드할 수 있습니다.
MongoDB\GridFS\Bucket::openUploadStream()
: 파일 콘텐츠를 쓰기 (write) 수 있는 새 업로드 스트림 을 엽니다.MongoDB\GridFS\Bucket::uploadFromStream()
: 기존 스트림 의 콘텐츠를 GridFS 파일 에 업로드합니다.
업로드 스트림에 쓰기
openUploadStream()
메서드를 사용하여 지정된 파일 이름에 대한 업로드 스트림 을 만듭니다. openUploadStream()
메서드를 사용하면 매개 변수로 전달할 수 있는 옵션 배열 에 구성 정보를 지정할 수 있습니다.
이 예시 에서는 업로드 스트림 을 사용하여 다음 조치를 수행합니다.
이름이
'my_file'
인 새 GridFS 파일 에 대한 쓰기 가능한 스트림 을 엽니다.배열 매개변수의
metadata
옵션을openUploadStream()
메서드로 설정합니다.fwrite()
메서드를 호출하여 스트림 이 가리키는'my_file'
에 데이터를 쓰기 (write) .fclose()
메서드를 호출하여'my_file'
을(를) 가리키는 스트림 을 닫습니다.
$stream = $bucket->openUploadStream('my_file', [ 'metadata' => ['contentType' => 'text/plain'] ]); fwrite($stream, 'Data to store'); fclose($stream);
기존 스트림 업로드
uploadFromStream()
메서드를 사용하여 스트림 의 콘텐츠를 새 GridFS 파일 에 업로드합니다. uploadFromStream()
메서드를 사용하면 매개 변수로 전달할 수 있는 옵션 배열 에 구성 정보를 지정할 수 있습니다.
이 예에서는 다음 조치를 수행합니다.
fopen()
메서드를 호출하여 에 있는 파일 을/path/to/input_file
바이너리 읽기(rb
) 모드 에서 스트림 으로 엽니다.uploadFromStream()
메서드를 호출하여 스트림 의 내용을'new_file'
이라는 GridFS 파일 에 업로드합니다.
$file = fopen('/path/to/input_file', 'rb'); $bucket->uploadFromStream('new_file', $file);
파일 정보 검색
이 섹션에서는 GridFS 버킷의 files
컬렉션에 저장된 파일 메타데이터를 검색하는 방법을 알아볼 수 있습니다. 메타데이터에는 다음을 포함하여 참조하는 파일에 대한 정보가 포함됩니다.
파일의
_id
입니다.파일 이름
파일의 길이/크기
업로드 날짜 및 시간
다른 정보를 저장할 수 있는
metadata
문서입니다.
GridFS 버킷에서 파일을 조회 하려면 MongoDB\GridFS\Bucket
인스턴스 에서 MongoDB\GridFS\Bucket::find()
메서드를 호출합니다. 이 메서드는 결과에 액세스 할 수 있는 MongoDB\Driver\Cursor
인스턴스 를 반환합니다. MongoDB PHP 라이브러리의 Cursor
객체에 학습 보려면 커서에서 데이터 액세스 가이드 를 참조하세요.
예시
다음 코드 예시 는 GridFS 버킷의 파일에서 파일 메타데이터 를 조회 하고 인쇄하는 방법을 보여줍니다. foreach
루프를 사용하여 반환된 커서 를 반복하고 파일 업로드 예제에 업로드 된 파일의 내용을 표시합니다.
$files = $bucket->find(); foreach ($files as $file_doc) { echo toJSON($file_doc), PHP_EOL; }
{ "_id" : { "$oid" : "..." }, "chunkSize" : 261120, "filename" : "my_file", "length" : 13, "uploadDate" : { ... }, "metadata" : { "contentType" : "text/plain" }, "md5" : "6b24249b03ea3dd176c5a04f037a658c" } { "_id" : { "$oid" : "..." }, "chunkSize" : 261120, "filename" : "new_file", "length" : 13, "uploadDate" : { ... }, "md5" : "6b24249b03ea3dd176c5a04f037a658c" }
find()
메서드는 다양한 쿼리 사양을 허용합니다. $options
매개변수를 사용하여 정렬 순서, 반환할 최대 문서 수, 반환하기 전에 건너뛸 문서 수를 지정할 수 있습니다. 사용 가능한 옵션 목록을 보려면 API 설명서를 참조하세요.
참고
앞의 예시 에서는 toJSON()
메서드를 호출하여 파일 메타데이터 를 다음 코드에 정의된 확장 JSON 으로 출력합니다.
function toJSON(object $document): string { return MongoDB\BSON\Document::fromPHP($document)->toRelaxedExtendedJSON(); }
파일 다운로드
다음 방법을 사용하여 GridFS 버킷에서 파일을 다운로드 할 수 있습니다.
MongoDB\GridFS\Bucket::openDownloadStreamByName()
또는MongoDB\GridFS\Bucket::openDownloadStream()
: 파일 내용을 읽을 수 있는 새 다운로드 스트림 을 엽니다.MongoDB\GridFS\Bucket::downloadToStream()
: 전체 파일 을 기존 다운로드 스트림 에 씁니다.
다운로드 스트림에서 읽기
MongoDB\GridFS\Bucket::openDownloadStreamByName()
메서드를 사용하여 다운로드 스트림 을 생성하여 MongoDB database 에서 파일을 다운로드 할 수 있습니다.
이 예시 에서는 다운로드 스트림 을 사용하여 다음 작업을 수행합니다.
업로드 스트림에 쓰기
예시 에서 업로드된
'my_file'
GridFS 파일 을 선택하고 읽기 가능한 스트림 으로 엽니다.stream_get_contents()
메서드를 호출하여 의 내용을 읽습니다.'my_file'
파일 내용을 인쇄합니다.
fclose()
메서드를 호출하여'my_file'
을(를) 가리키는 다운로드 스트림 을 닫습니다.
$stream = $bucket->openDownloadStreamByName('my_file'); $contents = stream_get_contents($stream); echo $contents, PHP_EOL; fclose($stream);
"Data to store"
참고
파일 이름이 같은 문서가 여러 개 있는 경우 GridFS 는 지정된 이름의 가장 최근 파일 을 스트림 합니다( uploadDate
필드 에 따라 결정됨).
또는 파일의 _id
필드를 매개변수로 사용하는 MongoDB\GridFS\Bucket::openDownloadStream()
메서드를 사용할 수 있습니다.
$stream = $bucket->openDownloadStream(new ObjectId('66e0a5487c880f844c0a32b1')); $contents = stream_get_contents($stream); fclose($stream);
참고
GridFS 스트리밍 API 는 부분 청크를 로드할 수 없습니다. 다운로드 스트림 은 MongoDB 에서 청크 를 가져와야 하는 경우 전체 청크 를 메모리로 가져옵니다. 일반적으로 255킬로바이트의 기본값 청크 크기로 충분하지만, 메모리 오버헤드 를 줄이기 위해 청크 크기를 줄이거나 더 큰 파일로 작업할 때 청크 크기를 늘릴 수 있습니다. 청크 크기 설정에 대한 자세한 내용은 이 페이지의 Customize Bucket (버킷 사용자 지정) 섹션을 참조하세요.
파일 수정본 다운로드
버킷에 동일한 파일 이름을 주식 하는 파일이 여러 개 포함된 경우 GridFS 는 기본값 가장 최근에 업로드된 버전의 파일 을 선택합니다. 동일한 이름을 공유하는 각 파일 을 구분하기 위해 GridFS 는 업로드 시간 순으로 수정본 번호를 할당합니다.
원래 파일 수정본 번호는 0
이고 그 다음으로 가장 최근의 파일 수정본 번호는 1
입니다. 수정본의 최신성에 해당하는 음수 값을 지정할 수도 있습니다. 수정본 값 -1
는 가장 최근의 수정본을 참조하고 -2
는 그 다음으로 최근의 수정본을 참조합니다.
옵션 배열 을 openDownloadStreamByName()
메서드에 전달하고 revision
옵션을 지정하여 특정 파일 수정본을 다운로드 하도록 GridFS 에 지시할 수 있습니다. 다음 예시 에서는 가장 최근의 수정본이 아닌 'my_file'
라는 이름의 원본 파일 의 내용을 읽습니다.
$stream = $bucket->openDownloadStreamByName('my_file', ['revision' => 0]); $contents = stream_get_contents($stream); fclose($stream);
기존 스트림에 다운로드
버킷에서 MongoDB\GridFS\Bucket::downloadToStream()
메서드를 호출하여 GridFS 파일 의 콘텐츠를 기존 스트림 에 다운로드 할 수 있습니다.
이 예에서는 다음 조치를 수행합니다.
메서드를 호출하여 에 있는 파일 을 바이너리 쓰기
fopen()
/path/to/output_file
wb
(write) ( ) 모드 에서 스트림 으로 엽니다._id
값이ObjectId('66e0a5487c880f844c0a32b1')
인 GridFS 파일 을 스트림 에 다운로드 합니다.
$file = fopen('/path/to/output_file', 'wb'); $bucket->downloadToStream( new ObjectId('66e0a5487c880f844c0a32b1'), $file, );
파일 이름 바꾸기
MongoDB\GridFS\Bucket::rename()
메서드를 사용하여 버킷에 있는 GridFS 파일 의 이름을 업데이트 . 다음 매개변수를 rename()
메서드에 전달합니다.
이름을 바꾸려는 파일 의
_id
값새 파일 이름
다음 예시 파일의 _id
값을 참조하여 filename
필드 'new_file_name'
(으)로 업데이트 방법을 보여 줍니다.
$bucket->rename(new ObjectId('66e0a5487c880f844c0a32b1'), 'new_file_name');
또는 MongoDB\GridFS\Bucket::renameByName()
메서드를 사용하여 GridFS 파일 과 모든 파일 수정본의 이름을 바꿀 수 있습니다. 다음 매개변수를 renameByName()
메서드에 전달합니다.
변경하려는
filename
값새 파일 이름
다음 예시 filename
값이 'my_file'
인 모든 파일의 이름을 바꿉니다.
$bucket->renameByName('my_file', 'new_file_name');
파일 삭제
MongoDB\GridFS\Bucket::delete()
메서드를 사용하여 버킷에서 GridFS 파일의 컬렉션 문서 및 관련 청크를 제거 . 이렇게 하면 파일 이 효과적으로 삭제됩니다. 삭제 하려는 파일 의 _id
값을 delete()
메서드에 매개 변수로 전달합니다.
다음 예시에서는 _id
필드를 참고하여 파일을 삭제하는 방법을 보여 줍니다.
$bucket->delete(new ObjectId('66e0a5487c880f844c0a32b1'));
또는 MongoDB\GridFS\Bucket::deleteByName()
메서드를 사용하여 GridFS 파일 과 모든 파일 수정본을 삭제 수 있습니다. 다음 코드와 같이 삭제 하려는 파일 의 filename
값을 deleteByName()
메서드에 매개 변수로 전달합니다.
$bucket->deleteByName('my_file');
API 문서
MongoDB PHP 라이브러리를 사용하여 대용량 파일을 저장 하고 조회 하는 방법에 학습 보려면 다음 API 설명서를 참조하세요.