Docs Menu

์ž์ฒด ๊ด€๋ฆฌ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ GridFS

GridFS๋Š” BSON ๋ฌธ์„œ ํฌ๊ธฐ ์ œํ•œ์ธ 16MB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์–‘์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ 

GridFS๋Š” ๋‹ค์ค‘๋ฌธ์„œ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

GridFS๋Š” ํŒŒ์ผ์„ ๋‹จ์ผ ๋ฌธ์„œ์— ์ €์žฅํ•˜๋Š” ๋Œ€์‹  ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„, ์ฆ‰ ์ฒญํฌ [1]๋กœ ๋‚˜๋ˆ„๊ณ  ๊ฐ ์ฒญํฌ๋ฅผ ๋ณ„๋„์˜ ๋ฌธ์„œ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ GridFS๋Š” 255 kB์˜ ๊ธฐ๋ณธ ์ฒญํฌ ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, GridFS๋Š” ๋งˆ์ง€๋ง‰ ์ฒญํฌ๋ฅผ ์ œ์™ธํ•˜๊ณ  ํŒŒ์ผ์„ 255 kB์˜ ์ฒญํฌ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ฒญํฌ๋Š” ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ปค์ง‘๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฒญํฌ ํฌ๊ธฐ๋ณด๋‹ค ํฌ์ง€ ์•Š์€ ํŒŒ์ผ์—๋Š” ํ•„์š”ํ•œ ๋งŒํผ์˜ ๊ณต๊ฐ„๊ณผ ์ผ๋ถ€ ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ตœ์ข… ์ฒญํฌ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

GridFS๋Š” ๋‘ ๊ฐœ์˜ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์ปฌ๋ ‰์…˜์€ ํŒŒ์ผ ์ฒญํฌ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜์€ ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. GridFS Collections ์„น์…˜์—์„œ ๊ฐ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

GridFS์— ํŒŒ์ผ์„ ์ฟผ๋ฆฌํ•˜๋ฉด ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ•„์š”์— ๋”ฐ๋ผ ์ฒญํฌ๋ฅผ ์žฌ์กฐ๋ฆฝํ•ฉ๋‹ˆ๋‹ค. GridFS๋ฅผ ํ†ตํ•ด ์ €์žฅ๋œ ํŒŒ์ผ์˜ ๋ฒ”์œ„ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋™์˜์ƒ์ด๋‚˜ ์˜ค๋””์˜ค ํŒŒ์ผ ์ค‘๊ฐ„์— '๊ฑด๋„ˆ๋›ฐ๊ธฐ'์™€ ๊ฐ™์ด ํŒŒ์ผ์˜ ์ž„์˜ ์„น์…˜์—์„œ ์ •๋ณด์— ์•ก์„ธ์Šคํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

GridFS๋Š” 16MB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „์ฒด ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ์•ก์„ธ์Šคํ•˜๋ ค๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๋ฐ์—๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. GridFS๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB์—์„œ๋Š” 16MB๋ณด๋‹ค ํฐ ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ GridFS๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ๋ณด๋‹ค MongoDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํŒŒ์ผ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒฝ์šฐ GridFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋งŒํผ ๋งŽ์€ ํŒŒ์ผ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ „์ฒด ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์˜ ์ผ๋ถ€์—์„œ ์ •๋ณด์— ์•ก์„ธ์Šคํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— GridFS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ฝ์ง€ ์•Š๊ณ  ํŒŒ์ผ ์„น์…˜์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๊ณ  ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ ๋ฐ ์‹œ์„ค์— ๋ฐฐํฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ GridFS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋ฆฌ์ ์œผ๋กœ ๋ถ„์‚ฐ๋œ ๋ณต์ œ๋ณธ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด MongoDB๋Š” ํŒŒ์ผ๊ณผ ํ•ด๋‹น ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ mongod ์ธ์Šคํ„ด์Šค ๋ฐ ์‹œ์„ค์— ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ํŒŒ์ผ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์›์ž ๋‹จ์œ„๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” GridFS๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.๋Œ€์•ˆ์œผ๋กœ ๊ฐ ํŒŒ์ผ์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ์ €์žฅํ•˜๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ ํŒŒ์ผ์˜ ํ˜„์žฌ ๋ฒ„์ „์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ƒˆ ๋ฒ„์ „์˜ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•œ ํ›„ ์›์ž ์—…๋ฐ์ดํŠธ์—์„œ '์ตœ์‹ ' ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‚˜์ค‘์— ์ด์ „ ๋ฒ„์ „์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํŒŒ์ผ์ด ๋ชจ๋‘ BSON ๋ฌธ์„œ ํฌ๊ธฐ ์ œํ•œ์ธ 16MB๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ์—๋Š” GridFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๊ฐ ํŒŒ์ผ์„ ๋‹จ์ผ ๋ฌธ์„œ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. BinData ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์‚ฌ์šฉํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. BinData ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋“œ๋ผ์ด๋ฒ„ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

GridFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:

  • MongoDB ๋“œ๋ผ์ด๋ฒ„์ž…๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„์—์„œ GridFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋“œ๋ผ์ด๋ฒ„ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • mongofiles ๋ช…๋ น์ค„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ mongofiles ์ฐธ์กฐ ๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GridFS๋Š” ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐœ์˜ ์ปฌ๋ ‰์…˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • chunks์€(๋Š”) ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฒญํฌ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ chunks ์ปฌ๋ ‰์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  • files์€(๋Š”) ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ files ์ปฌ๋ ‰์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

GridFS๋Š” ๊ฐ ๋ฒ„ํ‚ท ์•ž์— ์ด๋ฆ„์„ ์ง€์ •ํ•ด ๊ณตํ†ต ๋ฒ„ํ‚ท์— ์ปฌ๋ ‰์…˜์„ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ GridFS๋Š” fs๋ผ๋Š” ์ด๋ฆ„์ด ์ง€์ •๋œ ๋ฒ„ํ‚ท์ด ํฌํ•จ๋œ ์ปฌ๋ ‰์…˜ ๋‘ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • fs.files

  • fs.chunks

๋‹ค๋ฅธ ๋ฒ„ํ‚ท ์ด๋ฆ„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹จ์ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฌ๋Ÿฌ ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํ‚ท ์ด๋ฆ„์„ ํฌํ•จํ•œ ์ „์ฒด ์ปฌ๋ ‰์…˜ ์ด๋ฆ„์—๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ธธ์ด์ œํ•œ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

chunks [1] ์ปฌ๋ ‰์…˜์˜ ๊ฐ ๋ฌธ์„œ๋Š” GridFS์—์„œ ํ‘œํ˜„๋˜๋Š” ๋ณ„๊ฐœ์˜ ํŒŒ์ผ ์ฒญํฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ์ปฌ๋ ‰์…˜์˜ ๋ฌธ์„œ ์–‘์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์ปฌ๋ ‰์…˜์˜ ๋ฌธ์„œ ์–‘์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
"_id" : <ObjectId>,
"files_id" : <ObjectId>,
"n" : <num>,
"data" : <binary>
}

์ปฌ๋ ‰์…˜ chunks ๋ฌธ์„œ์—๋Š” ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

chunks._id

์ฒญํฌ์˜ ๊ณ ์œ  ObjectId์ž…๋‹ˆ๋‹ค.

chunks.files_id

_id ์ปฌ๋ ‰์…˜์— ๋ช…์‹œ๋œ '์ƒ์œ„' ๋ฌธ์„œ์˜ files์ž…๋‹ˆ๋‹ค.

chunks.n

์ฒญํฌ์˜ ์‹œํ€€์Šค ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. GridFS๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ์ฒญํฌ์— ๋ฒˆํ˜ธ๋ฅผ ๋งค๊น๋‹ˆ๋‹ค.

chunks.data

์ฒญํฌ์˜ ํŽ˜์ด๋กœ๋“œ๋Š” BSON Binary ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

files collection ์ปฌ๋ ‰์…˜์˜ ๊ฐ ๋ฌธ์„œ๋Š” GridFS์˜ ํŒŒ์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

{
"_id" : <ObjectId>,
"length" : <num>,
"chunkSize" : <num>,
"uploadDate" : <timestamp>,
"md5" : <hash>,
"filename" : <string>,
"contentType" : <string>,
"aliases" : <string array>,
"metadata" : <any>,
}

files ์ปฌ๋ ‰์…˜ ๋‚ด์˜ ๋ฌธ์„œ์—๋Š” ๋‹ค์Œ ํ•„๋“œ ์ค‘ ์ผ๋ถ€ ๋˜๋Š” ์ „๋ถ€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

files._id

์ด ๋ฌธ์„œ์˜ ๊ณ ์œ  ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. _id๋Š” ์›๋ณธ ๋ฌธ์„œ์— ๋Œ€ํ•ด ์„ ํƒํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. MongoDB ๋ฌธ์„œ์˜ ๊ธฐ๋ณธ ์œ ํ˜•์€ BSONObjectId์ž…๋‹ˆ๋‹ค.

files.length

๋ฌธ์„œ์˜ ํฌ๊ธฐ(๋ฐ”์ดํŠธ)์ž…๋‹ˆ๋‹ค.

files.chunkSize

๊ฐ ์ฒญํฌ์˜ ํฌ๊ธฐ(๋ฐ”์ดํŠธ)์ž…๋‹ˆ๋‹ค. GridFS๋Š” ๋งˆ์ง€๋ง‰ ์ฒญํฌ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ฌธ์„œ๋ฅผ ํ•„์š”ํ•œ ํฌ๊ธฐ์˜ ์ฒญํฌchunkSize๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํฌ๊ธฐ๋Š” 255 ํ‚ฌ๋กœ๋ฐ”์ดํŠธ(kB)์ž…๋‹ˆ๋‹ค.

files.uploadDate

๋ฌธ์„œ๊ฐ€ GridFS์— ์ฒ˜์Œ ์ €์žฅ๋œ ๋‚ ์งœ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ Date ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

files.md5

๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

MD5 ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ FIPS 140-2์— ์˜ํ•ด ๊ธˆ์ง€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. MongoDB ๋“œ๋ผ์ด๋ฒ„๋Š” MD5 ์ง€์›์„ ์ค‘๋‹จํ•˜๊ณ  ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ MD5 ์ƒ์„ฑ์„ ์ œ๊ฑฐํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‹ค์ด์ œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋ฅผ GridFS ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„ํ•˜๊ณ  files.metadata์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

filemd5 ๋ช…๋ น์—์„œ ๋ฐ˜ํ™˜๋œ ์ „์ฒด ํŒŒ์ผ์˜ MD5 ํ•ด์‹œ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ String ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

files.filename

์„ ํƒ ์‚ฌํ•ญ. ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” GridFS ํŒŒ์ผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

files.contentType

๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ ํƒ ์‚ฌํ•ญGridFS ํŒŒ์ผ์— ์œ ํšจํ•œ MIME ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์šฉ์ž…๋‹ˆ๋‹ค.

GridFS ํŒŒ์ผ์˜ MIME ์œ ํ˜•๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด files.metadata๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

files.aliases

๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ ํƒ ์‚ฌํ•ญ. ๋ณ„์นญ ๋ฌธ์ž์—ด์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์šฉ์ž…๋‹ˆ๋‹ค.

GridFS ํŒŒ์ผ์˜ MIME ์œ ํ˜•๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด files.metadata๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

files.metadata

์„ ํƒ ์‚ฌํ•ญ. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•„๋“œ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์œ ํ˜•์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ €์žฅํ•˜๋ ค๋Š” ๋ชจ๋“  ์ถ”๊ฐ€ ์ •๋ณด ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜์˜ ๋ฌธ์„œ์— ์ž„์˜ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด files ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•„๋“œ์˜ ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

GridFS๋Š” ํšจ์œจ์„ฑ์„ ์œ„ํ•ด chunks ๋ฐ files ์ปฌ๋ ‰์…˜ ๊ฐ๊ฐ์— ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. GridFS ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„๋Š” ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ถ”๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

GridFS๋Š” files_id ๋ฐ n ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ chunks ์ปฌ๋ ‰์…˜์—์„œ ๊ณ ์œ ํ•œ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ์ฒญํฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.fs.chunks.find( { files_id: myFileID } ).sort( { n: 1 } )

GridFS ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„๋Š” ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ (write) ์ž‘์—… ์ „์— ์ด ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์ž๋™์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. GridFS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ๋™์ž‘์€ ๊ด€๋ จ ๋“œ๋ผ์ด๋ฒ„ ์„ค๋ช…์„œ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

์ด ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ mongosh:๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );

GridFS๋Š” filename ๋ฐ uploadDate ํ•„๋“œ๋กœ files ์ปฌ๋ ‰์…˜์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ํŒŒ์ผ์„ ํšจ์œจ์ ์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.fs.files.find( { filename: myFileName } ).sort( { uploadDate: 1 } )

GridFS ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„๋Š” ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ (write) ์ž‘์—… ์ „์— ์ด ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์ž๋™์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. GridFS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ๋™์ž‘์€ ๊ด€๋ จ ๋“œ๋ผ์ด๋ฒ„ ์„ค๋ช…์„œ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

์ด ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ mongosh:๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

db.fs.files.createIndex( { filename: 1, uploadDate: 1 } );
[1](1, 2) GridFS์˜ ๋งฅ๋ฝ์—์„œ ์ฒญํฌ๋ผ๋Š” ์šฉ์–ด์˜ ์‚ฌ์šฉ์€ ์ƒค๋”ฉ์˜ ๋งฅ๋ฝ์—์„œ ์ฒญํฌ๋ผ๋Š” ์šฉ์–ด ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

GridFS์™€ ๊ด€๋ จํ•˜์—ฌ files ๋ฐ chunks์˜ ๋‘ ๊ฐ€์ง€ ์ปฌ๋ ‰์…˜์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

chunks ์ปฌ๋ ‰์…˜์„ ์ƒค๋”ฉํ•˜๋ ค๋ฉด { files_id : 1, n : 1 } ๋˜๋Š” { files_id : 1 }์„(๋ฅผ) ์ƒค๋“œ ํ‚ค ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. files_id๋Š” ObjectId์ด๋ฉฐ ๋‹จ์กฐ๋กญ๊ฒŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

filemd5๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์—…๋กœ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š๋Š” MongoDB ๋“œ๋ผ์ด๋ฒ„์˜ ๊ฒฝ์šฐ chunks ์ปฌ๋ ‰์…˜์— ํ•ด์‹œ๋œ ์ƒค๋”ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MongoDB ๋“œ๋ผ์ด๋ฒ„๊ฐ€ filemd5๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด์‹œ๋œ ์ƒค๋”ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ SERVER-9888์„ ์ฐธ์กฐํ•˜์„ธ์š”.

files ์ปฌ๋ ‰์…˜์€ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. GridFS์— ํ•„์š”ํ•œ ํ‚ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ƒค๋“œ๋œ ํ™˜๊ฒฝ์—์„œ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ฐฐํฌ๋˜๋Š” ๋ฐ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. files๋ฅผ ์ƒค๋”ฉํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘๋ฉด ๋ชจ๋“  ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฌธ์„œ๊ฐ€ ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒค๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

files ์ปฌ๋ ‰์…˜์„ ๋ฐ˜๋“œ์‹œ ์ƒค๋”ฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ•„๋“œ์™€ ํ•จ๊ป˜ _id ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.