PostgreSQL DBMS๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ MongoDB ๊ตฌํ˜„์ธ FerretDB์˜ ์ฒซ ๋ฒˆ์งธ ์•ˆ์ •์ ์ธ ๋ฆด๋ฆฌ์Šค

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์„œ ์ง€ํ–ฅ DBMS MongoDB๋ฅผ PostgreSQL๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” FerretDB 1.0 ํ”„๋กœ์ ํŠธ์˜ ๋ฆด๋ฆฌ์Šค๊ฐ€ ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. FerretDB๋Š” MongoDB์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ PostgreSQL์— ๋Œ€ํ•œ SQL ์ฟผ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ๊ตฌํ˜„๋˜์–ด PostgreSQL์„ ์‹ค์ œ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „ 1.0์€ ์ผ๋ฐ˜์šฉ์œผ๋กœ ์ค€๋น„๋œ ์ฒซ ๋ฒˆ์งธ ์•ˆ์ • ๋ฆด๋ฆฌ์Šค๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” Go๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ Apache 2.0 ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

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

MongoDB๋Š” ํ‚ค/๊ฐ’ ๋ฐ์ดํ„ฐ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋น ๋ฅด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ๊ณผ ๊ธฐ๋Šฅ์ ์ด๊ณ  ์ฟผ๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ๊ด€๊ณ„ํ˜• DBMS ์‚ฌ์ด์˜ ํ‹ˆ์ƒˆ๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. MongoDB๋Š” JSON๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋ฌธ์„œ ์ €์žฅ์„ ์ง€์›ํ•˜๊ณ , ์ฟผ๋ฆฌ ์ƒ์„ฑ์„ ์œ„ํ•œ ์ƒ๋‹นํžˆ ์œ ์—ฐํ•œ ์–ธ์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ์ €์žฅ๋œ ์†์„ฑ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ๋Œ€์šฉ๋Ÿ‰ ์ด์ง„ ๊ฐ์ฒด์˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—… ๋กœ๊น…์„ ์ง€์›ํ•˜๊ณ , ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจ๋Ÿฌ๋‹ค์ž„ Map/Reduce์— ๋”ฐ๋ผ ์ž‘์—…ํ•˜๊ณ  ๋ณต์ œ๋ฅผ ์ง€์›ํ•˜๊ณ  ๋‚ด๊ฒฐํ•จ์„ฑ ๊ตฌ์„ฑ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

FerretDB 1.0์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • ์ปฌ๋ ‰์…˜์— ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ createIndexes ๋ฐ dropIndexes ๋ช…๋ น์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • getMore ๋ช…๋ น์€ ์ฐพ๊ธฐ ๋ฐ ์ง‘๊ณ„์™€ ๊ฐ™์ด ์ปค์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ช…๋ น ์‹คํ–‰์—์„œ ์–ป์€ ๊ฒฐ๊ณผ์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์„ ํ‘œ์‹œํ•˜๋„๋ก ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฃน ๊ฐ’์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด $sum ์ง‘๊ณ„ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • $limit ๋ฐ $skip ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์–ด ์ง‘๊ณ„ ์‹œ ๋ฌธ์„œ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ณ  ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.
  • ์ง‘๊ณ„ ์‹œ ๋ฌธ์„œ ๊ณ„์‚ฐ์„ ์œ„ํ•œ $count ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋“ค์–ด์˜ค๋Š” ๋ฌธ์„œ์˜ ๋ฐฐ์—ด ํ•„๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ๊ฐ ๋ฐฐ์—ด ์š”์†Œ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๋ฌธ์„œ๋กœ ๋ชฉ๋ก์„ ํ˜•์„ฑํ•˜๋Š” $unwind ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ˆ˜์ง‘ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ†ต๊ณ„์™€ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด collStats, dbStats ๋ฐ dataSize ๋ช…๋ น์— ๋Œ€ํ•œ ๋ถ€๋ถ„ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€