๋ฌธ์„œ ๋ฉ”๋‰ด

๋ฌธ์„œ ํ™ˆ โ†’ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ โ†’ MongoDB ๋“œ๋ผ์ด๋ฒ„ โ†’ Go ๋“œ๋ผ์ด๋ฒ„

GridFS.

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ

  • ๊ฐœ์š”
  • GridFS ์ž‘๋™ ๋ฐฉ์‹
  • GridFS ์‚ฌ์šฉ
  • GridFS ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ
  • ํŒŒ์ผ ์—…๋กœ๋“œ
  • ํŒŒ์ผ ์ •๋ณด ๊ฒ€์ƒ‰
  • ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
  • ํŒŒ์ผ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ
  • ํŒŒ์ผ ์‚ญ์ œ
  • GridFS ๋ฒ„ํ‚ท ์‚ญ์ œ
  • ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค
  • API ๋ฌธ์„œ

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

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

GridFS๋Š” ํŒŒ์ผ ์ฒญํฌ์™€ ํŒŒ์ผ์„ ์„ค๋ช…ํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋Š” MongoDB ์ปฌ๋ ‰์…˜ ๊ทธ๋ฃน์ธ ๋ฒ„ํ‚ท์— ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํ‚ท์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปฌ๋ ‰์…˜์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ์ฒญํฌ๋ฅผ ์ €์žฅํ•˜๋Š” chunks ์ปฌ๋ ‰์…˜.

  • ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” files ์ปฌ๋ ‰์…˜.

์ƒˆ GridFS ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•˜๋ฉด ๋“œ๋ผ์ด๋ฒ„๋Š” ์•ž์— ์„ค๋ช…ํ•œ ์ปฌ๋ ‰์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฒ„ํ‚ท ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ธฐ๋ณธ ๋ฒ„ํ‚ท ์ด๋ฆ„์ธ fs๊ฐ€ ์ปฌ๋ ‰์…˜ ์ด๋ฆ„ ์•ž์— ๋ถ™์Šต๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„๋Š” ์ฒซ ๋ฒˆ์งธ ์“ฐ๊ธฐ ์ž‘์—… ์ค‘์— ์ƒˆ GridFS ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

GridFS๋กœ ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ ๋“œ๋ผ์ด๋ฒ„๋Š” ํŒŒ์ผ์„ ์ž‘์€ ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•˜๋ฉฐ, ๊ฐ๊ฐ์˜ ์ฒญํฌ๋Š” chunks ์ปฌ๋ ‰์…˜์—์„œ ๋ณ„๋„์˜ ๋ฌธ์„œ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ files ์ปฌ๋ ‰์…˜์— ํŒŒ์ผ ID, ํŒŒ์ผ ์ด๋ฆ„ ๋ฐ ๊ธฐํƒ€ ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์€ GridFS๊ฐ€ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ๋ถ„ํ• ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

GridFS๊ฐ€ ํŒŒ์ผ์„ ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

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

GridFS ์ž‘์—…๊ณผ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ๋‹ค์Œ ์„น์…˜์œผ๋กœ ์ด๋™ํ•˜์„ธ์š”.

GridFS์—์„œ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋ ค๋ฉด ๋ฒ„ํ‚ท์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ MongoDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ธฐ์กด ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ๋ฉ๋‹ˆ๋‹ค. GridFSBucket ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NewBucket() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

db := client.Database("db")
bucket, err := gridfs.NewBucket(db)
if err != nil {
panic(err)
}

์ฐธ๊ณ 

GridFS ๋ฒ„ํ‚ท์ด ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ NewBucket() ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ ๋ฒ„ํ‚ท์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ๋Œ€์‹  ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒˆ ๋ฒ„ํ‚ท์˜ ์ด๋ฆ„์€ fs์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์ด๋ฆ„์œผ๋กœ ๋ฒ„ํ‚ท์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด BucketOptions ์ธ์Šคํ„ด์Šค์—์„œ SetName() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

db := client.Database("db")
opts := options.GridFSBucket().SetName("custom name")
bucket, err := gridfs.NewBucket(db, opts)
if err != nil {
panic(err)
}

๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GridFS ๋ฒ„ํ‚ท์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์—์„œ ์ฝ๋Š” UploadFromStream() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— ์“ฐ๋Š” OpenUploadStream() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‘ ์—…๋กœ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ UploadOptions ์žˆ์Šต๋‹ˆ๋‹ค.UploadOptions ํ•„๋“œ์˜ ์ „์ฒด ๋ชฉ๋ก์€ API ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋งค๊ฐœ ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ UploadFromStream() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ์ด๋ฆ„

  • ์—ด๋ฆฐ ํŒŒ์ผ์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” io.Reader

  • UploadFromStream()์˜ ๋™์ž‘์„ ์ˆ˜์ •ํ•˜๋Š” ์„ ํƒ์  opts ๋งค๊ฐœ ๋ณ€์ˆ˜

๋‹ค์Œ ์ฝ”๋“œ ์˜ˆ์‹œ์—์„œ๋Š” file.txt๋ผ๋Š” ํŒŒ์ผ์—์„œ ์ฝ๊ณ  ์ฝ˜ํ…์ธ ๋ฅผ GridFS ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. opts ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

file, err := os.Open("path/to/file.txt")
uploadOpts := options.GridFSUpload().SetMetadata(bson.D{{"metadata tag", "first"}})
objectID, err := bucket.UploadFromStream("file.txt", io.Reader(file),
uploadOpts)
if err != nil {
panic(err)
}
fmt.Printf("New file uploaded with ID %s", objectID)

์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋งค๊ฐœ ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ OpenUploadStream() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ์ด๋ฆ„

  • OpenUploadStream()์˜ ๋™์ž‘์„ ์ˆ˜์ •ํ•˜๋Š” ์„ ํƒ์  opts ๋งค๊ฐœ ๋ณ€์ˆ˜

๋‹ค์Œ ์ฝ”๋“œ ์˜ˆ์‹œ์—์„œ๋Š” GridFS ๋ฒ„ํ‚ท์—์„œ ์—…๋กœ๋“œ ์ŠคํŠธ๋ฆผ์„ ์—ด๊ณ  opts ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ฒญํฌ์˜ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด file.txt์˜ ์ฝ˜ํ…์ธ ์— Write() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ํ•ด๋‹น ์ฝ˜ํ…์ธ ๊ฐ€ ์ŠคํŠธ๋ฆผ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

file, err := os.Open("path/to/file.txt")
if err != nil {
panic(err)
}
// Defines options that specify configuration information for files
// uploaded to the bucket
uploadOpts := options.GridFSUpload().SetChunkSizeBytes(200000)
// Writes a file to an output stream
uploadStream, err := bucket.OpenUploadStream("file.txt", uploadOpts)
if err != nil {
panic(err)
}
fileContent, err := io.ReadAll(file)
if err != nil {
panic(err)
}
var bytes int
if bytes, err = uploadStream.Write(fileContent); err != nil {
panic(err)
}
fmt.Printf("New file uploaded with %d bytes written", bytes)

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

  • ํŒŒ์ผ ID

  • ํŒŒ์ผ ๊ธธ์ด

  • ์ตœ๋Œ€ ์ฒญํฌ ํฌ๊ธฐ

  • ์—…๋กœ๋“œ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„

  • ํŒŒ์ผ ์ด๋ฆ„

  • ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” metadata ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด GridFSBucket ์ธ์Šคํ„ด์Šค์—์„œ Find() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํŒŒ์ผ ๋ฌธ์„œ๋งŒ ์ผ์น˜์‹œํ‚ค๋ ค๋ฉด ์ฟผ๋ฆฌ ํ•„ํ„ฐ๋ฅผ Find()์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Find() ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ฟผ๋ฆฌ ํ•„ํ„ฐ๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. files ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ์ผ์น˜์‹œํ‚ค๋ ค๋ฉด ๋นˆ ์ฟผ๋ฆฌ ํ•„ํ„ฐ๋ฅผ Find()์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” files ์ปฌ๋ ‰์…˜์—์„œ length ๊ฐ’์ด 1500๋ณด๋‹ค ํฐ ๋ฌธ์„œ์˜ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ๊ธธ์ด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

filter := bson.D{{"length", bson.D{{"$gt", 1500}}}}
cursor, err := bucket.Find(filter)
if err != nil {
panic(err)
}
type gridfsFile struct {
Name string `bson:"filename"`
Length int64 `bson:"length"`
}
var foundFiles []gridfsFile
if err = cursor.All(context.TODO(), &foundFiles); err != nil {
panic(err)
}
for _, file := range foundFiles {
fmt.Printf("filename: %s, length: %d\n", file.Name, file.Length)
}

๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GridFS ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • DownloadToStream() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

  • OpenDownloadStream() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์—ฝ๋‹ˆ๋‹ค.

DownloadToStream() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GridFS ๋ฒ„ํ‚ท์˜ ํŒŒ์ผ์„ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— ์ง์ ‘ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DownloadToStream()์€ ํŒŒ์ผ ID์™€ ํ•จ๊ป˜ io.Writer๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ง€์ •๋œ ํŒŒ์ผ ID๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ io.Writer์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

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

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
fileBuffer := bytes.NewBuffer(nil)
if _, err := bucket.DownloadToStream(id, fileBuffer); err != nil {
panic(err)
}

OpenDownloadStream() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด GridFS ๋ฒ„ํ‚ท์˜ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenDownloadStream()์€ ํŒŒ์ผ ID๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ํ•ด๋‹น ์ฝ˜ํ…์ธ ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
downloadStream, err := bucket.OpenDownloadStream(id)
if err != nil {
panic(err)
}
fileBytes := make([]byte, 1024)
if _, err := downloadStream.Read(fileBytes); err != nil {
panic(err)
}

Rename() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํ‚ท์— ์žˆ๋Š” GridFS ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ID ๊ฐ’๊ณผ ์ƒˆ filename ๊ฐ’์„ ์ธ์ˆ˜๋กœ Rename()์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ "mongodbTutorial.zip"์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
if err := bucket.Rename(id, "mongodbTutorial.zip"); err != nil {
panic(err)
}

Delete() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GridFS ๋ฒ„ํ‚ท์—์„œ ํŒŒ์ผ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ID ๊ฐ’์„ ์ธ์ˆ˜๋กœ Delete()์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค.

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
if err := bucket.Delete(id); err != nil {
panic(err)
}

Drop() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GridFS ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ ์˜ˆ์‹œ์—์„œ๋Š” GridFS ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

if err := bucket.Drop(); err != nil {
panic(err)
}

GridFS์™€ ๊ทธ ์šด์˜์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด GridFS ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”.

์ด ๊ฐ€์ด๋“œ์— ์„ค๋ช…๋œ ๋ฉ”์„œ๋“œ ๋˜๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ๋‹ค์Œ API ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

โ†ย ์—ฐ๊ฒฐ ๋ชจ๋‹ˆํ„ฐ๋ง