์นด์šฐ์น˜๋ฒ ์ด์Šค์™€ ๋ชฝ๊ณ DBโ„ข ๋น„๊ต

MongoDB ๋Œ€์‹  Couchbase๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” 3๊ฐ€์ง€ ์ด์œ 

DBaaS ์„ฑ๋Šฅ ๋ณด๊ณ ์„œ์—์„œ Atlas์™€ Capella์˜ ๋น„๊ต๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์ค‘์š”ํ•œ MongoDB์˜ ๋‹จ์ ๊ณผ ์ด๋ฅผ ๊ทน๋ณตํ•˜๋Š” Couchbase์˜ ๋ฐฉ๋ฒ•

๋„์ „ ๊ณผ์ œ 1: ์ฟผ๋ฆฌ ๋ณต์žก์„ฑ

NoSQL์—์„œ SQL ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ

MongoDB

๋ชฝ๊ณ DB์—๋Š” ์„ ์–ธ์  ์ฟผ๋ฆฌ ์–ธ์–ด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋ณต์žกํ•œ ์ ˆ์ฐจ์  ๋กœ์ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฟผ๋ฆฌ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ ์ €ํ•˜๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

Couchbase

SQL++๋Š” ๊ฐœ๋ฐœ์ž์™€ ๊ธฐ์—…์—๊ฒŒ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌ, ๋ณ€ํ™˜, ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œํ˜„๋ ฅ์ด ํ’๋ถ€ํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๋ฉฐ ์™„๋ฒฝํ•œ ์–ธ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. JSON ๋ฌธ์„œ์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ด๊ณ  ์„ ์–ธ์ ์ธ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๋ ฅ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณผ์ œ 2: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐ์ธ ๋ถ€์กฑ

JOIN ์ ˆ

MongoDB

์ƒค๋“œ๋œ ์ปฌ๋ ‰์…˜์— ํšจ๊ณผ์ ์ธ ๋ฌธ์„œ ์กฐ์ธ์ด ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์„ค๊ณ„์— ๊ธฐ์ˆ ์  ์ œ์•ฝ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ถˆํ•„์š”ํ•œ ๋น„์ •๊ทœํ™”, ๋ฐ์ดํ„ฐ ์ค‘๋ณต, ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Couchbase

๊ฐœ๋ฐœ์ž๋Š” ANSI ์กฐ์ธ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋ฏ€๋กœ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ SQL์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ ์กฐ์ธ ๋ฐ ์ง‘๊ณ„ ํ‘ธ์‹œ๋‹ค์šด์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ์ง€์›์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณผ์ œ 3: RDBMS์—์„œ ์–ด๋ ค์šด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

MongoDB

MongoDB์˜ ๋…์  ์ฟผ๋ฆฌ API๋Š” SQL ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋†’์€ ํ•™์Šต ๊ณก์„ ์„ ์ดˆ๋ž˜ํ•˜๊ณ  ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ์žฌ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Couchbase

SQL++๋Š” ์—…๊ณ„ ํ‘œ์ค€ SQL์„ JSON์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ RDBMS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ JSON ๋ฌธ์„œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์นด์šฐ์น˜๋ฒ ์ด์Šค๋Š” ANSI SQL์„ ํ™•์žฅํ•˜์—ฌ ๋‹ค์Œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
์œ ์—ฐํ•œ JSON ์Šคํ‚ค๋งˆ

MongoDB ์ฟผ๋ฆฌ ์นด์šฐ์น˜๋ฒ ์ด์Šค SQL++
    
 db.stocks.aggregate([
                { "$match": {
                   "$and": [
                    {"๊ธฐํ˜ธ": {
                    "$in":
                     [ "AAPL",
                        "GOOG"]}},
                         { "value":
                        { "$gt": 0 }}]}},
                { "$group": {
                            "_id": {
                             "์‹ฌ๋ณผ": "$symbol" },
                              "ํ•ฉ๊ณ„(๊ฐ’ * ๋ณผ๋ฅจ)": {
                                "$sum": {
                                 "$multiply": [
                                    "$value",
                                      "$๋ณผ๋ฅจ"]}}}},
                { "$project": {
                             "_id": 0,
                              "ํ•ฉ๊ณ„(๊ฐ’ * ๋ณผ๋ฅจ)":
                              "$sum(value * volume)",
                              "์‹ฌ๋ณผ": "$_id.symbol"}}
                {"$sort": {
                              "ํ•ฉ๊ณ„(๊ฐ’ * ๋ณผ๋ฅจ)":
                              -1, "symbol": 1 }}]}
                                    
                            
ํ•ฉ๊ณ„ ์„ ํƒ(๊ฐ’ * ๋ณผ๋ฅจ) AS val, ๊ธฐํ˜ธ
FROM ย  db.stocks
์–ด๋”” ย ๊ธฐํ˜ธ IN ( "aapl", "goog" ) AND ๊ฐ’ > 0
๊ทธ๋ฃน ๊ธฐ์ค€ ๊ธฐํ˜ธ
์ฃผ๋ฌธ ๊ธฐ์ค€ val DESC, ๊ธฐํ˜ธ ASC
                

์›น์บ์ŠคํŠธ: ํ™•์žฅ์„ฑ, ์„ฑ๋Šฅ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ ์„ ์œ„ํ•ด MongoDBโ„ข์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•

์ง€๊ธˆ ๋“ฑ๋กํ•˜๊ธฐ

๊ธฐ์—…์ด MongoDB ๋Œ€์‹  Couchbase๋ฅผ ์„ ํƒํ•˜๋Š” ์ด์œ 

DirectTV

์˜ค๋Š˜๋‚ ์˜ ์‹œ์ฒญ์ž๋Š” ์›ํ™œํ•œ ๊ฒฝํ—˜๊ณผ ๋Š์ž„์—†๋Š” ํ˜์‹ ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. MongoDB ์ฐพ๊ธฐ ์˜ ์‚ฌ์šฉ๊ณผ ํ™•์žฅ์ด ์–ด๋ ต๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋œ DirecTV๋Š” ํƒ์›”ํ•œ ๋Œ€๊ทœ๋ชจ ์„ฑ๋Šฅ์„ ์œ„ํ•ด Couchbase๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค, ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๊ฐ„ ๋ณต์ œ๋ฅผ ํ†ตํ•ด ์‹œ์ฒญ์ž์—๊ฒŒ 24์‹œ๊ฐ„ ์—ฐ์ค‘๋ฌดํœด๋กœ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐ•๋ ฅํ•œ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•œ SQL++.

์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ
Viber

MongoDB์™€ Redis ๋ฐฑ์—”๋“œ๊ฐ€ ๋” ์ด์ƒ ์ง€์›ํ•  ์ˆ˜ ์—†๋Š” ์†๋„๋กœ ํ™•์žฅํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ Viber ๋Š” ๋ฉ”์‹œ์ง• ํ”Œ๋žซํผ์„ Couchbase๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. Couchbase๋ฅผ ํ†ตํ•ด Viber๋Š” ์„œ๋ฒ„๋ฅผ 50% ์ด์ƒ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ 50% ์ด์ƒ ์ค„์˜€๊ณ , ๋‹ค์šดํƒ€์ž„์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๊ฒฌ๊ณ ํ•˜๋ฉฐ, ์ด์ œ ์ดˆ๋‹น ๋ฐฑ๋งŒ ๊ฑด์— ๊ฐ€๊นŒ์šด ์ž‘์—…๊ณผ ์ดˆ๋‹น ๋ฐฑ๋งŒ ๊ฑด์— ๊ฐ€๊นŒ์šด ์ž‘์—…๊ณผ ์ˆ˜์‹ญ์–ต ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ
๋‰˜์•™์Šค

์Œ์„ฑ ์ธ์‹ ๋ฐ ์ด๋ฏธ์ง• ์†Œํ”„ํŠธ์›จ์–ด ํšŒ์‚ฌ์ธ Nuance๋Š” ๋ชจ๋†€๋ฆฌ์‹ ์˜ฌ์˜ค๋ผํด( ํ™˜๊ฒฝ์€ ํ™•์žฅ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ์œ ์—ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํƒ์ƒ‰ ๊ณผ์ •์—์„œ NoSQL์„ ํƒ์ƒ‰ํ•˜๋˜ ์ค‘, Nuance๋Š” MongoDB๊ฐ€ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์†์‰ฝ๊ณ , ๋น„์šฉ ํšจ์œจ์ ์ธ ๋Œ€๊ทœ๋ชจ ์„ฑ๋Šฅ๊ณผ ์–‘๋ฐฉํ–ฅ ๋ณต์ œ๋ฅผ ์œ„ํ•ด CouchBase๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ
์Šคํ…Œ์ดํ”Œ

Staples๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ ์šฉ๋˜๋Š” 16์–ต ๊ฐœ์˜ ๊ทœ์น™์„ ์‚ฌ์šฉํ•ด B2B ์นดํƒˆ๋กœ๊ทธ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. Staples๋Š” MongoDB๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ, ์‰ฝ๊ณ  ๊ฒฝ์ œ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์—†์–ด ์ทจ์†Œ๋œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Couchbase๋ฅผ ํ†ตํ•ด Staples๋Š” SQL++์™€ JSON์„ ์‚ฌ์šฉํ•˜์—ฌ ์นดํƒˆ๋กœ๊ทธ ๊ด€๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์นดํƒˆ๋กœ๊ทธ ๊ด€๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ๋„ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ

์นดํŽ ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค ๋น„๊ต

์นด์šฐ์น˜๋ฒ ์ด์Šค ์นดํŽ ๋ผโ„ข์™€ ๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค ์ œ๊ณต์—…์ฒด(์˜ˆ: MongoDB์˜โ„ข Atlas ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๋ฐ Amazon์˜ DynamoDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค)๋ฅผ ๋น„๊ตํ•ด ๋ณด์„ธ์š”. Couchbase Capella๊ฐ€ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜์ธ ์ด์œ ๋ฅผ ์•Œ์•„๋ณด์„ธ์š”.