Docs Menu
Docs Home
/ / /
Java 동기화
/

GridFS.

이 νŽ˜μ΄μ§€μ˜ λ‚΄μš©

  • κ°œμš”
  • GridFS μž‘λ™ 방식
  • GridFS 버킷 λ§Œλ“€κΈ°
  • 파일 μ €μž₯
  • μž…λ ₯ μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜μ—¬ 파일 μ—…λ‘œλ“œ
  • 좜λ ₯ μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜μ—¬ 파일 μ—…λ‘œλ“œ
  • 파일 정보 검색
  • 파일 λ‹€μš΄λ‘œλ“œ
  • 파일 μˆ˜μ •λ³Έ
  • 좜λ ₯ μŠ€νŠΈλ¦Όμ— 파일 λ‹€μš΄λ‘œλ“œ
  • μž…λ ₯ μŠ€νŠΈλ¦Όμ— 파일 λ‹€μš΄λ‘œλ“œ
  • 파일 이름 λ°”κΎΈκΈ°
  • 파일 μ‚­μ œ
  • GridFS 버킷 μ‚­μ œ
  • μΆ”κ°€ λ¦¬μ†ŒμŠ€

이 κ°€μ΄λ“œμ—μ„œλŠ” GridFSλ₯Ό μ‚¬μš©ν•˜μ—¬ MongoDBμ—μ„œ λŒ€μš©λŸ‰ νŒŒμΌμ„ μ €μž₯ν•˜κ³  μ‘°νšŒν•˜λŠ” 방법에 λŒ€ν•΄ μ„€λͺ…ν•©λ‹ˆλ‹€. GridFSλŠ” νŒŒμΌμ„ μ €μž₯ν•  λ•Œ 청크둜 λΆ„ν• ν•˜κ³  검색할 λ•Œ λ‹€μ‹œ μ‘°λ¦½ν•˜λŠ” 방법을 μ„€λͺ…ν•˜λŠ” λ“œλΌμ΄λ²„μ— μ˜ν•΄ κ΅¬ν˜„λœ μ‚¬μ–‘μž…λ‹ˆλ‹€. GridFS의 λ“œλΌμ΄λ²„ κ΅¬ν˜„μ€ 파일 μŠ€ν† λ¦¬μ§€μ˜ 운영과 ꡬ성을 κ΄€λ¦¬ν•˜λŠ” μΆ”μƒν™”μž…λ‹ˆλ‹€.

파일 크기가 BSON λ¬Έμ„œ 크기 μ œν•œμΈ 16MBλ₯Ό μ΄ˆκ³Όν•˜λŠ” 경우 GridFSλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. GridFSκ°€ μ‚¬μš© 사둀에 μ ν•©ν•œμ§€ 여뢀에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ GridFS μ„œλ²„ 맀뉴얼 νŽ˜μ΄μ§€λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

GridFS μž‘μ—…κ³Ό 이λ₯Ό μˆ˜ν–‰ν•˜λŠ” 방법을 μ„€λͺ…ν•˜λŠ” λ‹€μŒ μ„Ήμ…˜μ„ μ°Έμ‘°ν•˜μ„Έμš”.

GridFSλŠ” 파일 청크와 νŒŒμΌμ„ μ„€λͺ…ν•˜λŠ” 정보가 λ“€μ–΄ μžˆλŠ” MongoDB μ»¬λ ‰μ…˜ 그룹인 버킷에 νŒŒμΌμ„ κ΅¬μ„±ν•©λ‹ˆλ‹€. λ²„ν‚·μ—λŠ” GridFS 사양에 μ •μ˜λœ κ·œμΉ™μ„ μ‚¬μš©ν•˜μ—¬ λͺ…λͺ…λœ λ‹€μŒ μ»¬λ ‰μ…˜μ΄ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • chunks μ»¬λ ‰μ…˜μ€ λ°”μ΄λ„ˆλ¦¬ 파일 청크λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

  • files 0} μ»¬λ ‰μ…˜μ— 파일 메타데이터가 μ €μž₯λ©λ‹ˆλ‹€.

μƒˆ GridFS 버킷을 μƒμ„±ν•˜λ©΄ λ“œλΌμ΄λ²„λŠ” λ‹€λ₯Έ 이름을 μ§€μ •ν•˜μ§€ μ•ŠλŠ” ν•œ κΈ°λ³Έ 버킷 이름 fs 접두사 μ•žμ— μ•žμ˜ μ»¬λ ‰μ…˜μ„ μƒμ„±ν•©λ‹ˆλ‹€. λ˜ν•œ λ“œλΌμ΄λ²„λŠ” 파일 및 κ΄€λ ¨ 메타데이터λ₯Ό 효율적으둜 검색할 수 μžˆλ„λ‘ 각 μ»¬λ ‰μ…˜μ— 인덱슀λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. λ“œλΌμ΄λ²„λŠ” GridFS 버킷이 아직 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 첫 번째 μ“°κΈ° μž‘μ—… μ‹œμ—λ§Œ GridFS 버킷을 μƒμ„±ν•©λ‹ˆλ‹€. λ“œλΌμ΄λ²„λŠ” μΈλ±μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜ 버킷이 λΉ„μ–΄ μžˆλŠ” κ²½μš°μ—λ§Œ 인덱슀λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. GridFS μΈλ±μŠ€μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ GridFS μΈλ±μŠ€μ— λŒ€ν•œ μ„œλ²„ 맀뉴얼 νŽ˜μ΄μ§€λ₯Ό μ°Έμ‘° ν•˜μ„Έμš”.

GridFS둜 νŒŒμΌμ„ μ €μž₯ν•  λ•Œ λ“œλΌμ΄λ²„λŠ” νŒŒμΌμ„ μž‘μ€ 청크둜 λΆ„ν• ν•˜λ©°, 각각의 μ²­ν¬λŠ” chunks μ»¬λ ‰μ…˜μ—μ„œ λ³„λ„μ˜ λ¬Έμ„œλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. λ˜ν•œ files μ»¬λ ‰μ…˜μ— 파일 ID, 파일 이름 및 기타 파일 메타데이터가 ν¬ν•¨λœ λ¬Έμ„œλ₯Ό λ§Œλ“­λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ λ˜λŠ” μŠ€νŠΈλ¦Όμ—μ„œ νŒŒμΌμ„ μ—…λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 버킷에 μ—…λ‘œλ“œν•  λ•Œ GridFSκ°€ νŒŒμΌμ„ λΆ„ν• ν•˜λŠ” 방법을 보렀면 λ‹€μŒ λ‹€μ΄μ–΄κ·Έλž¨μ„ μ°Έμ‘°ν•˜μ„Έμš”.

GridFSκ°€ νŒŒμΌμ„ 버킷에 μ—…λ‘œλ“œν•˜λŠ” 방법을 λ³΄μ—¬μ£ΌλŠ” λ‹€μ΄μ–΄κ·Έλž¨μž…λ‹ˆλ‹€.

νŒŒμΌμ„ 검색할 λ•Œ GridFSλŠ” μ§€μ •λœ λ²„ν‚·μ˜ files μ»¬λ ‰μ…˜μ—μ„œ 메타데이터λ₯Ό κ°€μ Έμ™€μ„œ 이 정보λ₯Ό μ‚¬μš©ν•˜μ—¬ chunks μ»¬λ ‰μ…˜μ˜ λ¬Έμ„œμ—μ„œ νŒŒμΌμ„ μž¬κ΅¬μ„±ν•©λ‹ˆλ‹€. νŒŒμΌμ„ λ©”λͺ¨λ¦¬λ‘œ μ½κ±°λ‚˜ 슀트림으둜 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

GridFSμ—μ„œ νŒŒμΌμ„ μ‘°νšŒν•˜κ±°λ‚˜ μ €μž₯ν•˜λ €λ©΄ 버킷을 λ§Œλ“€κ±°λ‚˜ MongoDB λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κΈ°μ‘΄ 버킷에 λŒ€ν•œ μ°Έμ‘°λ₯Ό κ°€μ Έμ˜€λ©΄ λ©λ‹ˆλ‹€. MongoDatabase μΈμŠ€ν„΄μŠ€λ₯Ό 맀개 λ³€μˆ˜λ‘œ μ‚¬μš©ν•˜μ—¬ GridFSBuckets.create() 헬퍼 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ GridFSBucket을 μΈμŠ€ν„΄μŠ€ν™”ν•©λ‹ˆλ‹€. GridFSBucket μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ λ²„ν‚·μ˜ νŒŒμΌμ—μ„œ 읽기 및 μ“°κΈ° μž‘μ—…μ„ ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

MongoDatabase database = mongoClient.getDatabase("mydb");
GridFSBucket gridFSBucket = GridFSBuckets.create(database);

κΈ°λ³Έ 이름인 fs μ΄μ™Έμ˜ μ‚¬μš©μž 지정 μ΄λ¦„μœΌλ‘œ 버킷을 λ§Œλ“€κ±°λ‚˜ μ°Έμ‘°ν•˜λ €λ©΄ μ•„λž˜μ™€ 같이 버킷 이름을 두 번째 맀개 λ³€μˆ˜λ‘œ create() λ©”μ„œλ“œμ— μ „λ‹¬ν•©λ‹ˆλ‹€.

GridFSBucket gridFSBucket = GridFSBuckets.create(database, "myCustomBucket");

μ°Έκ³ 

create()λ₯Ό ν˜ΈμΆœν•  λ•Œ 버킷이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ MongoDBκ°€ 버킷을 λ§Œλ“€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹ , 첫 번째 νŒŒμΌμ„ μ—…λ‘œλ“œν•  λ•Œμ™€ 같이 ν•„μš”μ— 따라 버킷을 μƒμ„±ν•©λ‹ˆλ‹€.

이 μ„Ήμ…˜μ— μ–ΈκΈ‰λœ 클래슀 및 λ©”μ„œλ“œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒ API μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

GridFS 버킷에 νŒŒμΌμ„ μ €μž₯ν•˜λ €λ©΄ InputStream μΈμŠ€ν„΄μŠ€μ—μ„œ νŒŒμΌμ„ μ—…λ‘œλ“œν•˜κ±°λ‚˜ ν•΄λ‹Ή 데이터λ₯Ό GridFSUploadStream에 κΈ°λ‘ν•˜λ©΄ λ©λ‹ˆλ‹€.

λ‘˜ 쀑 μ–΄λ–€ μ—…λ‘œλ“œ ν”„λ‘œμ„ΈμŠ€μ—μ„œλ“ , λ©”νƒ€λ°μ΄ν„°λ‘œ μ €μž₯ν•  파일 청크 크기 및 기타 ν•„λ“œ/κ°’ 쌍과 같은 ꡬ성 정보λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ μ½”λ“œ μŠ€λ‹ˆνŽ«μ— ν‘œμ‹œλœ λŒ€λ‘œ GridFSUploadOptions μΈμŠ€ν„΄μŠ€μ—μ„œ 이 정보λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

GridFSUploadOptions options = new GridFSUploadOptions()
.chunkSizeBytes(1048576) // 1MB chunk size
.metadata(new Document("myField", "myValue"));

μžμ„Έν•œ λ‚΄μš©μ€ GridFSUploadOptions API μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

μ€‘μš”

MAJORITY μ“°κΈ° κ³ λ € μ‚¬μš©

GridFS 버킷에 νŒŒμΌμ„ μ €μž₯ν•  λ•ŒλŠ” WriteConcern.MAJORITY μ“°κΈ° κ³ λ €λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ‹€λ₯Έ μ“°κΈ° κ³ λ €λ₯Ό μ§€μ •ν•˜λ©΄ GridFS 파일 μ—…λ‘œλ“œ 쀑에 λ°œμƒν•˜λŠ” 볡제본 μ„ΈνŠΈ νˆ¬ν‘œλ‘œ 인해 μ—…λ‘œλ“œ ν”„λ‘œμ„ΈμŠ€κ°€ μ€‘λ‹¨λ˜μ–΄ 일뢀 파일 청크가 손싀될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ“°κΈ° 고렀에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ MongoDB Server λ§€λ‰΄μ–Όμ˜ μ“°κΈ° κ³ λ € νŽ˜μ΄μ§€λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

이 μ„Ήμ…˜μ—μ„œλŠ” μž…λ ₯ μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜μ—¬ GridFS 버킷에 νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. λ‹€μŒ μ½”λ“œ μ˜ˆμ‹œμ—μ„œλŠ” FileInputStream을 μ‚¬μš©ν•˜μ—¬ 파일 μ‹œμŠ€ν…œμ˜ νŒŒμΌμ—μ„œ 데이터λ₯Ό 읽고 λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ—¬ GridFS에 μ—…λ‘œλ“œν•˜λŠ” 방법을 보여 μ€λ‹ˆλ‹€.

  • FileInputStream을 μ‚¬μš©ν•˜μ—¬ 파일 μ‹œμŠ€ν…œμ—μ„œ 읽기.

  • GridFSUploadOptionsλ₯Ό μ‚¬μš©ν•˜μ—¬ 청크 크기 μ„€μ •.

  • typeμ΄λΌλŠ” μ‚¬μš©μž 지정 메타데이터 ν•„λ“œλ₯Ό 'zip archive' κ°’μœΌλ‘œ μ„€μ •.

  • GridFS 파일 이름을 'myProject.zip'으둜 μ§€μ •ν•˜μ—¬ project.zipμ΄λΌλŠ” 파일 μ—…λ‘œλ“œ.

String filePath = "/path/to/project.zip";
try (InputStream streamToUploadFrom = new FileInputStream(filePath) ) {
// Defines options that specify configuration information for files uploaded to the bucket
GridFSUploadOptions options = new GridFSUploadOptions()
.chunkSizeBytes(1048576)
.metadata(new Document("type", "zip archive"));
// Uploads a file from an input stream to the GridFS bucket
ObjectId fileId = gridFSBucket.uploadFromStream("myProject.zip", streamToUploadFrom, options);
// Prints the "_id" value of the uploaded file
System.out.println("The file id of the uploaded file is: " + fileId.toHexString());
}

이 μ½”λ“œ μ˜ˆμ‹œμ—μ„œλŠ” μ—…λ‘œλ“œλœ 파일이 GridFS에 μ„±κ³΅μ μœΌλ‘œ μ €μž₯되면 ν•΄λ‹Ή 파일의 파일 IDλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

μžμ„Έν•œ λ‚΄μš©μ€ uploadFromStream()에 λŒ€ν•œ API μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

이 μ„Ήμ…˜μ—μ„œλŠ” 좜λ ₯ μŠ€νŠΈλ¦Όμ— κΈ°λ‘ν•˜μ—¬ GridFS 버킷에 νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. λ‹€μŒ μ½”λ“œ μ˜ˆμ‹œμ—μ„œλŠ” μ•„λž˜ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ„œ GridFSUploadStream에 κΈ°λ‘ν•˜μ—¬ GridFS에 데이터λ₯Ό λ³΄λ‚΄λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€.

  • 'project.zip'μ΄λΌλŠ” νŒŒμΌμ„ 파일 μ‹œμŠ€ν…œμ—μ„œ λ°”μ΄νŠΈ λ°°μ—΄λ‘œ μ½μŠ΅λ‹ˆλ‹€.

  • GridFSUploadOptionsλ₯Ό μ‚¬μš©ν•˜μ—¬ 청크 크기 μ„€μ •.

  • typeμ΄λΌλŠ” μ‚¬μš©μž 지정 메타데이터 ν•„λ“œλ₯Ό 'zip archive' κ°’μœΌλ‘œ μ„€μ •.

  • λ°”μ΄νŠΈλ₯Ό GridFSUploadStream에 κΈ°λ‘ν•˜κ³  파일 이름 'myProject.zip'으둜 μ§€μ •ν•©λ‹ˆλ‹€. μŠ€νŠΈλ¦Όμ€ chunkSize 섀정에 μ§€μ •λœ ν•œλ„μ— 도달할 λ•ŒκΉŒμ§€ 데이터λ₯Ό 버퍼에 μž…λ ₯ν•˜κ³  chunks μ»¬λ ‰μ…˜μ— μƒˆ 청크둜 μ‚½μž…ν•©λ‹ˆλ‹€.

Path filePath = Paths.get("/path/to/project.zip");
byte[] data = Files.readAllBytes(filePath);
// Defines options that specify configuration information for files uploaded to the bucket
GridFSUploadOptions options = new GridFSUploadOptions()
.chunkSizeBytes(1048576)
.metadata(new Document("type", "zip archive"));
try (GridFSUploadStream uploadStream = gridFSBucket.openUploadStream("myProject.zip", options)) {
// Writes file data to the GridFS upload stream
uploadStream.write(data);
uploadStream.flush();
// Prints the "_id" value of the uploaded file
System.out.println("The file id of the uploaded file is: " + uploadStream.getObjectId().toHexString());
// Prints a message if any exceptions occur during the upload process
} catch (Exception e) {
System.err.println("The file upload failed: " + e);
}

이 μ½”λ“œ μ˜ˆμ‹œμ—μ„œλŠ” μ—…λ‘œλ“œλœ 파일이 GridFS에 μ„±κ³΅μ μœΌλ‘œ μ €μž₯되면 ν•΄λ‹Ή 파일의 파일 IDλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

μ°Έκ³ 

파일 μ—…λ‘œλ“œμ— μ„±κ³΅ν•˜μ§€ λͺ»ν•˜λ©΄ μž‘μ—…μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜κ³  μ—…λ‘œλ“œλœ μ²­ν¬λŠ” λΆ„λ¦¬λœ 청크가 λ©λ‹ˆλ‹€. λΆ„λ¦¬λœ μ²­ν¬λŠ” GridFS chunks μ»¬λ ‰μ…˜μ— μžˆλŠ” λ¬Έμ„œ 쀑 GridFS files μ»¬λ ‰μ…˜μ˜ 파일 IDλ₯Ό μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” λ¬Έμ„œμž…λ‹ˆλ‹€. μ—…λ‘œλ“œ λ˜λŠ” μ‚­μ œ μž‘μ—…μ΄ μ€‘λ‹¨λ˜λ©΄ 파일 청크가 λΆ„λ¦¬λœ 청크가 될 수 μžˆμŠ΅λ‹ˆλ‹€. λΆ„λ¦¬λœ 청크λ₯Ό μ œκ±°ν•˜λ €λ©΄ 읽기 μž‘μ—…μ„ μ‚¬μš©ν•˜μ—¬ λΆ„λ¦¬λœ 청크λ₯Ό μ‹λ³„ν•˜κ³  μ“°κΈ° μž‘μ—…μ„ μ‚¬μš©ν•˜μ—¬ μ œκ±°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μžμ„Έν•œ λ‚΄μš©μ€ GridFSUploadStream에 λŒ€ν•œ API μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

이 μ„Ήμ…˜μ—μ„œλŠ” GridFS λ²„ν‚·μ˜ files μ»¬λ ‰μ…˜μ— μ €μž₯된 파일 메타데이터λ₯Ό κ²€μƒ‰ν•˜λŠ” 방법을 μ•Œμ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ©”νƒ€λ°μ΄ν„°μ—λŠ” λ‹€μŒμ„ ν¬ν•¨ν•˜μ—¬ μ°Έμ‘°ν•˜λŠ” νŒŒμΌμ— λŒ€ν•œ 정보가 ν¬ν•¨λ©λ‹ˆλ‹€.

  • 파일의 ID

  • 파일 이름

  • 파일의 길이/크기

  • μ—…λ‘œλ“œ λ‚ μ§œ 및 μ‹œκ°„

  • λ‹€λ₯Έ 정보λ₯Ό μ €μž₯ν•  수 μžˆλŠ” metadata λ¬Έμ„œμž…λ‹ˆλ‹€.

GridFS λ²„ν‚·μ—μ„œ νŒŒμΌμ„ μ‘°νšŒν•˜λ €λ©΄ GridFSBucket μΈμŠ€ν„΄μŠ€μ—μ„œ find() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” GridFSFindIterable을 λ°˜ν™˜ν•˜λ©°, 이λ₯Ό 톡해 결과에 μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œ μ˜ˆμ‹œλŠ” GridFS λ²„ν‚·μ˜ λͺ¨λ“  νŒŒμΌμ—μ„œ 파일 메타데이터λ₯Ό μ‘°νšŒν•˜κ³  좜λ ₯ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. 이 μ˜ˆμ—μ„œλŠ” GridFSFindIterableμ—μ„œ 쑰회된 κ²°κ³Όλ₯Ό μˆœνšŒν•  수 μžˆλŠ” μ—¬λŸ¬ 가지 방법 쀑 Consumer ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒ κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

gridFSBucket.find().forEach(new Consumer<GridFSFile>() {
@Override
public void accept(final GridFSFile gridFSFile) {
System.out.println(gridFSFile);
}
});

λ‹€μŒ μ½”λ“œ μ˜ˆμ‹œμ—μ„œλŠ” 쿼리 필터에 μ§€μ •λœ ν•„λ“œμ™€ μΌμΉ˜ν•˜λŠ” λͺ¨λ“  파일의 파일 이름을 μ‘°νšŒν•˜κ³  좜λ ₯ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. λ˜ν•œ λ°˜ν™˜λœ GridFSFindIterableμ—μ„œ sort() 및 limit()λ₯Ό ν˜ΈμΆœν•˜μ—¬ 결과의 μˆœμ„œμ™€ μ΅œλŒ€ 개수λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

Bson query = Filters.eq("metadata.type", "zip archive");
Bson sort = Sorts.ascending("filename");
// Retrieves 5 documents in the bucket that match the filter and prints metadata
gridFSBucket.find(query)
.sort(sort)
.limit(5)
.forEach(new Consumer<GridFSFile>() {
@Override
public void accept(final GridFSFile gridFSFile) {
System.out.println(gridFSFile);
}
});

metadata 은 λ‚΄μž₯된 λ¬Έμ„œ μ΄λ―€λ‘œ 쿼리 ν•„ν„°ν•˜λ‹€ λŠ” 점 ν‘œκΈ°λ²• 을 μ‚¬μš©ν•˜μ—¬ λ¬Έμ„œ λ‚΄μ—μ„œ type ν•„λ“œ λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ μž„λ² λ””λ“œ/쀑첩 λ¬Έμ„œ 쿼리 방법에 λŒ€ν•œ μ„œλ²„ 맀뉴얼 κ°€μ΄λ“œ λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

이 μ„Ήμ…˜μ— μ–ΈκΈ‰λœ 클래슀 및 λ©”μ„œλ“œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒ λ¦¬μ†ŒμŠ€λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

  • GridFSFindIterable API μ„€λͺ…μ„œ

  • GridFSBucket.find() API μ„€λͺ…μ„œ

  • κ²°κ³Ό μ •λ ¬

  • λ°˜ν™˜λ˜λŠ” κ²°κ³Ό 수 μ œν•œ

νŒŒμΌμ„ GridFSμ—μ„œ 슀트림으둜 직접 λ‹€μš΄λ‘œλ“œν•˜κ±°λ‚˜ μŠ€νŠΈλ¦Όμ—μ„œ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 파일 ID λ˜λŠ” 파일 이름을 μ‚¬μš©ν•˜μ—¬ μ‘°νšŒν•  νŒŒμΌμ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

버킷에 λ™μΌν•œ 파일 이름을 κ³΅μœ ν•˜λŠ” 파일이 μ—¬λŸ¬ 개 μžˆλŠ” 경우, GridFSλŠ” 기본적으둜 κ°€μž₯ μ΅œκ·Όμ— μ—…λ‘œλ“œλœ 파일 μˆ˜μ •λ³Έμ„ μ„ νƒν•©λ‹ˆλ‹€. 같은 이름을 κ³΅μœ ν•˜λŠ” 각 νŒŒμΌμ„ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ GridFSλŠ” λ™μΌν•œ μ΄λ¦„μ˜ νŒŒμΌμ— μ—…λ‘œλ“œ μ‹œκ°„ 순으둜 μˆ˜μ •λ³Έ 번호λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€.

μ›λž˜μ˜ 파일 μˆ˜μ •λ³Έ λ²ˆν˜ΈλŠ” '0'이고 κ·Έ λ‹€μŒμœΌλ‘œ κ°€μž₯ 졜근의 파일 μˆ˜μ •λ³Έ λ²ˆν˜ΈλŠ” '1'μž…λ‹ˆλ‹€. μˆ˜μ •λ³Έμ˜ μ΅œμ‹ μ„±μ— ν•΄λ‹Ήν•˜λŠ” 음수 값을 지정할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μˆ˜μ •λ³Έ 값이 '-1'이면 κ°€μž₯ 졜근의 μˆ˜μ •λ³Έμ΄κ³  '-2'λŠ” κ·Έ λ‹€μŒμ˜ 졜근 μˆ˜μ •λ³Έμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œ μŠ€λ‹ˆνŽ«μ€ GridFSDownloadOptions μΈμŠ€ν„΄μŠ€μ—μ„œ 파일의 두 번째 μˆ˜μ •λ³Έμ„ μ§€μ •ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€.

GridFSDownloadOptions downloadOptions = new GridFSDownloadOptions().revision(1);

μˆ˜μ •λ³Έ 열거에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ GridFSDownloadOptions에 λŒ€ν•œ API μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

GridFS 버킷에 μžˆλŠ” νŒŒμΌμ„ 좜λ ₯ μŠ€νŠΈλ¦Όμ— λ‹€μš΄λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ μ½”λ“œ μ˜ˆμ‹œμ—μ„œλŠ” downloadToStream() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 'myProject.zip' 파일의 첫 번째 μˆ˜μ •λ³Έμ„ OutputStream에 λ‹€μš΄λ‘œλ“œν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€.

GridFSDownloadOptions downloadOptions = new GridFSDownloadOptions().revision(0);
// Downloads a file to an output stream
try (FileOutputStream streamToDownloadTo = new FileOutputStream("/tmp/myProject.zip")) {
gridFSBucket.downloadToStream("myProject.zip", streamToDownloadTo, downloadOptions);
streamToDownloadTo.flush();
}

이 λ©”μ„œλ“œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ downloadToStream() API μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

μž…λ ₯ μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜μ—¬ GridFS 버킷에 μžˆλŠ” νŒŒμΌμ„ λ©”λͺ¨λ¦¬μ— λ‹€μš΄λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. GridFS λ²„ν‚·μ—μ„œ openDownloadStream() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ νŒŒμΌμ„ 읽을 수 μžˆλŠ” μž…λ ₯ 슀트림인 GridFSDownloadStream을 μ—΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œ μ˜ˆμ‹œμ—μ„œλŠ” fileId λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λŠ” νŒŒμΌμ„ λ©”λͺ¨λ¦¬μ— λ‹€μš΄λ‘œλ“œν•˜κ³  ν•΄λ‹Ή μ½˜ν…μΈ λ₯Ό λ¬Έμžμ—΄λ‘œ 좜λ ₯ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€.

ObjectId fileId = new ObjectId("60345d38ebfcf47030e81cc9");
// Opens an input stream to read a file containing a specified "_id" value and downloads the file
try (GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(fileId)) {
int fileLength = (int) downloadStream.getGridFSFile().getLength();
byte[] bytesToWriteTo = new byte[fileLength];
downloadStream.read(bytesToWriteTo);
// Prints the downloaded file's contents as a string
System.out.println(new String(bytesToWriteTo, StandardCharsets.UTF_8));
}

이 λ©”μ„œλ“œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ openDownloadStream() API μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

rename() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 버킷에 μžˆλŠ” GridFS 파일의 이름을 μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€. 파일 이름이 μ•„λ‹Œ 파일 ID둜 이름을 바꾸도둝 νŒŒμΌμ„ 지정해야 ν•©λ‹ˆλ‹€.

μ°Έκ³ 

rename() λ©”μ„œλ“œλŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ 파일 이름 μ—…λ°μ΄νŠΈλ§Œ μ§€μ›ν•©λ‹ˆλ‹€. μ—¬λŸ¬ 파일의 이름을 λ°”κΎΈλ €λ©΄ λ²„ν‚·μ—μ„œ 파일 이름과 μΌμΉ˜ν•˜λŠ” 파일 λͺ©λ‘μ„ μ‘°νšŒν•˜κ³ , 이름을 λ°”κΎΈλ €λŠ” νŒŒμΌμ—μ„œ 파일 ID 값을 μΆ”μΆœν•œ λ‹€μŒ, rename() λ©”μ„œλ“œμ— 각각의 파일 IDλ₯Ό κ°œλ³„μ μœΌλ‘œ ν˜ΈμΆœν•˜μ—¬ μ „λ‹¬ν•©λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œ μ˜ˆμ—μ„œλŠ” fileId λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λŠ” 파일 이름을 'mongodbTutorial.zip'으둜 μ—…λ°μ΄νŠΈν•˜λŠ” 방법을 보여 μ€λ‹ˆλ‹€.

ObjectId fileId = new ObjectId("60345d38ebfcf47030e81cc9");
// Renames the file that has a specified "_id" value to "mongodbTutorial.zip"
gridFSBucket.rename(fileId, "mongodbTutorial.zip");

이 λ©”μ„œλ“œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ rename() API μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

delete() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ GridFS λ²„ν‚·μ—μ„œ νŒŒμΌμ„ μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 파일 이름이 μ•„λ‹Œ 파일 ID둜 νŒŒμΌμ„ 지정해야 ν•©λ‹ˆλ‹€.

μ°Έκ³ 

delete() λ©”μ„œλ“œλŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ 파일 μ‚­μ œλ§Œ μ§€μ›ν•©λ‹ˆλ‹€. μ—¬λŸ¬ νŒŒμΌμ„ μ‚­μ œν•˜λ €λ©΄ λ²„ν‚·μ—μ„œ νŒŒμΌμ„ μ‘°νšŒν•˜κ³  μ‚­μ œν•˜λ €λŠ” νŒŒμΌμ—μ„œ 파일 IDλ₯Ό μΆ”μΆœν•œ λ‹€μŒ delete() λ©”μ„œλ“œμ— 각각의 파일 IDλ₯Ό κ°œλ³„μ μœΌλ‘œ ν˜ΈμΆœν•˜μ—¬ μ „λ‹¬ν•©λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œ μ˜ˆμ‹œμ—μ„œλŠ” fileId λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λŠ” νŒŒμΌμ„ μ‚­μ œν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€.

ObjectId fileId = new ObjectId("60345d38ebfcf47030e81cc9");
// Deletes the file that has a specified "_id" value from the GridFS bucket
gridFSBucket.delete(fileId);

이 λ©”μ„œλ“œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ delete() API μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

λ‹€μŒ μ½”λ“œ μ˜ˆμ‹œλŠ” 'mydb'λΌλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κΈ°λ³Έ GridFS 버킷을 μ‚­μ œν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. μ‚¬μš©μž 지정 λͺ…λͺ…λœ 버킷을 μ°Έμ‘°ν•΄μ•Ό ν•˜λŠ” 경우 이 κ°€μ΄λ“œ 의 μ‚¬μš©μž 지정 버킷을 λ§Œλ“œλŠ” 방법 μ„Ήμ…˜μ„ μ°Έμ‘°ν•˜μ„Έμš”.

MongoDatabase database = mongoClient.getDatabase("mydb");
GridFSBucket gridFSBucket = GridFSBuckets.create(database);
gridFSBucket.drop();

이 λ©”μ„œλ“œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ drop() API μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

λŒμ•„κ°€κΈ°

λͺ¨λ‹ˆν„°λ§