PostgreSQL DBMS๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ MongoDB๋ฅผ ๊ตฌํ˜„ํ•œ FerretDB 0.1 ์ถœ์‹œ

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

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

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

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

FerretDB 0.1.0 ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” PostgreSQL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์™„์ „ํžˆ ์žฌ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ๋“ค์–ด์˜ค๋Š” ๊ฐ MongoDB ์š”์ฒญ์— ๋Œ€ํ•ด JSON ํ˜•์‹์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  PostgreSQL ์ธก์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PostgreSQL์— ํ•˜๋‚˜์˜ SQL ์ฟผ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. PostgreSQL๊ณผ MongoDB json ํ•จ์ˆ˜์˜ ์˜๋ฏธ ์ฒด๊ณ„์˜ ์ฐจ์ด๋กœ ์ธํ•ด ๋‹ค์–‘ํ•œ ์œ ํ˜•์„ ๋น„๊ตํ•˜๊ณ  ์ •๋ ฌํ•  ๋•Œ ๋™์ž‘์— ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ด์ œ PostgreSQL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณต์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ FerretDB ์ธก์—์„œ ํ•„ํ„ฐ๋งํ•˜๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ MongoDB์˜ ๋™์ž‘์„ ๋ณต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธํ™˜์„ฑ ํ–ฅ์ƒ์˜ ๋Œ€๊ฐ€๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์˜€์œผ๋ฉฐ, ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ๋™์ž‘์— ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” ์ฟผ๋ฆฌ๋งŒ FerretDB ์ธก์—์„œ ์„ ํƒ์ ์œผ๋กœ ํ•„ํ„ฐ๋งํ•˜์—ฌ ๋ณด์ƒํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "db.collection.find({_id: 'some-id-value'})" ์ฟผ๋ฆฌ๋Š” PostgreSQL์—์„œ ์™„์ „ํžˆ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ๋ชฉํ‘œ๋Š” MongoDB์™€์˜ ํ˜ธํ™˜์„ฑ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ์„ฑ๋Šฅ์€ ํ˜„์žฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋ฐ€๋ ค๋‚ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „์˜ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ค‘์—๋Š” ๋ชจ๋“  ๋น„ํŠธ ์—ฐ์‚ฐ์ž, "$eq" ๋น„๊ต ์—ฐ์‚ฐ์ž, "$elemMatch" ๋ฐ "$bitsAllClear" ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ง€์›์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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