- GridFS์ ๊ฐ๋
์ตํ๊ธฐ
- java-mongodb ๋๋ผ์ด๋ฒ๋ฅผ ์ด์ฉํ ๊ฐ๋จํ ๋ชฝ๊ณ ๋๋น ์ฐ๋ ๋ฐ GridFS ์ํ
- ์ดํ๋ฆฌ์ผ์ด์
์์ ์ด๋ฏธ์ง, ์ฌ๋ค์ผ, ๋น๋์ค๋ฑ ์ด์งํ์ผ์ ์ ์ฅํ๊ธฐ์ํด ํ์ผ ์์คํ
์ ์์ง.
- ํ์ผ ์์คํ
์ ์ก์ธ์ค๋ฅผ ๋น ๋ฅด๊ฒ ํด์ฃผ์ง๋ง, ์ ๋ง๊ฑด ์ด์์ ํ์ผ ๊ด๋ฆฌ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํผ๋์ ์ด๋ํจ.
- ํ์ผ์ ๋ฉํ ๋ฐ์ดํฐ๋ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅํ ๊ฒฝ์ฐ ์ค์ ํ์ผ๊ณผ ๋ฉํ๋ฐ์ดํฐ๊ฐ์ ์ ํํ ๋ฐฑ์
์ด ๋ณต์กํด์ง.
- ํ์ผ ๊ตฌ์กฐ์ ๋ฐฑ์
์ ๊ฐ๋จํ ํ๊ธฐ์ํด ํ์ผ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์์ฒด์ ์ ์ฅํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ๊ฒฝ์ฐ ์ฌ์ฉ.
- ํ์ผ ํ๋๋น ํ๋์ ๋ํ๋จผํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋(1MB์ดํ)์ ์ด์ง๊ฐ์ฒด์ ์ ํฉ.
- ๋์ฉ๋์ ํ์ผ์ GridFS๋ฅผ ์ฌ์ฉ.
- GridFS๋ BSON ๋ฌธ์ ํฌ๊ธฐ ์ ํ์ธ 16MB๋ฅผ ์ด๊ณผํ๋ ํ์ผ์ ์ ์ฅํ๊ณ ๊ฒ์ํ๊ธฐ์ํ ๊ธฐ๋ฅ.
- GridFS๋ ํ์ผ์ ํ๋์ ๋ฌธ์์ ์ ์ฅํ๋ ๋์ ํ์ผ์ ์ฌ๋ฌ ๋ถ๋ถ์ chunk๋ก ๋๋๊ณ ๊ฐ chunk๋ฅผ ๋ณ๋์ ๋ฌธ์๋ก ์ ์ฅํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก GridFS๋ 255KB์ chunk๋ฅผ ์ฌ์ฉํ๋ค.
- GridFS๋ ํ์ผ ์ฒญํฌ ์ฝ๋ ์
(bucket.chunks), ํ์ผ ๋ฉํ ๋ฐ์ดํฐ ์ฝ๋ ์
(bucket.files)์ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ ์ฅํ๋ค.
- GridFS์ ํ์ผ์ ์ฟผ๋ฆฌํ๋ฉด, ๋๋ผ์ด๋ฒ๋ ํ์์ ๋ฐ๋ผ ์ฒญํฌ๋ฅผ ์ฌ์กฐํฉํ๋ค.
- GridFS๋ฅผ ํตํด ์ ์ฅ๋ ํ์ผ์ ๋ํด ๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์ํ ํ ์ ์๋ค.
- ๋น๋์ค ๋๋ ์ค๋์ค ํ์ผ์ ์ค๊ฐ์ผ๋ก ๊ฑด๋ ๋ฐ๋ ๊ฒ๊ณผ ๊ฐ์ด ํ์ผ์ ์์ ์น์
์์ ์ ๋ณด์ ์ก์ธ์ค ํ ์๋ ์๋ค.
- GridFS๋ 16MB๋ฅผ ์ด๊ณผํ๋ ํ์ผ์ ์ ์ฅํ ๋, ์ ์ฒด ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ์ง ์๊ณ ์ก์ธ์คํ๋ ค๋ ํ์ผ์ ์ ์ฅ ํ ์์๋ค.
- ๋ฒ์ 2.4.10์์ ๋ณ๊ฒฝ : ๊ธฐ๋ณธ ์ฒญํฌ ํฌ๊ธฐ๊ฐ 256KB์์ 255KB๋ก ๋ณ๊ฒฝ๋จ.
- ์์คํ
๋ณด๋ค ํฐ ํ์ผ์ ์ ์ฅํ๋ ๊ฒ์ด 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๊ฐ ์์ฑ๋ ์ปฌ๋ ์
์ด๋ฆ
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);
//์์ฑ๋ 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")));