GridFS - KWSStudy/Mongodb GitHub Wiki

๋ชฉํ‘œ

  • GridFS์˜ ๊ฐœ๋…์ตํžˆ๊ธฐ
  • java-mongodb ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ ๋ชฝ๊ณ ๋””๋น„ ์—ฐ๋™ ๋ฐ GridFS ์ƒ˜ํ”Œ

์ฑ…์— ๋‚˜์˜จ GridFS

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๋ฏธ์ง€, ์„ฌ๋„ค์ผ, ๋น„๋””์˜ค๋“ฑ ์ด์ง„ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ธฐ์œ„ํ•ด ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์˜์ง€.
  • ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์•ก์„ธ์Šค๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•ด์ฃผ์ง€๋งŒ, ์ˆ˜ ๋งŒ๊ฑด ์ด์ƒ์˜ ํŒŒ์ผ ๊ด€๋ฆฌ์‹œ์— ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•จ.
  • ํŒŒ์ผ์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ๊ฒฝ์šฐ ์‹ค์ œ ํŒŒ์ผ๊ณผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ„์˜ ์ •ํ™•ํ•œ ๋ฐฑ์—…์ด ๋ณต์žกํ•ด์ง.
  • ํŒŒ์ผ ๊ตฌ์กฐ์™€ ๋ฐฑ์—…์„ ๊ฐ„๋‹จํžˆ ํ•˜๊ธฐ์œ„ํ•ด ํŒŒ์ผ์„ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ž์ฒด์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉ.
  • ํŒŒ์ผ ํ•˜๋‚˜๋‹น ํ•˜๋‚˜์˜ ๋„ํ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์†Œ๋Ÿ‰(1MB์ดํ•˜)์˜ ์ด์ง„๊ฐ์ฒด์— ์ ํ•ฉ.
  • ๋Œ€์šฉ๋Ÿ‰์˜ ํŒŒ์ผ์€ GridFS๋ฅผ ์‚ฌ์šฉ.

GridFS์˜ ๊ฐœ๋…

  • GridFS๋Š” BSON ๋ฌธ์„œ ํฌ๊ธฐ ์ œํ•œ์ธ 16MB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๊ธฐ์œ„ํ•œ ๊ธฐ๋Šฅ.
  • GridFS๋Š” ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ๋ฌธ์„œ์— ์ €์žฅํ•˜๋Š” ๋Œ€์‹  ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์˜ chunk๋กœ ๋‚˜๋ˆ„๊ณ  ๊ฐ chunk๋ฅผ ๋ณ„๋„์˜ ๋ฌธ์„œ๋กœ ์ €์žฅํ•œ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ GridFS๋Š” 255KB์˜ chunk๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • GridFS๋Š” ํŒŒ์ผ ์ฒญํฌ ์ฝœ๋ ‰์…˜(bucket.chunks), ํŒŒ์ผ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์ฝœ๋ ‰์…˜(bucket.files)์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ €์žฅํ•œ๋‹ค.
  • GridFS์— ํŒŒ์ผ์„ ์ฟผ๋ฆฌํ•˜๋ฉด, ๋“œ๋ผ์ด๋ฒ„๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์ฒญํฌ๋ฅผ ์žฌ์กฐํ•ฉํ•œ๋‹ค.
  • GridFS๋ฅผ ํ†ตํ•ด ์ €์žฅ๋œ ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ฒ”์œ„ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋น„๋””์˜ค ๋˜๋Š” ์˜ค๋””์˜ค ํŒŒ์ผ์˜ ์ค‘๊ฐ„์œผ๋กœ ๊ฑด๋„ˆ ๋›ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ํŒŒ์ผ์˜ ์ž„์˜ ์„น์…˜์—์„œ ์ •๋ณด์— ์•ก์„ธ์Šค ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • GridFS๋Š” 16MB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ, ์ „์ฒด ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ์•ก์„ธ์Šคํ•˜๋ ค๋Š” ํŒŒ์ผ์„ ์ €์žฅ ํ•  ์ˆ˜์žˆ๋‹ค.
  • ๋ฒ„์ „ 2.4.10์—์„œ ๋ณ€๊ฒฝ : ๊ธฐ๋ณธ ์ฒญํฌ ํฌ๊ธฐ๊ฐ€ 256KB์—์„œ 255KB๋กœ ๋ณ€๊ฒฝ๋จ.

GridFS ์‚ฌ์šฉ์‹œ๊ธฐ

  • ์‹œ์Šคํ…œ๋ณด๋‹ค ํฐ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด MongoDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒฝ์šฐ, GridFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ๋งŒํผ์˜ ํŒŒ์ผ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๋ถ€ ์ •๋ณด์— ์•ก์„ธ์Šคํ•˜๋ ค๋Š” ๊ฒฝ์šฐ GridFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ฝ์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ํŒŒ์ผ ์„น์…˜์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํŒŒ์ผ ๋ฐ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ ๋ฐ ์‹œ์„ค์— ์ž๋™์œผ๋กœ ๋™๊ธฐํ™” ๋ฐ ๋ฐฐํฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ GridFS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ถ„์‚ฐ ๋œ ๋ณต์ œ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, MongoDB๋Š” ์—ฌ๋Ÿฌ mongod ์ธ์Šคํ„ด์Šค์™€ ๊ธฐ๋Šฅ์— ํŒŒ์ผ๊ณผ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ „์ฒด ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์›์ž ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ GridFS ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ.
  • ๋Œ€์•ˆ์œผ๋กœ ๊ฐ ํŒŒ์ผ์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ์ €์žฅํ•˜๊ณ  ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์— ํŒŒ์ผ์˜ ํ˜„์žฌ ๋ฒ„์ „์„ ์ง€์ • ํ•œ๋‹ค.
  • ์ƒˆ ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•œ ํ›„ "์ตœ์‹ "์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํ•„์š”ํ•˜๋ฉด ์ด์ „ ๋ฒ„์ „์„ ์ œ๊ฑฐ.
  • ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ 16MB๋ณด๋‹ค ์ž‘ ์œผ๋ฉด GridFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋‹จ์ผ ๋ฌธ์„œ์— ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • BinData ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • BinData ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋“œ๋ผ์ด๋ฒ„ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ชฝ๊ณ ๋””๋น„ ์—ฐ๋™ ๋ฐ GridFS ์ƒ˜ํ”Œ

  • java-mongodb ๋“œ๋ผ์ด๋ฒ„์—ฐ๋™
//ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ
MongoClient client = new MongoClient("localhost");
//๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ
MongoDatabase database = client.getDatabase("tutorial");
//์ปฌ๋ ‰์…˜ ์„ ํƒ
MongoCollection<Document> collection =  database.getCollection("numbers");
  • GridFS ์ƒ˜ํ”Œ
//GridFS๊ฐ€ ์ƒ์„ฑ๋  ์ปฌ๋ ‰์…˜ ์ด๋ฆ„
final String bucket = "test";
//GridFS๋ฅผ ์ด์šฉํ•ด ์ €์žฅํ•  ํŒŒ์ผ๋ช…
final String filename = "test.JPG";		 
//bucket๋ช…์œผ๋กœ ์ง€์ •ํ•œ GridFS์—ฐ๊ฒฐ ์ƒ์„ฑ
GridFSBucket gridFSBucket = GridFSBuckets.create(database,bucket);
//์‚ฌ์šฉ์ž ์ •์˜ metadata์— ์ €์žฅ๋  ์ƒ˜ํ”Œ BsonDocument
ObjectId etag = new ObjectId();
BsonDocument metadata = new BsonDocument();
metadata.put("_etag", new BsonObjectId(etag));
 
GridFSUploadOptions options = new GridFSUploadOptions().metadata(Document.parse(metadata.toJson()));
//GridFS๋ฅผ ์ด์šฉํ•ด ์ €์žฅํ•  ํŒŒ์ผ InputStream ์ƒ์„ฑ
InputStream sourceStream = MongoConnector.class.getResourceAsStream(filename);

//GridFS๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ ์ €์žฅ ํ›„ _id๊ฐ’ ๋ฐ›์•„์˜ค๊ธฐ	         
ObjectId _id = gridFSBucket.uploadFromStream( filename, sourceStream, options);
//์ €์žฅ๋œ _id๊ฐ’ ์ถœ๋ ฅ
System.out.println(_id);
  • mongodb์—์„œ ํ™•์ธ
//์ƒ์„ฑ๋œ GridFS ์ปฌ๋ ‰์…˜ ํ™•์ธ
> show tables;
numbers
test.chunks
test.files
//์ƒ์„ฑ๋œ chunk ์ˆ˜ ํ™•์ธ
> db.test.chunks.count()
25
//์ €์žฅ๋œ file ์ •๋ณด ํ™•์ธ
> db.test.files.find().pretty()
{
        "_id" : ObjectId("58477396f034dd1b840b32d4"),
        "filename" : "test.JPG",
        "length" : NumberLong(6341811),
        "chunkSize" : 261120,
        "uploadDate" : ISODate("2016-12-07T02:27:35.304Z"),
        "md5" : "48b2a854b5deb75370fcaaef52c865e6",
        "metadata" : {
                "_etag" : ObjectId("58477396f034dd1b840b32d3")
        }
}
>
  • ์ €์žฅ๋œ GridFS๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ
//bucket๋ช…์œผ๋กœ ์ง€์ •ํ•œ GridFS์—ฐ๊ฒฐ ์ƒ์„ฑ
GridFSBucket downloadGridFs = GridFSBuckets.create(database,bucket);
//์ง€์ •๋œ ํŒŒ์ผ๋ช…์— ํ•ด๋‹นํ•˜๋Š” id๊ฐ€์ ธ์˜ค๊ธฐ
ObjectId fid = downloadGridFs.find(Filters.eq("filename", filename)).first().getObjectId();
//๊ฐ€์ ธ์˜จ ํŒŒ์ผ์„ d:/mongo.JPG์— ์ €์žฅ
downloadGridFs.downloadToStream(fid, new FileOutputStream(new File("d:/mongo.JPG")));

โš ๏ธ **GitHub.com Fallback** โš ๏ธ