Understanding database - NoSQL ํ•œ ์žฅ์œผ๋กœ ์ด์ •๋ฆฌ

2023. 1. 23. 22:25ใ†Data science/Database

๋ฐ˜์‘ํ˜•
Understanding database - NoSQL ํ•œ ์žฅ์œผ๋กœ ์ด์ •๋ฆฌ

NoSQL ์€ Not only SQL, Non-SQL์˜ ์ค€ ๋ง์ด๋‹ค. ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ NoSQL์ด ์žˆ์œผ๋ฉฐ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ์ฃผ๋กœ ๋‹ค๋ฃจ๊ฒŒ ๋  ๋‚ด์šฉ์€ MongoDB์ด๋ฉฐ ์ด๋Š” Document-based NoSQL์— ํ•ด๋‹น๋œ๋‹ค. ๊ฐ ๋ชฉ์ ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ํˆด๋“ค์ด ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์— ๋Œ€ํ•œ ๋ถ€๋ถ„์€ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค. ๋ฌผ๋ก  ํ•ด๋‹น ํˆด์„ ์ œ๋Œ€๋กœ ๋‹ค๋ฃจ๋ ค๋ฉด ๋งŽ์ด ์ฝ๊ณ  ๋งŽ์ด ๋‹ค๋ค„๋ด์•ผ ํ•˜๋Š” ๋ฐ ์‚ฌ์‹ค ๋ชจ๋“  ํˆด์„ (๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋งŒ ๊ฐ€์ง€๊ณ  ๋†€ ๊ฒƒ๋„ ์•„๋‹Œ ์ƒํ™ฉ์—) ๋‹ค ๋‹ค๋ค„๋ณด๋Š” ๊ฑด ์‰ฝ์ง€ ์•Š์„ ๊ฑฐ ๊ฐ™๋‹ค. ํ•˜๋‚˜์˜ ์–ธ์–ด๋ฅผ ์„ ํƒํ•ด์„œ ํŒŒ๊ณ  ๋“ค์–ด๋ณด๋Š” ๊ฒŒ ํ•ด๋‹น ๊ฐœ๋…์„ ์ตํžˆ๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋œ๋‹ค. ์‹ค์ œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ์ง„ํ–‰ํ•ด๋ณด๊ณ  ๋‚˜์„œ ๋‹ค์‹œ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ฝ์–ด๋ดค์„ ๋•Œ ๋” ๊นŠ์ด ๊ทธ๋ฆฌ๊ณ  ๋„“๊ฒŒ ๋‚ด์šฉ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋‹ค๋Š” ๋‚˜์˜ ๊ฒฝํ—˜๋‹ด. 

Key-Value based NoSQL Riak, Redis, Scalaris, Amazon DynamoDB ๋ง ๊ทธ๋Œ€๋กœ ํ‚ค-๊ฐ’ ๋ฒ ์ด์Šค๋กœ ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์–ธ์–ด
Document-based NoSQL MongoDB, CouchDB, OrientDB ๋‹คํ๋จผํŠธ ๋ฒ ์ด์Šค(SQL ์ด์ •๋ฆฌ์—์„œ ๋‹ค๋ค˜์ง€๋งŒ, SQL๋กœ ์น˜๋ฉด tuple ์ •๋„ ๋˜๋Š” ๊ฒƒ์ด document๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.)
Column-base NoSQL Google BigTable, Cassandra, Hbase, Amazon DynamoDB ์ปฌ๋Ÿผ ๋ฒ ์ด์Šค 
Graph-based NoSQL Neo4J, InfoGrid, FlockDB ๊ทธ๋ž˜ํ”„ ๋ฒ ์ด์Šค 

ACID๋Š” ์ด๋ฏธ ์–ธ๊ธ‰๋˜์—ˆ๋‹ค ์‹œํ”ผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ๊ณจ๋“  ์Šคํƒ ๋‹ค๋“œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. Atomicity, Consistency, Isolation, Durability ๋ฅผ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ์ตœ๊ณ ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์ด๋Š” ๋ณดํ†ต ์ „ํ†ต์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(i.e. SQL)์—์„œ ๊ฐ€๋Šฅํ•œ ์กฐ๊ฑด๋“ค์ด์—ˆ๋‹ค. 

ํ•˜์ง€๋งŒ NoSQL์˜ ์„ธ๊ณ„์—๋Š” CAP Theorem ๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ๋ชจ๋“  ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ๋Š” 3๊ฐ€์ง€ ์กฐ๊ฑด(CAP) ์ค‘ ์˜ค์ง 2๊ฐ€์ง€์˜ ์กฐ๊ฑด๋งŒ์„ ์ถฉ์กฑํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. Consistency, Availability, Partition Tolerance ๊ฐ€ ๊ทธ 3๊ฐ€์ง€ ์ด๋‹ค. 

Figure 1. CAP Theorem(cap ์ •๋ฆฌ)

The BASE Property ๋Š” ๋‹ค์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜๋œ๋‹ค. 

1) Basically Available : DDB(๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค)๋Š” ํ•ญ์ƒ CAP theorem์„ ๋”ฐ๋ฅธ๋‹ค. 

2) Soft state: ์‹œ์Šคํ…œ ์ƒํƒœ๋Š” ๋ฐ์ดํ„ฐ ํŠธ๋žœ์ ์…˜(๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ๋ณ€ํ™”๋ฅผ ์ฃผ๋Š” ์ž‘์—…๋“ค)์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋”๋ผ๋„ ๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. 

3) Eventually Constancy: ์‹œ์Šคํ…œ์€ ๊ฒฐ๊ตญ์€ ์ผ๊ด€์„ฑ์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ๊ฐ€์šฉ์„ฑ๊ณผ ๋ถ„ํ•  ๋‚ด์„ฑ์ด ๋ณด์žฅ๋˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด, ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ผ์‹œ์  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ(์ผ๊ด€์ ์ด์ง€ ์•Š๋Š”)๋Š” ํ—ˆ์šฉ์ด ๋œ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ๊ฒฐ๊ตญ ์ผ๊ด€์„ฑ์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ค‘์•™ ์ง‘์ค‘์ ์ธ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์—์„œ๋Š” ACID ๋Œ€์‹  BASE Property๋ฅผ ๋”ฐ๋ฅธ๋‹ค. (์ค‘์•™ ์ง‘์ค‘์‹ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ์†Œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด๊ณ  ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ์†Œ๋ฅผ ๊ฐ€์ง€๋Š”๊ฒƒ์ด๋‹ค - ํŒŒํ‹ฐ์…˜๋ถ„ํ• , ์ด ๋ถ€๋ถ„์€ ๋งˆ์ง€๋ง‰์ฏค์—์„œ ๋‹ค๋ค„์งˆ ์˜ˆ์ •์ด๋‹ค) 

 

MongoDB๋Š” ์ผ๋ฐ˜์ ์ธ ๋ชฉ์ ์œผ๋กœ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.(ํด๋ผ์šฐ๋“œ)

  • SSPL(Licensed under the server-side public license),
  • SQL joining ๋Œ€์‹ ์— lookup ์ด๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ฐ€๋ฆฌ๋ฉฐ ๊ฐ 64 ๋ฐ”์ดํŠธ๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์—†๋‹ค. 
  • ๋ชจ๋“  ๋‹คํ๋จผํŠธ๋“ค์€ ๊ฐ๊ฐ 16 MB๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์—†๋‹ค. 
  • JSON ํŒŒ์ผ์˜ binary-encoded ๋œ BSON์ด๋ผ๋Š”๊ฒƒ์ด ์‚ฌ์šฉ๋˜์–ด ์ง„๋‹ค. 
  • ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋‚˜ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ์ž˜ ๊ตฌ๋ณ„ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 
  • ๊ฐ ๋‹คํ๋จผ๋“œ ๋“ค์€ ์œ ๋‹ˆํฌํ•œ _id๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค(sql ์˜ pk์™€ ๊ฐ™์€ ์—ญํ• ์„ํ•œ๋‹ค.) -> ๋งŒ์•ฝ์— ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ ๋ฐ ์—…๋ฐ์ดํŠธ ๋˜๋ฉฐ ์ด๋ฅผ objectID๋ผ๊ณ  ํ•œ๋‹ค. ๋ณดํ†ต ์ด๋Š” ๋ฐ์ดํ„ฐ ์ž…๋ ฅ๋˜๋Š” ์‹œ๊ฐ„๊ณผ ๋‚ ์งœ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. 

MongoDB ๋„ CRUD(Create Read Update Delete)๋ฅผ ์ˆ˜ํ–‰ํ• ์ˆ˜์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์“ฐ์ด๋Š” ์ฝ”๋“œ๋ฅผ ์œ„์ฃผ๋กœ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. 

๋‹ค์Œ์€ ์กฐ๊ฑด๋ถ€์—ฌ ์‹œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. 

$eq( ๊ฐ™์€ ๊ฐ’ ), $gt(ํฐ ๊ฐ’), $gte(ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’), $in(๋’ค์— ๋”ฐ๋ผ ์˜ค๋Š” ๋ฐฐ์—ด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€), $lt(less than), $lte(less than or equal), $ne(not equal), $nin(Non in an array) 

๋‹ค์Œ ์€ ๊ทธ ๋ฐ•์— ์ˆ˜์ • ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋“ค์ด๋‹ค. 

๋ฐ์ดํ„ฐ ์ž…๋ ฅ
db.product.insertOne({"category": "fruit", "name":"Apple from Uleumgol"});
db.product.insertMany({"category": "fruit", "name":"Apple from Uleumgol"},{"category": "fruit", "name":"Banana from Ulsan"} );
๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ 
db.product.find({"pyears":{$gte:3}, {"age": {$lte:50}});
๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ 
db.product.updateMany({"pyear": {$gte:3}}, 
					  {$set: "status.finished":1, "status.ongoing":0}}
                     );
๋ฐ์ดํ„ฐ ์‚ญ์ œ
db.product.deleteMany({"finished": 1, "ongoing":0});

๊ทธ ๋ฐ•์— ํ™œ์šฉ ๋งŽ์ด ๋˜๋Š” ์ฝ”๋“œ ๋“ค 

$set: ๊ฐ’ ์„ค์ •ํ•˜๊ธฐ, ๋งŒ์•ฝ ํ•ด๋‹น ์—ด์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์—ด์„ ๋ฐ์ดํ„ฐ์— ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ์ƒˆ๋กœ์šด ์ž…๋ ฅ๋œ ์œ ํ˜•์œผ๋กœ ๋ฐ”๋€Œ๊ธฐ๋„ ํ•œ๋‹ค. 
$unset: ์—ด ๊ฐ’ ์‚ญ์ œ
$inc: ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ์—ด์ด ์—†๋‹ค๋ฉด ์—ด์„ ์ƒ์„ฑํ•˜๊ณ  1๋กœ ์ง€์ •ํ•œ๋‹ค. 
$push: ๋ฐฐ์—ด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ๋งŒ์•ฝ ํ•ด๋‹น ๋ฐฐ์—ด์ด ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•œ๋‹ค. 
$addToSet: ๋ฐฐ์—ด์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ์ถ”๊ฐ€ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์š”์†Œ์˜ ์ค‘๋ณต์€ ํ”ผํ•œ๋‹ค. 
$pull: ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. 
$pop: ์ˆœ์„œ์— ๋”ฐ๋ฅธ ๊ฐ’์„ ์ œ๊ฑฐํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด {$pop:{"key":1}} ๋ฐฐ์—ด๊ฐ’์˜ ๋งจ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์ œ๊ฑฐํ•œ๋‹ค. 
{"upsert": true}: ๋‹คํ๋จผํŠธ๊ฐ€ ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

MongoDB ์—์„œ ์ฟผ๋ฆฌ๋งŒ๋“ค๊ธฐ๋ฅผ ์‰ฝ๊ฒŒํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” Aggregation์ด๋‹ค. ์ง‘๊ณ„๋ผ๋Š” ๊ทธ ๋œป๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€์˜ ๋‹จ๊ณ„๋ฅผ ์—ฐ๋‹ฌ์•„์„œ ์ˆ˜ํ–‰ํ• ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์Œ“์•„ ์˜ฌ๋ฆฌ๋ฉด์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์‹ค์ œ๋กœ MongoDB Compass ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋‹จ๊ณ„์˜ ์˜ˆ์ƒ ๊ฒฐ๊ณผ๊ฐ’์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ ์ฟผ๋ฆฌ๋ฅผ ๋„์ „ํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด compass๋กœ ์—ฐ์Šตํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™๋‹ค. 

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

์ œ์ผ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ฑด

$project : ๋‹คํ๋จผํŠธ์˜ ๊ตฌ์„ฑ์„ ์›ํ•˜๋Š” ์š”์†Œ๋งŒ์œผ๋กœ ๋ฐ”๊ฟ€ ์ถ”๋ฆด ์ˆ˜ ์žˆ๋‹ค.

$unwind: ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹คํ๋จผํŠธ๋กœ ๋ณด์—ฌ์ค€๋‹ค. (๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•œ ๋“ฏ) 

๊ทธ ๋ฐ–์—๋„ ๋งŽ์€ ๋ฐ ์ž์„ธํžˆ ๋‹ค๋ฃจ๊ธด ๋งŽ์œผ๋ฏ€๋กœ ์ด ๋ถ€๋ถ„์€ ๋‹ค์Œ ๊ธฐํšŒ์— ์ฝ”๋”ฉํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋”ฐ๋กœ ๋‹ค๋ค„๋ด์•ผ ๊ฒ ๋‹ค. 

 

INDEX

MongoDB๋Š” Schemaless ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ก ์ ์œผ๋กœ ์˜จ๊ฐ– ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๋‹คํ๋จผํŠธ๋ฅผ ํ•˜๋‚˜์˜ ์ปฌ๋ ‰์…˜์— ๋‹ค ๋•Œ๋ ค ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด ๊ตญ์–ด์‚ฌ์ „์„ ์ƒ๊ฐํ•ด๋ณด์ž. ๊ตญ์–ด์‚ฌ์ „์—์„œ ํ–‰๋ณต์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ 1ํŽ˜์ด์ง€๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€๊นŒ์ง€ ๋ชจ๋‘ ๋‹ค ์ฝ์–ด๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฑฐ๋ณด๋‹ค ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์•ˆ๋‹ค. ใ…Ž ์ด๋ผ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„์„œ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐพ๊ณ  ๋‹ค์Œ ๋‹จ์–ด์˜ ๋ชจ์Œ ์ž์Œ ์ˆœ์„œ๋ฅผ ํ† ๋Œ€๋กœ ์›ํ•˜๋Š” ๋‹ต์„ ์ฐพ์•„๋‚ธ๋‹ค. 

๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ์ฐพ์•„๋ณด์ž. ๋งŒ์•ฝ ์Šค์นผ๋ ›์ด๋ผ๋Š” ์„œ์šธ ๊ฐ•๋‚จ๊ตฌ์— ์‚ฌ๋Š” ์—ฌ์ž๋ฅผ ์ฐพ๊ณ ์ž ํ•œ๋‹ค. ์„œ์šธ ๊ฐ•๋‚จ๊ตฌ์— ์ง‘๋“ค์„ ํ•œ ๊ตฐ๋ฐ์”ฉ ๋‹ค ๋“ค๋Ÿฌ์„œ ์Šค์นผ๋ ›์ด ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๋’ค์ ธ๋ณผ ์ˆ˜๋„ ์žˆ๊ณ˜์ง€๋งŒ ์•„~~~์ฃผ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ์Šค์นผ๋ ›์˜ ์ง‘ gps ์ฃผ์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์šฐ๋ฆฌ๋Š” ๋‹จ ์ˆจ์— ์Šค์นผ๋ › ์ง‘์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 

์ด ์ฒ˜๋Ÿผ ๊ฒ€์ƒ‰์˜ ์†๋„๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋†’์—ฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ INDEX(์ธ๋ฑ์Šค) ์ด๋‹ค. ๋นจ๋ฆฌ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ์ง€ํ‘œ์™€ ๊ฐ™์€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค ์ง€์ •์„ ํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ธ๋ฑ์Šค๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ์—ญํšจ๊ณผ๊ฐ€ ๋‚  ์ˆ˜๋„ ์žˆ๋‹ค. 

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

์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ํ‚ค๋กœ๋Š” ๋‹จ๋… ํ•„๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‘๊ฐœ ์ด์ƒ์˜ ํ‚ค๋กœ ์กฐํ•ฉ๋œ compound index๋„ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ณดํ†ต ์‹ฑ๊ธ€ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ์—” ์ˆœ์„œ ์ •๋ ฌ์ด ์ค‘์š”ํ•œ ์˜๋ฏธ๊ฐ€ ์—†์ง€๋งŒ, compound index์˜ ๊ฒฝ์šฐ ์–˜๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ๋งŒ์•ฝ compound key๋ฅผ ์„ค์ •ํ•˜๊ณ  ์ •๋ ฌ์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด compound key ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ ์ฒ˜๋Ÿผ ๋‚˜์ด, ์ด๋ฆ„์œผ๋กœ ๋œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค๋ฉด ๋‚˜์ด, ์ด๋ฆ„ ์ˆœ์œผ๋กœ์˜ ์ •๋ ฌ์„ ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์„ค์ •์˜ ์ˆœ์„œ๋ฅผ ์ด๋ฆ„, ๋‚˜์ด๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋งŒ์•ฝ ๋‚˜์ด-์ด๋ฆ„์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•˜๋ฉด ๊ฐ ๋‚˜์ด ๋ณ„๋กœ ์ด๋ฆ„์„ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•œ๋‹ค. (๋‚˜์ด๋กœ ๊ทธ๋ฃจํ•‘์ด ๋˜๋Š” ์…ˆ) ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋‚ด๊ฐ€ ์ด๋ฆ„ ์ˆœ์„œ๋Œ€๋กœ ๋จผ์ € ์ •๋ ฌ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ๊ฒƒ์€ ์ด๋ฆ„์œผ๋กœ ๊ทธ๋ฃจํ•‘์„ ํ•˜๊ฒ ๋‹ค๋Š” ๊ฑด๋ฐ ๊ทธ๋ ‡๊ฒŒ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿด ๋• ์ด๋ฆ„-๋‚˜์ด ์ˆœ์œผ๋กœ ์ธ๋ฑ์Šค ์ง€์ •์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. 

db.users.createIndex({"age":1, "username":1}); 
db.users.find( {"age":21 }).sort({"username":1}): 
//๋‚˜์ด 21์„ธ๋ฅผ ์ฐพ์•„(๊ทธ๋ฃธ ๋‚˜์ด=21) ์ด๋ฆ„ ๋ณ„๋กœ ์ •๋ ฌ(์ด๋ฏธ index๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์„ ๊ฒƒ์ž„) 

db.users.find({"age": {"$gte":21, "$lte":30}}): 
//๋‚˜์ด๊ฐ€ 21-30์„ธ ์‚ฌ์ด์ธ ๋ฐ์ดํ„ฐ(21์„ธ๋ถ€ํ„ฐ 30์„ธ์‚ฌ์ด์˜ ๊ทธ๋ฃน), ๊ฐ ๊ทธ๋ฃน ๋‚ด์— ์ด๋ฆ„ ๋ณ„๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค. 

db.users.find({"age": {"$gte":21, "$lte":30}}).sort({"username":1}): 
//๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •๋ ฌ์ด ๋˜์ง€๋งŒ, ์ „์ฒด์ ์œผ๋กœ ๋ณด์•˜์„ ๋•Œ๋Š” ์ด๋ฆ„์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. 
//๋‹ค๋งŒ ๊ฐ ๋‚˜์ด ๊ทธ๋ฃน ์•ˆ์—์„œ๋Š” ์ธ๋ฑ์Šค๋กœ ์ธํ•ด ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

3๋ฒˆ ์งธ 4๋ฒˆ ์งธ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ : 21์„ธ๋ถ€ํ„ฐ 29์„ธ ์‚ฌ์ด์˜ ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฐ ๊ทธ๋ฃน์•ˆ์˜ ์ด๋ฆ„์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

์Šคํ‚ค๋งˆ ๋””์ž์ธ์„ ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒƒ์ด ๋ฌด์—‡์ด ์žˆ์„๊นŒ? NoSQL์€ ์Šคํ‚ค๋งˆ๋ฆฌ์Šค ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ผ๊ณ  ํ•œ ๋งˆ๋‹น์ด์ง€๋งŒ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๋ชจ๋ธ ์„ค๊ณ„ ๊ณผ์ •์€ ์ค‘์š”ํ•˜๋‹ค. NoSQL์—์„œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

1) ์ œํ•œ ์‚ฌํ•ญ: ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋‚˜ ํ•˜๋“œ์›จ์–ด์ ์ธ ์ œํ•œ๋“ค์ด ์žˆ๋Š”๊ฐ€? 

2) ์ ‘๊ทผ ํŒจํ„ด : ์ž‘์—…๋Ÿ‰์ด ์–ผ๋งˆ๋‚˜ ๋  ์ง€ ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ์„ ์ง€๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํŒจํ„ด์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.

3) ๊ด€๊ณ„ ์œ ํ˜•: ์ด๋Š” ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๋กœ ํ•„์š”๋กœ ํ•  ์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. ์ฝ๊ธฐ ์œ„์ฃผ์ธ์ง€ ์“ฐ๊ธฐ ์œ„์ฃผ์ธ ์ง€ ๋“ฑ์— ๋Œ€ํ•ด ์–ธ๊ธ‰๋  ๊ฒƒ์ด๋‹ค. 

4) ์นด๋””๋„๋ฆฌํ‹ฐ: SQL๊ณผ ๋งŒ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค๋Œ€๋‹ค, ๋‹ค๋Œ€์ผ ๋“ฑ์˜ ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•ด์•ผ ํ•œ๋‹ค. 

 

๋จผ์ € ์Šคํ‚ค๋งˆ ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ–ˆ๋‹ค. 

Bucket Pattern ์ด๋Š” ํƒ€์ž„์‹œ๋ฆฌ์ฆˆ ๋ฐ์ดํ„ฐ์— ์ ํ•ฉํ•˜๋‹ค. ๋ฒ„์ผ“ ํŒจํ„ด์˜ ๊ฒฝ์šฐ ์–ด๋–ค ๋„ํ๋จผํŠธ ํ•˜์— ๊ณ„์† ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋‹ค๊ฐ€ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘” ์–‘์„ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๋‹คํ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ณ„์† ์ €์žฅํ•˜๋„๋ก ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 1 ์‹œ๊ฐ„ ๋™์•ˆ ๋ฐœ์ƒํ•œ ์„ผ์„œ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•˜๋„๋ก ํ•˜๋Š” ๊ฒฝ์šฐ, 1์‹œ๊ฐ„ ๋‚ด์— ๋ฐœ์ƒํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ €์žฅ๋˜๋ฉด ์ƒˆ๋กœ์šด ๋„ํ๋จผํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋˜ ์ƒˆ๋กœ์šด 1์‹œ๊ฐ„๋™์•ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. 

Outlier Pattern ์–ด๋–ค ๋ฐ์ดํ„ฐ์— ๊ฐ‘์ž๊ธฐ ์ด์ƒ์น˜๋กœ ์ถ”์ •๋˜๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ ๋ณ„๊ฐœ์˜ ๋„ํ๋จผํŠธ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๋•Œ has_extras: true๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋  ๊ฒƒ์ด๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ๋ณ„๊ฐœ์˜ ๋„ํ๋จผํŠธ๋„ ํ™•์ธํ•ด์•ผ ๋œ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„์„œ ํŒ๋งค๋Ÿ‰์ด ๊ฐ ๋„์„œ๋งˆ๋‹ค ์ถ”๊ฐ€๋œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, 1000๋งŒ๊ถŒ์„ ๋„˜์–ด๊ฐ€๋Š” ๊ฐ’์„ ์ด์ƒ์น˜๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋„์„œํŒ๋งค๋Ÿ‰์ด ์ด์ƒ์น˜ ๊ฐ’์„ ๋„˜๋Š” ๊ฒฝ์šฐ ๋„์„œํŒ๋งค๋Ÿ‰์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ƒˆ๋กœ์šด ๋„ํ๋จผํŠธ๋กœ ๋ณ„๊ฐœ ์ €์žฅ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.  
Computed Pattern ๋‹ค๋ฅธ ํ•„๋“œ์˜ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ์–ป์–ด์ง€๋Š” ํ‰๊ท  ํ‰์  ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ๋งˆ๋‹ค ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ ๊ณ„์‚ฐ์„ ๋ฏธ๋ฆฌ ํ•ด๋†“๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ํŒจํ„ด์€ ๋ณดํ†ต ํ›„์ž์˜ ๊ฒฝ์šฐ์— ํ•ด๋‹น๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ›„๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋ณดํ†ต ํ›„๊ธฐ ์ž‘์„ฑ๋ฅ ์ด 0.1%๋ผ๊ณ  ํ–ˆ์„ ๋•Œ ๊ฐ ๋ฌผ๊ฑด์„ ์ฝ๋Š” ํšŸ์ˆ˜๊ฐ€ ํ›„๊ธฐ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํšŸ์ˆ˜๋ณด๋‹ค ๊ทน๋„๋กœ ํฌ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ ๋ฌผ๊ฑด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ๋งˆ๋‹ค ๊ณ„์‚ฐ์„ ํ•˜๋Š” ๊ฒƒ์ด ๊ณ„์‚ฐ ํšŸ์ˆ˜๊ฐ€ ํ›จ์”ฌ ํฌ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋ฐ˜๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ ์ „์ฒด ํ›„๊ธฐ์˜ ๊ฐฏ์ˆ˜์™€ ํ•ด๋‹น ๋ฌผํ’ˆ์˜ ํ›„๊ธฐ ์ดํ•ฉ์„ ๊ณ„์‚ฐํ•ด์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€์›ํ•˜๋Š” ๋ฌผ๊ฑด์˜ ํ‰๊ท ๊ฐ’๋งŒ ์ฝ์„ ๋•Œ (๋‘ ๊ฐœ๋งŒ ๋ถˆ๋Ÿฌ์„œ) ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค. 
Extended Referencing Pattern ์ž์ฃผ ์ฐธ์กฐํ•˜๋Š” ํ•„๋“œ์˜ ๋‚ด์šฉ๋งŒ ๋‚ด์žฌํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ์ปฌ๋ ‰์…˜์ด ์žˆ์„ ๋•Œ ์ฃผ๋ฌธํ•œ ๊ณ ๊ฐ์˜ ์ด๋ฆ„๊ณผ ์ฃผ์†Œ ์ •๋ณด๋ฅผ ๋งค๋ฒˆ ๊ณ ๊ฐ ์ปฌ๋ ‰์…˜์— ๊ฐ€์„œ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ๊ณ ๊ฐ ์ •๋ณด๋ฅผ ์ „๋ถ€ ๋ณต์‚ฌํ•ด์„œ ์ด์ค‘์œผ๋กœ ์ฃผ๋ฌธ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ• ๋Œ€์‹  ํ•„์š”ํ•œ ์ฃผ์†Œ์™€ ์ด๋ฆ„ ํ•„๋“œ๋งŒ ์ฃผ๋ฌธ ์ปฌ๋ ‰์…˜์— ์ถ”๊ฐ€๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋•Œ ์ด ์ฐธ์กฐ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋˜๋„๋ก์ด๋ฉด ์ž์ฃผ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ์šฉํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต๋  ์ˆ˜๋Š” ์žˆ์œผ๋‚˜ ๋งค๋ฒˆ ์ปฌ๋ ‰์…˜๋“ค์„ ์กฐ์ธํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. 
Approximation Pattern ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ํ•ด์•ผํ•  ๋•Œ, ๋งŒ์•ฝ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์ด ๊ทผ์‚ฌ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋˜์–ด๋„ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์—๋ฅผ ๋“ค์–ด์„œ ์ด ์›น์‚ฌ์ดํŠธ ์ ‘์†์ž ์ˆ˜ 900,000๊ณผ ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ. 900,001๊ณผ 900,000๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ 100 ์ •๋„(?), ํ˜น์€ ๋งค๋ฒˆ 1%์˜ ๊ฐ’์ด ์ƒ์Šนํ–ˆ์„ ๋•Œ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๊ฒฐ๊ณผ๊ฐ’์˜ ์ •ํ™•๋„๊ฐ€ ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์— ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. 

Normalization(Referencing-์™ธ๋ถ€ ์ฐธ์กฐ ๋ฌธ์„œ) vs Denormalization(Embedding- ๋‚ด์žฌ๋œ ๋ฌธ์„œ

SQL๊ณผ ๋‹ฌ๋ฆฌ ๋ชจ๋‘ ์ •๊ทœํ™”๋ฅผ ํ•˜์ง€ ์•Š๋Š” NoSQL์€ ์ •๊ทœํ™”๋ฅผ ํ•œ ๋ฌธ์„œ๋ฅผ ๋ ˆํผ๋Ÿฐ์Šค ๋ฌธ์„œ๋ผ๊ณ  ํ•˜๊ณ , ์ด๋Š” ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด์„œ ์ •์˜๋  ์ˆ˜ ์žˆ๋‹ค. ์ •๊ทœํ™”๊ฐ€ ์•ˆ๋œ ์ƒํƒœ๋กœ ํ•˜๋‚˜์˜ ๋ฌธ์„œ์— ๋‚ด์žฌ๋˜์–ด ๋ชจ๋‘ ๊ฐ™์ด ํ‘œํ˜„๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‚ด์žฌ๋œ ๋ฌธ์„œ๋ผ๊ณ  ํ•œ๋‹ค. ํ•˜๋‚˜์˜ ํ•„๋“œ ํ˜น์€ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํŠน์ง•์„ ์ •๋ฆฌํ•ด ๋‘” ํ‘œ์ด๋‹ค.

Embedding (๋‚ด์žฌ ๋ฌธ์„œ) Referencing  (์ฐธ์กฐ ๋ฌธ์„œ)
๋นจ๋ฆฌ ์ฝ๊ธฐ ๊ฐ€๋Šฅ (ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๋กœ ์›ํ•˜๋Š” ์ •๋ณด ๋ชจ๋‘ ์ทจ๋“๊ฐ€๋Šฅ)
๋ชจ๋‘ ํ•˜๋‚˜๋กœ ์ €์žฅํ•˜๋‹ˆ๊นŒ ์ถ”๊ฐ€ ๋ฌธ์„œ ์ˆ˜๊ฐ€ ์ ๋‹ค. 
๋ฐ์ดํ„ฐ ๋‚ด์šฉ์ด ์ž์ฃผ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๋•Œ ์œ ๋ฆฌ(์“ฐ๊ธฐ ๋Š๋ฆฌ๋ฏ€๋กœ)
eventual consistency ํ—ˆ์šฉ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ (ํ•ญ์ƒ ๋™๊ธฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ์‰ฝ์ง€์•Š์Œ)
๊ฐ ๋„ํ๋จผํŠธ๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„์€ ๋งŽ์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ์ถ”๊ฐ€๋˜์ง€์•Š์œผ๋ฏ€๋กœ ์กฐ๊ธˆ์”ฉ ํฌ๊ธฐ๊ฐ€ ์ปค์ง„๋‹ค. 
๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋ฅผ ์จ์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€์‹  ์‚ฌ์šฉํ•œ๋‹ค. 
๋นจ๋ฆฌ ์“ฐ๊ธฐ ๊ฐ€๋Šฅ (ํ•ด๋‹น ํ•„๋“œ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ) 
๋”ฐ๋กœ ๋–ผ์–ด๋‚ด์„œ ๋ฌธ์„œ๋กœ ์ €์žฅํ•ด์•ผ ํ•˜๋‹ˆ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฌธ์„œ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง„๋‹ค. 
์ž์ฃผ ๋ณ€๋™๋˜๋Š” ํœ˜๋ฐœ์„ฑ ๋ฐ์ดํ„ฐ์— ์šฉ์ด(์“ฐ๊ธฐ ๋น ๋ฅด๋‹ˆ๊นŒ)
์ฆ‰์‹œ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์ด ์š”๊ตฌ๋˜๋Š” ๊ฒฝ์šฐ
ํฌ๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋” ํฐ ํฌ๊ธฐ๋กœ ์ปค์ง„๋‹ค. 
๋ณดํ†ต ๊ฒฐ๊ณผ๋กœ๋ถ€ํ„ฐ ์ž์ฃผ ์ œ์™ธ๋˜๋Š” ๋ฐ์ดํ„ฐ(์ฝ์–ด๋‚ผ ํ•„์š”๊ฐ€ ๋ณ„๋กœ ์—†๋Š”)์˜ ๊ฒฝ์šฐ 

PyMongo

๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ํŒŒ์ด์ฌ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ ๋งŒํผ ํŒŒ์ด์ฌ์ด ํ˜ธํ™˜์„ฑ๋„ ์ข‹๊ณ  ํ™•์žฅ์„ฑ๋„ ์ข‹๋‹ค. 

MongoDB๋„ BSON(JSON์˜ ์ด์ง„๋ฒ• ํ˜•ํƒœ๋กœ ์“ฐ์ธ ์–ธ์–ด)๋ฅผ ์‚ฌ์šฉํ•ด์„œ Python์— ์—ฐ๊ฒฐํ•˜์—ฌ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ณ  PyMongo๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.  ์•„๋ž˜์™€ ๊ฐ™์ด Python ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉ์ž๋Š” JSON๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ค‘๊ฐ„์— Python app๊ณผ PyMongo driver ๊ฐ€ BSON ํ˜•ํƒœ๋กœ NoSQL๊ณผ ์†Œํ†ตํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๊ณผ์ •์ด๋‹ค. 

์‚ฌ์šฉ์ž ์ชฝ 
JSON ์‚ฌ์šฉ
(Python)
Python App 
&
PyMongo Driver
NoSQL
BSON ์‚ฌ์šฉ
(MongoDB)
python -m pip install pymongo
python -m pip install dnspython
// MongoDB Atlas๋ž‘ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด๊ฒƒ๋„ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. 

import pymongo
from pymongo import MongoClient

conn_str="mongodb+srv"://<username>:<password>@<cluster-name>.mongodb.net/myFristDatabase"
client = MongoClient(conn_str, serverSelectionTimeoutMs=5000)

try:
     print(client.server_info())
except Exception:
     print("Unable to connect to the server.")

 

๋ชฝ๊ณ  ๋””๋น„๋Š” ๊ทธ๋‹ค์ง€ ๋ถ€์ง€๋Ÿฐํ•˜์ง€ ์•Š๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฒซ ๋ฒˆ์งธ ๋‹คํ๋จผํŠธ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๊นŒ์ง€ ์–ด๋–ค ์ž‘์—…๋„ ์ง„ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ 3๊ฐœ์˜ ๋ช…๋ น์ด ๋™์‹œ์— ์‹œํ–‰๋œ๋‹ค. (๋”•์…”๋„ˆ๋ฆฌ ์Šคํƒ€์ผ; [ ] ํ˜น์€ ์†์„ฑ ์Šคํƒ€์ผ; db.objectname.fieldname ์ ‘๊ทผ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.) 

- ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ ์ปฌ๋ ‰์…˜ ์ƒ์„ฑ, ๋‹คํ๋จผํŠธ ์ž…๋ ฅ์ด ๋™์‹œ์— ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๋กœ ์ž‘์„ฑ๋œ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ปฌ๋ ‰์…˜ ์ด๋ฆ„ ๊ฐ™์€ ๊ฒƒ๋“ค์„  [ ] ์•ˆ์— ๋‹ด์•„์„œ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ˜๋ฉด(client["OnlineStore"]), ์†์„ฑ ํƒ€์ž…์€ client.OnlineStore๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค. 

##Dictionary-Style Access
myDB = client["OnlineStore"]
myCollection = myDB["phones.items"]

item_1={
"_id": "ewubkjdsk244",
"name": "iphone 13"}

myCollection.insert_one(item_1)
print(myCollection.inserted_id)   //๋ฐ์ดํ„ฐ ์ž…๋ ฅ ์—ฌ๋ถ€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ถœ๋ ฅ

#########################################
##Attribute-Style Access
myDB = client.OnlineStore
myCollection = myDB.phones.items

item_1={
"_id": "ewubkjdsk244",
"name": "iphone 13"}

myCollection.insert_one(item_1)
print(myCollection.inserted_id)

๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฑด ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

##Dictionary-Style Access
import pprint                        //JSON format์œผ๋กœ ์ถœ๋ ฅํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ•  
myCollection = myDB["phones.items"] 
user1_items=myCollection.find()     
for item in user1_items:
	pprint.pprtin(item)

#######################################
##Attribute-Style Access
import pprint
myCollection = myDB.phones.items
user1_items=myCollection.find()
for item in user1_items:
	pprint.pprtin(item)
//Python ํ˜•ํƒœ๋กœ ๊ฒฐ๊ณผ์™€ ๋ฌธ์ž์—ด์„ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. 
myCollection = myDB.laptops.items 
user2_items = myCollection.find() 
for item in user2_items: 
print( item2["item_name"] + " is in the " + item2["category"] + " category")

--> ๊ฒฐ๊ณผ์ ์œผ๋กœ 
Macbook Pro 2 is in the electronic category
//์—ฌ๋Ÿฌ๊ฐœ์˜ ๋‹คํ๋จผํŠธ ์ž…๋ ฅํ•˜๊ธฐ 
item_1 ={
	"_id": "hvjh399"
}

item_2 ={
	"_id": "hvjh400"
}

item_3 ={
	"_id": "hvjh401"
}


new_items=[item_1, item_2, item_3]  //item 1,2,3์„ ๋ฐฐ์—ด๊ฐ’์œผ๋กœ ์ €์žฅ 

////

myDB = client["OnlineStore"]        //๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ
myCollection= myDB["phones.items"]  //์ปฌ๋ ‰์…˜ ์ƒ์„ฑ
myCollection.insert_many(new_items) //์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹คํ๋จผํŠธ ํ•œ๋ฒˆ์— ์ž…๋ ฅ

Python์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์–‘ํ•œ ์‹œ๊ฐํ™”๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ €์ธ๋ฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒ๋‹ค์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค๋ค„๋ณธ๋‹ค. 

import pandas as pd                  //ํŒ๋‹ค์Šค
all_items = myCollection.find()      //all_items๋ผ๋Š” ๋ณ€์ˆ˜์— ๋งˆ์ด์ปฌ๋ ‰์…˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋‘ ์ถ”์ถœ
items_df = pd.DataFrame(all_items)   //ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์œผ๋กœ ๋ณ€ํ™˜ 
items_df                             //๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์œผ๋กœ ๋ฐ”๋€ ๊ฒฐ๊ณผ ์ถœ๋ ฅ

ํŒŒ์ด์ฌ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด ์ •๋„๋กœ ์ •๋ฆฌํ•œ๋‹ค. 

 

๋‹ค์Œ์€ ๋ถ„์‚ฐ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ณ ์ž ํ•œ๋‹ค(DDB). ๊ฐ€์žฅ ์ฒ˜์Œ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์–ธ๊ธ‰ํ•œ ์ ์ด ์žˆ๋Š” ์žˆ๋Š” ๋ฐ MongoDB๋Š” ํŒŒํ‹ฐ์…˜์ด๋ผ๋˜์ง€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ์ €์žฅ ์œ„์น˜๋‚˜ ์ €์žฅ ๋ฐฉ๋ฒ•์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋กœ ์ธํ•ด์„œ Partition tolerance๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ์„ค๋ช…ํ•˜์ž๋ฉด Partition tolerance๋Š” CAP theorem ์˜ ํ•œ ์š”์†Œ๋กœ์จ ํ•˜๋‚˜์˜ ํŒŒํ‹ฐ์…˜์ด๋‚˜ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์†์ƒ์ด ์™”๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ํ•ด๋‹น ์‚ฌ์‹ค์„ ์ธ์ง€ํ•˜์ง€ ๋ชป ํ•˜๋„๋ก ๋Œ€์ฑ…์ด ๋งˆ๋ จ๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋ฐ์ดํ„ฐ ์‹œ์Šคํ…œ์ด๋ผ๊ณ  ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ธฐ์ˆ ๋“ค์„ ํ•ฉ์ณ๋†“์€ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์‹ค์ œ๋กœ ๋‹ค์–‘ํ•œ ๊ธฐ์—…๋“ค์€ ํ•˜๋‚˜์˜ ํˆด๋งŒ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ ๋Š” ํ•œ๋‹ค. ์บ์‰ฌ๋‚˜ ์ธ๋ฑ์Šค ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ๊ฐ™์€ ๊ฒƒ๋“ค๋„ ๋ชจ๋‘ ๋™๊ธฐํ™”๋˜๋ฉฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ €์žฅ๋œ๋‹ค. API(Application programming interface)๋Š” ์ด๋Ÿฐ ๋’ค์—์„œ ์ผ์–ด๋‚˜๋Š” ๋ณต์žกํ•œ ์ž‘์—…๋“ค์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž์— ์‚ฌ์šฉ ํŽธ๋ฆฌํ•œ ํ™”๋ฉด๋งŒ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ API๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ค ์ž‘์—…์„ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค. 

1. In-memory cache: ๋จผ์ € ์บ์‰ฌ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ง€ ๋จผ์ € ํ™•์ธ ํ•œ๋‹ค. (๋งŒ์•ฝ์— ์ด๋ฏธ ์ฝ์–ด๋‘” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋˜ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํ›‘์„ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—)

2. Primary Database: ์บ์‰ฌ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด ์ฃผ์š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ผ๋‹จ ์“ฐ๊ธฐ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ด๋ฅผ ์ธ๋ฑ์Šค์— ๋ฐ˜์˜ํ•˜๊ณ  ์บ์‰ฌ ๋ฉ”๋ชจ๋ฆฌ์—๋„ ์ „๋‹ฌํ•œ๋‹ค. 

3. Full-text index: ์ธ๋ฑ์Šค ๋ฐ์ดํ„ฐ๋„ ๋”ฐ๋กœ ์ €์žฅ๋œ๋‹ค๊ณ  ํ–ˆ๋Š” ๋ฐ ์ด ์ธ๋ฑ์Šค ํŒŒ์ผ์„ ๋’ค์ ธ์„œ ํ˜น์‹œ ์ฐพ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋Š” ์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค. 

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

Martin Kleppmann, 2020

๋‹ค์Œ 3๊ฐ€์ง€ ์‚ฌํ•ญ์€ ๋ฐ์ดํ„ฐ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ๊ฐ€์ง€ ์ฅฌ์š” ์š”์†Œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์‹ ๋ขฐ์„ฑ์žˆ๊ณ  ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ๊ฒ ๋‹ค. 

Reliability Scalability Maintainability
* ์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ์ž‘๋™!
* ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ˆ˜ํ•ด๋„ ๋ฌธ์ œ ๋ฐœ์ƒ x
* ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์‚ฌ์šฉ์—๋งž๋Š” ์ถฉ๋ถ„ํ•œ ์„ฑ๋Šฅ
* ์ธ๊ฐ€๋˜์ง€ ์•Š์€ ์ ‘๊ทผ์ด๋‚˜ ์ž˜๋ชป ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ 
* ์ž‘์—…๋Ÿ‰ ๋Š˜์–ด๋‚˜๋„ ์ปค๋ฒ„ ๊ฐ€๋Šฅํ•œ ์„ฑ๋Šฅ
* ๋ถ€ํ•˜๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•œ ์ž‘์—…๋Ÿ‰ ์„ค๋ช…์ด ๊ฐ€๋Šฅ(์˜ˆ์ƒ ๋กœ๋“œ)
* Fan-out(์ฟผ๋ฆฌ ์ˆ˜ ํ™•์ธ)๋“ฑ์„ ํ†ตํ•œ ์ž‘์—…๋Ÿ‰ ์„ค๋ช… ๊ฐ€๋Šฅ 
* ์“ฐ๋ฃจํ’‹์„ ์ธก์ •ํ•œ ์„ฑ๋Šฅํ™•์ธ(๋ฐฐ์น˜๋ณ„ ์ฒ˜๋ฆฌ) ํ˜น์€  ๋ฐ˜์‘ ์‹œ๊ฐ„(online system)
* Operability: ๋ฌด๋‚œํ•˜๊ฒŒ ์ž˜ ์ž‘๋™๋˜๋„๋ก ์œ ์ง€ํ•˜๋Š” ๊ฒŒ ์–ด๋ ต์ง€ ์•Š์Œ 
* Simplicity: ์ƒˆ๋กœ์šด ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋ณด๊ธฐ์—๋„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š์Œ
* Evolvability: ์ˆ˜์ •ํ•˜๊ธฐ ๋„ˆ๋ฌด ์–ด๋ ต์ง€ ์•Š๊ณ  ์˜ˆ์ธกํ•˜์ง€ ๋ชปํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•ด์„œ ๋ณ€ํ™”๋ฅผ ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š์Œ 

 

๋‹ค์Œ ์งˆ๋ฌธ์€ ์ˆ˜์—… ์ค‘์— ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ๋ฐ˜์˜ํ•œ ์งˆ๋ฌธ์ด๋‹ค. ๊ฐ™์ด ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™๋‹ค. 

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

1. ํŒ”๋กœ์›Œ ํ…Œ์ด๋ธ”, ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ” ๊ทธ๋ฆฌ๊ณ  ํŠธ์œ— ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ณ„๊ฐœ๋กœ ๋งŒ๋“ค๊ณ  ๊ฐ ํ…Œ์ด๋ธ”์ด ํŒ”๋กœ์šฐ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด์„œ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•

2. ํŒฌ์•„์›ƒ(fan-out)๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ  ํŠธ์œ—์„ ๊ฐ ํŒ”๋กœ์›Œ๋“ค ๋งˆ๋‹ค 31M๊นŒ์ง€ ๋ฒ„์ผ€ํŒ…ํ•˜์—ฌ ์ €์žฅํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ด๋ฏธ ํŒ”๋กœ์›Œ๋ณ„๋กœ ํŠธ์œ— ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค ๋งŒ๋“ค์–ด๋‘” ์ƒํƒœ๋กœ ํŒ”๋กœ์›Œ๋“ค์€ ๋ณธ์ธ์˜ ํŠธ์œ—๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธ ํ•˜๋Š” ์…ˆ์ด๋‹ค. 

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

 

ํ™•์žฅ์„ฑ์€ NoSQL์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜์ด๋‹ค. SQL์˜ ๊ฒฝ์šฐ ์ˆ˜์ง ํ™•์žฅ๋งŒ ๊ฐ€๋Šฅํ–ˆ๊ณ  ์ˆ˜ํ‰ ํ™•์žฅ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ƒˆ๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ NoSQL์€ ์ˆ˜์ง, ์ˆ˜ํ‰ํ™•์žฅ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ์ดํ„ฐ ์ธก๋ฉด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ๋ฒ• ์ธก๋ฉด์—์„œ๋„ ์ ์šฉ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์ง ํ™•์žฅ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋” ์„ฑ๋Šฅ์ด ์ข‹์€ ํ•˜๋“œ์›จ์–ด๋ฅผ ๋„์ž…ํ•˜๋ฉฐ ์Šค์ผ€์ผ์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ๋ฐ, ์š”์ฆ˜์€ ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ์ˆ˜ํ‰์  ํ™•์žฅ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜๋“œ์›จ์–ด์— ๋ฐ์ดํ„ฐ ์ธ์Šคํ„ด์Šค๋“ค์„ ๋‚˜๋ˆ„์–ด์„œ ์ €์žฅํ•จ์œผ๋กœ ์ธํ•ด ๊ฐ ํ•˜๋“œ์›จ์–ด ๋ถ€๊ฐ€๋˜๋Š” ๋กœ๋“œ๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ณดํ†ต ์˜ˆ์ „ ์ˆ˜์ง์  ํ™•์žฅ์„ ์ ์šฉํ–ˆ์„ ๋•Œ๋Š” centralised database ๊ตฌ์กฐ์˜€์œผ๋ฉฐ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ผํ„ฐ์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ํ•„์š”ํ•œ ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ์ง€๋งŒ, ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ•˜๋“œ์›จ์–ด์˜ ์„ฑ๋Šฅ์„ ๋ˆ์ž„์—†์ด ๋†’์ด๋Š” ๋ฐ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๊ณ  ๋˜ํ•œ ๋งŒ์•ฝ ์ €์žฅ๋œ ๊ธฐ๊ณ„์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ ๋ฐ์ดํ„ฐ์— ์†์‹ค์ด ์˜ค๋Š” ๊ฒฝ์šฐ ๋ณต๊ตฌ์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. 

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

 

Replication(๋ณต์ œ)

๋‚ด ๊ฐœ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ๋„ ํ•ญ์ƒ ๋ณต์ œ๋ณธ์„ ๋‘๋Š” ๊ฒƒ์ด ๋‚˜๋Š” ์Šต๊ด€ํ™”๋˜์–ด ์žˆ๋‹ค. ํ•˜๋“œ์›จ์–ด์™€ ํด๋ผ์šฐ๋“œ์— ๋‚˜๋ˆ„์–ด ์ €์žฅํ•˜๊ณ  ๋ฒ„์ „์„ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋ณต์ œ๋ณธ์„ ๋‘์–ด ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด ๋„คํŠธ์›Œํฌ๋กœ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ๋Œ€์˜ ๊ธฐ๊ณ„์— ๋‚˜๋ˆ„์–ด ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ–ˆ์„ ๋•Œ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณต์ œ์˜ ์ด์ ์ด ๋ฐœ์ƒํ•œ๋‹ค.  1) ์ง€์—ญ๋ณ„๋กœ ์‚ฌ์šฉ์ž์™€ ๊ฐ€๊นŒ์šด ์œ„์น˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ณ  2) ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์šฉ์„ฑ์ด ๋†’์•„์ง€๊ณ (ํ˜น์‹œ๋‚˜ ํ•˜๋‚˜์˜ ๊ธฐ๊ณ„์—์„œ ์‹คํŒจํ•ด๋„ ๋ฐ”๋กœ ๋‹ค๋ฅธ ๊ธฐ๊ณ„๋กœ ์š”์ฒญํ•˜์—ฌ ๊ฒฐ๊ณผ ์ „๋‹ฌ) ๋˜ 3) ์ฝ๊ธฐ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค. (์›๋ž˜๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๊ณ„์—์„œ ์ „ ์„ธ๊ณ„์ธ์˜ ์ฝ๊ธฐ ์“ฐ๊ธฐ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค๊ฐ€, ์ด์ œ๋Š” ๊ฐ ๋‚˜๋ผ๋ณ„๋กœ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋”ฐ๋กœ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด, ์™œ ๋‹น์—ฐํžˆ ์†๋„์˜ ํ–ฅ์ƒ์ด ์žˆ์„ ์ˆ˜ ๋ฐ–์— ์—†๋Š” ์ง€ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ ๊ฐ™๋‹ค)

๋ณต์ œ ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.  1) Single Leader : ๋ฆฌ๋” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์ด๋ฉฐ ๋ฆฌ๋”, ๋งˆ์Šคํ„ฐ ํ˜น์€ ํ”„๋ผ์ด๋จธ๋ฆฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋ณดํ†ต์€ ๋ฆฌ๋” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์“ฐ๊ธฐ(๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ, ์ˆ˜์ •)์— ์“ฐ์ด๊ณ  ๋‚˜๋จธ์ง€ ํŒ”๋กœ์›Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(์„ธ์ปจ๋”๋ฆฌ, hot standby, slave, read replica)๋“ค์€ ์ฝ๊ธฐ์— ์“ฐ์ธ๋‹ค.  2) Multi-Leader : ๋ฆฌ๋”๊ฐ€ ์—ฌ๋Ÿฟ ์žˆ๋Š” ๊ฒฝ์šฐ์ด๋‹ค.  3) Leaderless: ๋ฆฌ๋” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์—†์ด ๋ชจ๋‘ ํ‰๋“ฑํ•œ ๊ฒฝ์šฐ-2,3์€ ์•„๋ž˜์— ๋‚ด์šฉ ์ถ”๊ฐ€ 

๋ณต์ œ์˜ ๊ณผ์ •์€ 1) ๋ณต์ œ๋ณธ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฆฌ๋”๋กœ ์„ ์ • 2) ๋‹ค๋ฅธ ๋ณต์ œ๋ณธ๋“ค์€ ํŒ”๋กœ์›Œ 3) ์ฝ๋Š” ๊ฑด ๋ฆฌ๋”๋‚˜ ํŒ”๋กœ์›Œ์—์†Œ ๋ชจ๋‘ ๊ฐ€๋Šฅ(์ œ์•ฝ ์–ด๋–ป๊ฒŒ ํ•˜๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค) 

๋™๊ธฐํ™” ๋ณต์ œ์™€ ๋น„๋™๊ธฐํ™” ๋ณต์ œ๋กœ ๋‚˜๋ˆ ์–ด ์ง€๋Š” ๋ฐ ๋™๊ธฐํ™” ๋ณต์ œ(Synchronous)์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ญ์ƒ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ์— ํŒ”๋กœ์›Œ(์„ธ์ปจ๋”๋ฆฌ) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋Œ€ํ•˜์—ฌ ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์ด ์•ˆ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋น„๋™๊ธฐํ™” ๋ณต์ œ(Asynchronous)์˜ ๊ฒฝ์šฐ๋Š” ์ผ๊ด€์„ฑ์ด ํ•ญ์ƒ ์œ ์ง€๋˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ชจ๋‘ ๋ฐ˜์˜๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ๊ฐ ์ž‘๋™ํ•˜๊ธฐ์— ํ•˜๋‚˜์˜ ์ž‘์—…์ด ๋‹ค๋ฅธ ์ž‘์—…์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ž‘๋™์ด ์ •์ƒ์ ์œผ๋กœ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ์‹œ์ ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. 

๋น„๋™๊ธฐํ™” ๋ณต์ œ์˜ ๊ฒจ์šฐ replocation lag ๋ผ๋Š” ์ƒํ™ฉ์„ ๊ฒผ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ ์ด๋Š” ๋ฆฌ๋” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๊ฐ€ ์ˆ˜์ •๋˜๊ณ  ๋‚˜๋จธ์ง€ ํŒ”๋กœ์›Œ ๋ณต์ œ๋ณธ ๋“ค์— ์ˆ˜์ •์ด ๋ฐ˜์˜๋˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ง€์—ฐ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ๋ฐ์ดํ„ฐ๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ ์‚ฌํ•ญ์—๋„ ๊ทธ ํ•ด๊ฒฐ์ฑ…์ด ๊ฐ™์ด ์ œ์‹œ๋˜์–ด ์žˆ๋‹ค. ๋ณต์ œ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•  ๋•Œ์— ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋กœ Node Outage์˜ ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋…ธ๋“œ๋ผ๊ณ  ํ•˜๋ฉด ๊ฐ ๋ณต์ œ๋ณธ์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ณณ์„ ์˜๋ฏธํ•œ๋‹ค. ๋งŒ์•ฝ ํŒ”๋กœ์›Œ(์„ธ์ปจ๋”๋ฆฌ)๋ณต์ œ๋ณธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” "catchup recovery" ์ „๋žต์œผ๋กœ ๋ณต๊ตฌํ•œ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋™์•ˆ ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ๊ฒƒ๋“ค์ด ๋ฐ˜์˜๋˜์–ด ์ตœ์ข…์ ์œผ๋กœ ์ผ๊ด€์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋งŒ์•ฝ ๋ฆฌ๋” ๋ณต์ œ๋ณธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋Š” "failover"(์žฅ์• ์กฐ์น˜)๋ผ๊ณ  ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทน๋ณตํ•œ๋‹ค. 1) ๋ฆฌ๋”์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ํŒ๋‹จ 2) ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋ฅผ ๋‹ค๋ฅธ ๋ณต์ œ๋ณธ ์ค‘์—์„œ ์„ ์ •ํ•œ๋‹ค(ํˆฌํ‘œ๊ณผ์ •์„ ๊ฑฐ์นจ) 3) ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋ฅผ ์ธ์ง€ ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.  

Replication Lag์˜ ๋ฌธ์ œ ์‚ฌํ•ญ์„ ์กฐ๊ธˆ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค. 

1. ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ƒํ™ฉ(Reading stale data solution)์˜ ํ•ด๊ฒฐ์ฑ… : ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๊ณณ์—์„œ ์ฝ์–ด์˜จ๋‹ค. (๋‹ค๋ฅธ ๋ณต์ œ๋ณธ๋“ค์€ ์•„์ง ๋‹ค ์—…๋ฐ์ดํŠธ ์•ˆ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ) ๊ทธ๋ž˜์„œ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋ชจ๋‘ ๋ฆฌ๋”๋กœ ๋ถ€ํ„ฐ ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋น„๋™๊ธฐํ™”๋ณต์ œ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ณต์ œ๋ณธ๋“ค์ด ๋ชจ๋‘ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ฐ ์กฐ๊ธˆ ์ง€์—ฐ์ด ์žˆ์„์ˆ˜ ์žˆ๋‹ค. 

2. ๊ณผ๊ฑฐ๋กœ ๊ฐ€๋Š” ์‹œ๊ฐ„์—ฌํ–‰(Backward Time travel) ํ•ด๊ฒฐ์ฑ…: ๋‹จ์กฐ์  ์ฝ๊ธฐ ๋ฐฉ๋ฒ•, ๊ฐ ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ์ง€์ •๋œ ๋ณต์ œ๋ณธ์—์„œ๋งŒ ์ฝ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (๋งค๋ฒˆ ๋‹ค๋ฅธ ๋ณต์‚ฌ๋ณธ์—์„œ ์ฝ์–ด์˜ค๋„๋ก ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹จ) ์‚ฌ์šฉ์ž A๋Š” ๋ณต์ œ๋ณธ 1์—์„œ๋งŒ, ์‚ฌ์šฉ์ž B๋Š” ๋ณต์ œ๋ณธ 2์—์„œ๋งŒ ์ฝ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐ ๋ณต์ œ๋ณธ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ์˜ ์ˆ˜์ •์ด ๋ฐ˜์˜๋˜๋Š” ์‹œ์ ์ด ์กฐ๊ธˆ์”ฉ ์ƒ์ดํ•˜๋‹ˆ๊นŒ. 

3) ๊ด€์ฐฐ์ž๋ฐ์ž๋ทฐ(Observer Dejavu) ํ•ด๊ฒฐ์ฑ…: ์ผ๊ด€๋œ ์ ‘๋‘์‚ฌ ์ฝ๊ธฐ, ๊ด€์ฐฐ์ž(์ œ 3์ž์˜ ์‚ฌ์šฉ์ž -์ˆ˜์ • ์•ˆํ•˜๊ณ  ์ฝ๊ธฐ๋งŒ ํ•˜๋Š”)์˜ ๊ฒฝ์šฐ ๋‚˜์ค‘์— ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ฝ๊ฒŒ ๋˜๋Š” ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ค๋˜๋„๋ก ํ•˜๊ณ  ํ•ญ์ƒ ์ผ๊ด€๋œ ์ ‘๋‘์‚ฌ๋งŒ ๋ณด์ด๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ™์€ ํŒŒํ‹ฐ์…˜์— ์ €์žฅ๋˜๋„๋ก ํ•œ๋‹ค. 

 

์‹ค์ œ๋กœ ๋ณต์ œ๋ณธ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ ์™ธ์—๋„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ๊ฐ๊ฐ ๋ฆฌ๋” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‘๋Š” multi-leader ๋ณต์ œ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ, ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๋‚ด์„ฑ(๋ฐ์ดํ„ฐ์„ผํ„ฐ์— ์‚ฌ๊ณ ๋‚˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ๋ฌธ์ œ ์ƒ๊ฒจ๋„ ์ปค๋ฒ„ ๊ฐ€๋Šฅ), ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ์•ฝ์— ์˜คํ”„๋ผ์ธ๋ฐ์ดํ„ฐ(๋‹ฌ๋ ฅ)๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ฝœ๋ผ๋ณด๋ ˆ์…˜ ํŽธ์ง‘ ์ž‘์—…์„ ํ•  ๋•Œ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. 

ํ•˜์ง€๋งŒ ๋ฆฌ๋”๊ฐ€ ๋‘˜์ด๋‹ค๋ณด๋‹ˆ ์ˆ˜์ •์ž‘์—…์„ ํ•˜๋Š” ๋ฐ  ๊ฐˆ๋“ฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.(Write Conflicts) ๊ทธ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 5๊ฐ€์ง€๋กœ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. 1) ๊ฐˆ๋“ฑ์„ ํƒ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋™๊ธฐ์‹์œผ๋กœ ๋งŒ๋“ ๋‹ค. 2) ํŠน์ • ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ๋Š” ๋ชจ๋‘ ๊ฐ™์€ ๋ฆฌ๋”๋ฅผ ํ†ตํ•ด์„œ ๋˜๋„๋ก ์ง€์ • ํ•œ๋‹ค. 3) ๊ฐ ์“ฐ๊ธฐ ์ž‘์—…์— ์œ ๋‹ˆํฌํ•œ ์•„์ด๋””๋ฅผ ์ง€๊ธ‰ํ•˜๊ณ  ๋” ์ตœ์‹ ์— ์“ฐ์ธ ๊ฒƒ์ด ํ•ญ์ƒ ์„ ํƒ๋˜๋„๋ก ํ•œ๋‹ค. 4) ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ณด์กดํ•˜๋Š” ๋ช…์‹œ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์ถฉ๋Œ์„ ๊ธฐ๋กํ•œ๋‹ค. 5) ๋จผ์ € ๊ฐˆ๋“ฑ์ด ๋˜๋Š” ๊ฑธ ๋‘˜ ๋‹ค ์ €์žฅํ•ด๋’€๋‹ค๊ฐ€ ๋‚˜์ค‘์— ์ž๋™์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •ํ•˜๋„๋ก ํ•œ๋‹ค. 

Leaderless replication ์€ ์ฟผ๋กฌ ์ฝ๊ธฐ ์“ฐ๊ธฐ๋ฅผ ํ•œ๋‹ค.  ์ฝ๊ธฐ ์ˆ˜์ •(์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ). ์•ˆํ‹ฐ ์•ˆํŠธ๋กœํ”ผ ๊ณผ์ •(์ผ๋ถ€ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ ์ž์ฃผ ์ฝํžˆ์ง€ ์•Š๊ณ  ์ €์žฅ๋งŒ ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์†์‹ค๋  ์ˆ˜๋„ ์žˆ๋‹ค).  ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ ๋ฆฌ๋”์— ์“ฐ๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด Acknowledge ๋ผ๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐ, ์ด ๊ฒฝ์šฐ์—” ๋ฐ์ดํ„ฐ์˜ n./2+1์˜ ๋…ธ๋“œ๊ฐ€ ๋ชจ๋‘ ๋ฐ˜์˜๋˜์•ผ์ง€๋งŒ ok์‚ฌ์ธ์„ ๋ณด๋‚ธ๋‹ค. ์ฆ‰ 5๊ฐœ ์ค‘ 3๊ฐœ ์ด์ƒ์˜ ๋ณต์ œ๋ณธ์—์„œ read ์š”์ฒญ์— ๋Œ€ํ•œ ๋ฐ˜์‘์„ ๋ณด๋‚ด๊ฑฐ๋‚˜, write ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ํ™•์ธ์ด ์™€์•ผ์ง€๋งŒ ์ž‘์—…์ด ๋œ๋‹ค๋Š” ์›๋ฆฌ์ด๋‹ค. 

 

๋‹ค์Œ์œผ๋กœ ๋ณต์ œ๋งŒํผ ์ค‘์š”ํ•œ ํŒŒํ‹ฐ์…˜(๋ชฝ๊ณ ๋””๋น„์—์„œ๋Š” ์ƒค๋”ฉ์ด๋ผ๊ณ  ์นญํ•œ๋‹ค)๋ฅผ ๋‹ค๋ค„๋ณด๊ฒ ๋‹ค. 

Partitioning(Sharding) ์€ ๋ง ๊ทธ๋Œ€๋กœ ๊ตฌ๊ฐ„์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋ณดํ†ต ๋ณต์ œ๋ณธ์„ ๋งŒ๋“ค๊ณ  ๋˜ ์ƒค๋”ฉ๋„ ๊ฐ™์ด ํ•˜์—ฌ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ์ƒค๋”ฉ์„ ํ•จ์œผ๋กœ ์ธํ•œ ์ข‹์€ ์ ์€ ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•ด ์‹คํŒจ๋‚ด์„ฑ์ด ์ƒ๊ธด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (ํ•˜๋‚˜์˜ ๋ณต์ œ๋ณธ์—์„œ ์‹คํŒจํ•ด๋„ ๋‹ค๋ฅธ ํŒŒํ‹ฐ์…˜์— ์ €์žฅ๋œ ๋ณต์ œ๋ณธ์„ ์ฐธ์กฐํ•˜๋ฉด ๋จ) ํŒŒํ‹ฐ์…˜์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ key range ๋ฐฉ๋ฒ•๊ณผ hash of key๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. key range ๋ฐฉ๋ฒ•์€ ๋ง ๊ทธ๋ž˜๋„ ํ‚ค์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ํŠน์ • ๋ฒ”์œ„ ๋ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ  hash of key ๋Š” ํ•ด์‰ฌํƒœ๊ทธ๋กœ ํ‚ค์˜ ๋ฒ”์œ„๋ฅผ ์ž„์˜๋กœ ์„ค์ •ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. range ๋ณ„๋กœ ์„œ์ •ํ•˜๋Š” ๊ฒฝ์šฐ ํ•œ ์˜์—ญ์œผ๋กœ์˜ ์น˜์šฐ์นจ ํ˜น์€ ๋ชฐ๋ฆผ ํ˜„์ƒ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— hash of key ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฆ„์„ ์„ฑ์”จ๋ณ„๋กœ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ ๊ทน๋„๋กœ ๊น€์”จ, ๋ฐ•์”จ, ์ด์”จ ๋“ฑ์— ๋ชฐ๋ฆด ๊ฒƒ์ด๊ณ  ๋ฐ˜๋ฉด ํ™ฉ๋ณด์”จ์—๋Š” ์ ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋  ๊ฒƒ์ด๋‹ค) ๋‹จ, ์ฟผ๋ฆฌ๋ฅผ ์งค ๋•Œ ๋ฒ”์œ„๋ณ„๋กœ ํšจ๊ณผ์ ์œผ๋กœ ์งœ๋Š” ๊ฒƒ์€ ์–ด๋ ค์›Œ์ง„๋‹ค.( ์ž„์˜ ๋ฒ”์œ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž„์˜๋กœ ๋ชจ๋‘ ์ง€์ •ํ•ด์ค˜์•ผ ํ•จ ) 

 

Rebalancing. ๊ณ„์† ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์ฟผ๋ฆฌ ์“ฐ๋ฃจํ’‹(์ฒ˜๋ฆฌ๋Ÿ‰)์ด ์ฆ๊ฐ€ํ•˜์—ฌ ๋” ๋งŽ์€ CPU๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๊ณ  ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ์„œ ๋” ๋งŽ์€ ๋””์Šคํฌ์™€ ๋žฉ์ด ํ•„์š”ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ฉฐ ๋งŒ์•ฝ ํŠน์ • ํ•˜๋“œ์›จ์–ด์— ์‹คํŒจ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด๊ฐ€ ํ•ด๋‹น ์—ญํ• ์„ ๋– ๋งก๋Š” ์ผ์ด ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋“ค์— ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ๊ณตํ‰ํ•˜๊ฒŒ ์ž˜ ๋‚˜๋ˆ ์„œ ์ €์žฅ๋˜๊ณ  ์‹œ์Šคํ…œ์ด ๋‹ค์šด๋˜๋Š” ์ผ์ด ์—†๋„๋ก ํ•˜๊ธธ ์›ํ•œ๋‹ค. ์ด์— Rebalancing ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ ๊ทธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํŒŒํ‹ฐ์…˜์˜ ์ˆซ์ž๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ์กด์— 4๊ฐœ์˜ ๋…ธ๋“œ์— 5๊ฐœ์˜ ํŒŒํ‹ฐ์…˜๋“ค์ด ์ €์žฅ๋˜์–ด ์žˆ์—ˆ๋‹ค๋ฉด ์ด๋ฅผ 5๊ฐœ์˜ ๋…ธ๋“œ์— 4๊ฐœ์˜ ํŒŒํ‹ฐ์…˜๋งŒ ์ €์žฅํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์žฌ๋ถ„์‚ฐํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

Request Routing. ๊ทธ ๋ฐ–์—๋„ ์‚ฌ์šฉ์ž๊ฐ€ ๋…ธ๋“œ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์ฐจ์ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค. 1) ์‚ฌ์šฉ์ž๊ฐ€ ๋žœ๋ค์œผ๋กœ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ , ์„ ํƒ๋œ ๋…ธ๋“œ๊ฐ€ ํ•ด๋‹น๋˜๋Š” ๋…ธ๋“œ์˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•(๋…ธ๋“œ๊ฐ€ ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ์Œ) 2) ์‚ฌ์šฉ์ž๊ฐ€ rounting tier์— ๋ชจ๋“  ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ํ•ด๋‹น routing tier์—์„œ ํ•ด๋‹น๋˜๋Š” ๋…ธ๋“œ๋กœ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•(๋ผ์šฐํ„ฐ๊ฐ€ ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ์Œ) 3) ๊ณ ๊ฐ์ด ์–ด๋–ค ํŒŒํ‹ฐ์…˜์— ์–ด๋–ค ๋…ธ๋“œ์ธ์ง€ ์•Œ๊ณ  ํ•ด๋‹น ๋…ธ๋“œ์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.(๊ณ ๊ฐ์ด ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ์Œ)

Martin Kleppmann (2020)

 

๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง (RDBMS vs MongoDB) 

์ „ํ†ต์  ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ฟผ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์—ญํ• ์„ ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์‚ฌํ•ญ์ด ์žˆ๋‹ค. ;  ํ•˜๋‚˜์˜ ์ •ํ™•ํ•œ ํ•ด๊ฒฐ์ฑ…/ ์ˆ˜์ •x, ์ค‘๋ณต x, ์‚ฌ์šฉํ•˜๋ฉด์„œ ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ ๋ณ€ํ™”๊ฐ€ ํ•„์š”->์„ฑ๋Šฅ์ €ํ•˜

 

๊ทธ๋ ‡๋‹ค๋ฉด MongoDB์˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์ˆœ์„œ๋ฅผ ์‚ดํŽด๋ณด์ž

1) ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์ •์˜ํ•œ๋‹ค. 2) ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์žฌ์ •์˜ํ•œ๋‹ค 3) ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐœ์ „์‹œํ‚จ๋‹ค 4) ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋ฐœ์ „์‹œํ‚จ๋‹ค 5) 3-4๋ฒˆ์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋” ๋‚˜์€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ์„ ํ•œ๋‹ค. 

์ด๋Ÿฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์ด ์žˆ๋‹ค ; ๋‹ค์ค‘์˜ ๋””์ž์ธ ์„ ํƒ๊ถŒ์ด ์žˆ๊ณ  ์‚ฌ์šฉํŒจํ„ด์— ๋”ฐ๋กœ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋””์ž์ธ ๊ฐœ์„ ์ด ์‰ฝ๊ณ  ์ง๊ด€์ ์ด๋‹ค(์‹œ์Šคํ…œ ๋‹ค์šด ์—†์ด ๊ฐ€๋Šฅ) 

โ€ป๊ณ ๋ คํ•  ์‚ฌํ•ญ: ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ๊ณ„์—์„œ ์ •์˜๋œ๋‹ค. ๋””์ž์ธ์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜๋ช…์— ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์ด๊ณ , ์•ฑ์˜ ๋ฐ์ดํ„ฐ ํ•„์š” ๋ฐ ์ผ๊ธฐ ์“ฐ๊ธฐ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. 

 

๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋ฐฉ๋ฒ• - MongoDB

1) ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์—…๋Ÿ‰์„ ํ‰๊ฐ€ํ•œ๋‹ค.

2) ์—”ํ‹ฐํ‹ฐ๋ž‘ ๊ทธ ๊ด€๊ณ„๋ฅผ ํ™•์ธํ•œ๋‹ค

3) ๊ฐ ์ปฌ๋ Œ์…˜๋ณ„๋กœ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋งˆ๋ฌด๋ฆฌ ์ง“๋Š”๋‹ค. 

Evaluate Application workload 
Map out entities and their relationships Finalize data model for each collection  Outcome
- by a business domain expert
- ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€๊ฐ€ ํ•ด์•ผํ•จ!
- consider the current, predicted and future scenarios
- ํ˜„์žฌ ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜์— ์–ด๋–ป๊ฒŒ ๋  ์ง€๋ฅผ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์„œ
- consider production logs and matrix
- ์ƒ์‚ฐ๊ธฐ๋ก๊ณผ ๋งคํŠธ๋ฆญ์Šค ๊ฐ™์€ ๊ฑธ ๋ชจ๋‘ ๊ณ ๋ คํ•˜์—ฌ 
- consider the data size 
- ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋„ ๊ณ ๋ คํ•˜๊ธฐ
- consider the operations lists ranked by importance(speed, accuracy, etc)
- ์†๋„๋‚˜ ์ •ํ™•๋„์™€ ๊ฐ™์€ ์ž‘์—… ๋ชฉ๋ก์˜ ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•˜๊ธฐ
- Link or Embedded? 
(by Collection Relationship Diagram- CRD)
- ์ฐธ์กฐ๋กœ ํ•  ๊ฑด์ง€ ๋‚ด์žฌํ•˜๋Š” ๊ฑฐ๋กœ ํ• ๊ฑด์ง€ 
- considering data size
-๋ฐ์ดํ„ฐ ํฌ๊ธฐ ๊ณ ๋ คํ•ด์„œ
- considering database queries and indexes
- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ž‘ ์ธ๋ฑ์Šค ๊ณ ๋ คํ•ด์„œ
- considering current operations and assumptions
- ํ˜„์žฌ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ž‘์—…๋“ค๊ณผ ๊ฐ€์ •๋“ค์„ ๊ณ ๋ คํ•ด์„œ
- identify and apply relevant design patterns
- ๊ด€๋ จ๋œ ๋””์ž์ธ ํŒจํ„ด์„ ์ •์˜ํ•˜๊ณ  ์ ์šฉํ•ด์„œ 
- Data size 
- ๋ฐ์ดํ„ฐ ํฌ๊ธฐ
- Collection with fields and shapes 
- ์ปฌ๋ ‰์…˜ ํ•„๋“œ์™€ ๊ตฌ์กฐ
- queries and index
- ์ฟผ๋ฆฌ๋“ค๊ณผ ์ธ๋ฑ์Šค
- assumptions and future/growth projections
-๊ฐ€์ •๋“ค, ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜ ์„ฑ์žฅ ์˜ˆ์ธก
** Operations?
** Cardinality?
** How often the embedded info be accessed?
๋‚ด์žฌ๋œ ๋ฌธ์„œ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ฐพ์•„ ์“ธ๊ฑด๊ฐ€
** embedded info changes often?
๋‚ด์žฌ๋œ ๋ฌธ์„œ์— ์ •๋ณด๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ณ€๊ฒฝํ•  ๊ฑด๊ฐ€
** queries used embedded data?
๋‚ด์žฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌ์— ์ด์šฉํ•  ๊ฑด๊ฐ€?
** embedded data to be used together?
๋‚ด์žฌ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌธ์„œ์˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์ด ์“ฐ์ผ ๊ฒƒ์ธ๊ฐ€?
** Schema versioning
์Šคํ‚ค๋งˆ ๋ฒ„์ „ ํ™œ์šฉ
** Bucket Pattern
๋ฒ„์ผ“ ํŒจํ„ด
** Computed pattern
๊ณ„์‚ฐ๋œ ํŒจํ„ด

๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒƒ ์ค‘์— ์Šคํ‚ค๋งˆ ๋ฒ„์ €๋‹์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. ์ด๋Š” ์Šคํ‚ค๋งˆ์— ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์—ฌ์„œ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์•Œ๋‹ค์‹œํ”ผ ๋ชฝ๊ณ ๋””๋น„๋Š” ์Šคํ‚ค๋งˆ๋ฆฌ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„์— ์–ธ์ œ๋“  ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. (์ถ”๊ฐ€ ์—ด์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค) ์ด๋Ÿด ๋•Œ ์Šคํ‚ค๋งˆ๋ฅผ ๊ณ„์† ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹  ์ƒˆ๋กœ์šด ์Šคํ‚ค๋งˆ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋Š” ์ค‘๋ณต์œผ๋กœ ์ ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ํ•„๋“œ๋“ค๋งŒ ๋ฒ„์ „ ๋ฒˆํ˜ธ์™€ ํ•จ๊ป˜ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ธฐ์กด์— _id, name, mobile, work_phone์œผ๋กœ๋งŒ ๋˜์–ด ์žˆ๋˜ ์Šคํ‚ค๋งˆ์—์„œ(๋ฒ„์ „ 1.0) ์— ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์ธ _id, name, contacts [ ]์˜ ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ์ด ๋•Œ schema_version:2.0์œผ๋กœ ํ‘œ๊ธฐํ•˜๊ณ  ์ˆ˜์ •๋œ ํ•„๋“œ๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ๋ชฝ๊ณ ๋””๋น„ ๊ณต์‹ธ ์œ ํŠœ๋ธŒ์—์„œ ๊ต‰์žฅํ•œ ๊ฐ•์˜๋ฅผ ๋“ค์„ ์ˆ˜ ์žˆ๋‹ค. 

๋‹ค์Œ์œผ๋กœ ๋ฒ„ํ‚ท ํŒจํ„ด๊ณผ ์ปดํ“จํ‹ฐ๋“œ ํŒจํ„ด์€ ์ด๋ฏธ ์•ž์„œ ์„ค๋ช…ํ•œ ๋ฐ”์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์„ค๋ช…ํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ ์‹ถ์ง€๋งŒ ์‚ฌ์‹ค ๊ทธ๋งŒํผ ์ค‘์š”ํ•˜๊ธด ํ•˜๋‹ค. 

๋ฒ„ํ‚ท ํŒจํ„ด์€ ์ธ๋ฑ์Šค์˜ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ด๊ณ , ๊ด€๋ จ ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋†’์—ฌ์ค€๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ 'valcount'๊ฐ€ 200์— ๋„๋‹ฌํ•˜๋ฉด ์ƒˆ ๋ฌธ์„œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ƒˆ ๋ฌธ์„œ์— ์ €์žฅ๋˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. 

computed pattern ์€ ๋ฌธ์„œ์—์„œ ๋งค๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์„ ๋•Œ๋งˆ๋‹ค ๊ณ„์† ๊ณ„์‚ฐํ•˜๋Š” ๋Œ€์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ ์ด ์ˆ˜์™€ ์ˆ˜๋Ÿ‰(์š”์•ฝ๊ธฐ๋ก)์„ ๋‚จ๊ฒจ๋‘๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•œ๋‹ค. ์“ฐ๊ธฐ์— ๋Œ€ํ•œ ๊ณ„์‚ฐ์€ ์ฝ๊ธฐ์— ๋Œ€ํ•œ ๊ณ„์‚ฐ๋ณด๋‹ค ๋น ๋ฅด๋‹ค. ์ผ์ข…์˜ ์บ์‹ฑ ํŒจํ„ด์˜ ์ข…๋ฅ˜๋ผ๊ณ  ํ•œ๋‹ค.

 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์Šคํ…œ (Database Application system)

# 3-Tier Architecture (3์ธต ๊ตฌ์กฐ)

์•„๋ž˜์™€ ๊ฐ™์ด 3๊ฐœ์˜ ์ธต์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. 

Client(์‚ฌ์šฉ์ž ์ธต): ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์„ ๋‹ค๋ฃฌ๋‹ค.  GUI, Web interface, display of info [i.e. HTML, CSS, JS]
Application server or Web server(์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„/์›น์„œ๋ฒ„): ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ˜„ํ•œ๋‹ค. Application programs, web pages - stores biz rules, implement logic [i.e. divided by NodeJS, Python, Java, PHP, C; host language + SQL, NoSQL;  Data sub-language]
Database server(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ถ€ํ„ฐ ์‹คํ–‰ํ•œ๋‹ค. Database Management System - hosts DBMS (accept and process queries and commands) [i.e. MySQL, MongoDB]

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ™”ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋Š” SQL/NoSQL ๋ช…๋ น ์‹คํ–‰์„ ์œ„ํ•ด์„œ ๋ชจ๋‹ˆํ„ฐ์— ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

๋Œ€ํ™”ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ํŒŒ์ผ๋“ค์€ Oracle RDBMS ์—์„œ @<fillename> ํ˜น์€ PHPMyAdim์—์„œ "import tool"๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ด์šฉํ•ด์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€(์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋žจ)์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉ์ž๊ฐ€ ์ฟผ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ ํŠธ๋žœ์ ์…˜ ์ž‘์—…๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ํŠธ๋žœ์ ์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์›น ์ธํ„ฐํŽ˜์ด์Šค๋กœ์จ ์‹œํ–‰๋œ๋‹ค. (ํ•ญ๊ณต์‚ฌ ์˜ˆ์•ฝ)

  • Interactive interface: interface where SQL/NoSQL commands can be typed directly into a monitor for execution
  • Execute file of command: file created through an interactive interface (import tool; PHPMyAdmin, typing @<filename> in oracle)
  • Application program: used as canned transactions by end users to query DB or execute transactions on DB (making airline reservations)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ƒํ˜ธ ์ž‘์šฉ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 1) ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์„ ์—ด๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์— ์—ฐ๊ฒฐ์„ ํ•œ๋‹ค. (host address, username, password, DB name์„ ์‚ฌ์šฉํ•ด์„œ) 2) ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์— ์ฟผ๋ฆฌ๋ฅผ ์ œ์ถœํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค (SQL statements์„ ์‚ฌ์šฉํ•ด์„œ) 3) ๋”์ด์ƒ DB ํ•„์š” ์—†์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ํ•˜๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ์„ ์ข…๊ฒฐํ•œ๋‹ค. (Programming command) 

 

๋ฐ์ดํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„์— ์žˆ์–ด์„œ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๋‹จ๊ณ„์—์„œ๋Š” 1) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋Šฅ(function)์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•œ๋‹ค. 2) DBMS์— ์˜ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค statement๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์‹๋ณ„ํ•˜๋Š” ๋ฒ”์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ช…๋ น์–ด๋“ค(์‚ฌ์ „์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•œ๋‹ค) ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. 3) ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๋ชจ๋ธ์ด๋ž‘ ์ฟผ๋ฆฌ ์–ธ์–ด(์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”) ๊ณผ ํ˜ธํ™˜๋œ๋‹ค. 

 

1-1) ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— Function ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ˆœ์„œ - ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ์˜ˆ์‹œ๋„ ์•„๋ž˜ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅธ๋‹ค

  1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ function์„ API๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. - API(Application Programming Interface)
  2. DB๋ž‘ ์—ฐ๊ฒฐ 
  3. SQL/NoSQL ์ฝ”๋“œ ์ค€๋น„ํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋„(๋งค๊ฐœ๋ณ€์ˆ˜)๋„ ์ค€๋น„
  4. ์ฝ”๋“œ ์‹œํ–‰ 
  5. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
  6. ์ฟผ๋ฆฌ๊ฒฐ๊ณผ๋กœ ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๊ฐ’ ์ถ”์ถœํ•˜๊ธฐ
  7. ๊ฒฐ๊ณผ ์ถœ๋ ฅํ•˜๊ธฐ 

1-2) ํŒŒ์ด์ฌ์ด๋‚˜ ๋…ธ๋“œ JS์˜ ์˜ˆ์‹œ("Cursor", ์ปค์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”)

์ปค์„œ๋Š” DB์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ฐ˜๋ณต์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ œ์–ด ๊ตฌ์กฐ์ด๋‹ค. (์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋ฃจํ”„, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ)

Lecture materials

  1. ์ปค์„œ๊ฐ€ ํ•ด๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋ก ํ•œ๋‹ค. ; 7๋ฒˆ 
  2. ์ปค์„œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฟผ๋ฆฌ๋ฌธ์„ ์‹œํ–‰ํ•œ๋‹ค. ; 8๋ฒˆ (SELECT ~~)
  3. ์ปค์„œ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ ๋ณ€์ˆ˜๋กœ ํŒจ์น˜ํ•œ๋‹ค.(ํ•œ๋ฒˆ์— ํŠœํ”Œ ํ•˜๋‚˜์”ฉ- ํ–‰ ํ•˜๋‚˜) ; 9๋ฒˆ (mycursor.fetchall() )
  4. ๊ณ„์† ๋ฐ˜๋ณตํ•œ๋‹ค. ; 10, 11 ๋ฒˆ (for ๋ฌธ)
  5. ๋ชจ๋“  ํ–‰์ด ๋‹ค ํŒจ์น˜ ์™„๋ฃŒ๋˜๋ฉด ์ปค์„œ ์ข…๊ฒจ; 12๋ฒˆ (mycursor.close())

Lecture materials

2) ์ด๋ฏธ SQLํŒŒํŠธ์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ” ์žˆ์ง€๋งŒ Stored Procedure๋ผ๋Š” ๋‚ด์žฌ๋œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์„œ ์ฟผ๋ฆฌ๊ฐ€ ์‹œํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์˜๊ตฌ ์ €์žฅ ๋ชจ๋“ˆ(persistent stored module)์ด๋ผ๊ณ ๋„ ํ•˜๋Š” ๋ฐ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์„œ๋ฒ„์˜ DBMS์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋‹ค๋ฅธ 2๊ฐœ์˜ ๋ฐฉ๋ฒ•์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ด๊ฒŒ ์ฐจ์ด์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ๊ฐ์†Œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ณ  ๋ทฐ(View) ์ƒ์„ฑ ๊ณผ์ •์—๋„ ์œ ์šฉํ•˜๋‹ค. 

 

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์˜ ๋ฌธ์ œ์  

1) ์ž„ํ”ผ๋˜์Šค ๋ถˆ์ผ์น˜๋Š” ํ˜ธ์ŠคํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ ๊ฐ„์˜ ๋น„ํ˜ธํ™˜์„ฑ ๊ฒฐ๊ณผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค. (ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์†์„ฑ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๋‹ค๋ฅด๋‹ค)- ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ๋‹ค๋ฆ„์œผ๋กœ ์ธํ•œ ๋น„ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ

2) ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ DBMS ๊ฐ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ(๋ฐ”์ธ๋”ฉ)์ด ํ•„์š”ํ•˜๋‹ค(๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋”ฐ๋ผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ)

3) ๋ฐ”์ธ๋”ฉ(์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€)์€ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(ํ…Œ์ด๋ธ”)๋ฅผ ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด์˜ ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๋‹ค.  

4) ํŠœํ”Œ(ํ–‰)์—์„œ ๊ฐœ๋ณ„ ๊ฐ’์„ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ(ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํŠœํ”Œ)์„ ๋ฐ˜๋ณตํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•˜๋‹ค. 

 

Web Database Programming (NodeJS)

์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž - ์„œ๋ฒ„ ์š”์ฒญ - ๋ฐ˜์‘ ์˜ค๋Š” ๊ณผ์ •์˜ ์ˆœ์„œ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค. 

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

 

Node JS ๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค๋ฅธ ํ”Œ๋žซํผ๊ณผ ํ˜ธํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์ด๋ฉฐ, ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋„คํŠธ์›Œํฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. 

 

<html>
<head><title> JAVASCRIPT </title></head>
<body>
<script type="text/javascript">
   //์•„๋ž˜์™€ ๊ฐ™์ด ํ—ฌ๋กœ์šฐ์›”๋“œ ์ถœ๋ ฅ! 
   document.write("hello world")
   console.log("Hellow World")
   alert("Hello World")
   
   //์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„์„œ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์ถœ๋ ฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
   var num1, num2, sum
   num1=prompt("Enter first number")
   num2=prompt("Enter second number")
   sum=parseInt(num1)+parseInt(num2)
   alert("Sum ="+sum)
</script>
</body>
</html>

์ด๋ ‡๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋ฐ”๋กœ ์‹œํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด hello.js ์— ์ €์žฅ๋œ ๋‚ด์šฉ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค. 

<html>
<head><title>JAVASCRIPT</title></head>
<body>
<script type="text/javascript" src="hello.js"></script>
</body>
</html>
//hello.js file
document.write("hello world");
console.log("hello worlds");
alert("hello world");

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜์ด๋ฆ„์€ ์•„๋ž˜์˜ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.

์•ŒํŒŒ๋ฒณ, ์ˆซ์ž, $ ๊ทธ๋ฆฌ๊ณ  _ (์–ธ๋”๋ฐ”)๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.  ๊ณต๋ฐฑ์ด๋ผ๋˜์ง€ ๋‹ค๋ฅธ ๊ธฐํ˜ธ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ฒซ ๊ธ€์ž๋กœ๋Š” ์ˆซ์ž๋Š” ์˜ฌ ์ˆ˜ ์—†๋‹ค.  ๋ณ€์ˆ˜ ์ด๋ฆ„๋“ค์€ ๋Œ€์†Œ๋ฌธ์ž์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. ๋”ฐ๋กœ ๊ธธ์ด์˜ ์ œํ•œ์€ ์—†๋‹ค.    

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ์ž๋“ค์€ ๊ฑฐ์˜ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ์‚ฌ๋žŒ๋“ค์ด๋ผ๋ฉด ๋ชจ๋‘ ์•Œ ๊ฒƒ ๊ฐ™๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰์œผ๋กœ ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ž๋ฐ”๋‚˜ ํŒŒ์ด์ฌ์„ ์‚ฌ์šฉํ•ด๋ณธ ์‚ฌ๋žŒ๋“ค์€ ์•„๋งˆ ์ต์ˆ™ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฑด == , ++, -- ๊ฐ™์€ ํ‘œํ˜„, === (๋ฐ์ดํ„ฐ ํƒ€์ž…๊นŒ์ง€ ๊ฐ™๋‹ค) !==(๊ฐ™์€ ํƒ€์ž…์ด์ง€๋งŒ ๋‹ค๋ฅธ ๊ฐ’) ๋“ฑ์ด ์žˆ๊ฒ ๋‹ค. 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ๋ฐ ๋ณ€์ˆ˜ ์„ ์–ธ์„ ํ•˜์—ฌ ๋ณ€์ˆ˜๋“ค๊ณผ ๋ฌธ์ž์—ด๊ณผ์˜ ์—ฐ๊ฒฐ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ณ€์ˆ˜ ์„ ์–ธ์€ "let"์„ ์‚ฌ์šฉํ•œ๋‹ค. 

//Example 1) 
let firstname = 'Bella';
let lastname = 'Kim';

let fullname = firstname + ' '+ latname; 
//๊ฒฐ๊ณผ: Bella Kim

console.log(fullname);

//๋ฌธ์ž ํ•˜๋‚˜๋งŒ ์ถœ๋ ฅ 
console.log(fullname[2]);

//๋ช‡ ๊ธ€์ž์ธ์ง€ ๊ธธ์ด ์ถœ๋ ฅ 
console.log(fullname.length);

//Example 2)
console.log(fullname,toUpperCase()); //๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜

let result = fullname.toLocaleLowerCase(); //์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ 
console.log(result);

let index= email.indexOf('@');   //@์˜ ์œ„์น˜ 
console.log('index of the @ sign:', index);

๋‹ค์Œ์€ const ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ ์„ ์–ธ์„ ํ•˜๋Š” ๋ฐ, let๊ณผ ๋‹ฌ๋ฆฌ const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค. 

const title='javascript test';
const author='me myself';
const likes=100; 

let result = `The test , ${title}, written by ${author} has ${likes} likes`;  
//backticks ์ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค!! ์—ฌ๊ธฐ์—์„œ ์‹ฑ๊ธ€ ๋”ฐ์˜ดํ‘œ ์•„๋‹˜ ์ฃผ์˜!!!!!
console.log(result);

๋‹ค์Œ์€ try-catch ๋ฌธ ํ™œ์šฉ ์˜ˆ์‹œ์ด๋‹ค. 

try
{
request = new XMLTTTPRequest()
}
catch(err)
{
//๋ญ”๊ฐ€ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ํ•จ
}
finally
{
alert("The 'try' clause was encountered")
}

๋ชฝ๊ณ ๋””๋น„ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋ฉด์„œ try-catch ๋ฌธ์„ ํ™œ์šฉํ•œ ์˜ˆ์ด๋‹ค. 

const {MongoClient} = require('monogdb');

async function main(){          //async: ๊ฒฐ๊ณผ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๊ณ„์† ์ง„ํ–‰ 
    const uri = const uri = "mongodb+srv://<username>:<password>@<clsuter-uri>/blahblah~~";
    const client = new MongoClient(uri); 

    try {
    await client.connet(); 
    }
    catch(e){
    console.error(e)
    }
    finally{
    await client.close();
    }
}
main().catch(console.error);

๊ทธ ๋ฐ–์—๋„ ์—ฌ๋Ÿฌ ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์‹œ๋กœ ๋งŒ๋‚˜๋ณด์ž. 

const age = 25;

if(age>30){
	console.log('over 30');
}
//์กฐ๊ฑด๋ฌธ์ด true์ผ๋•Œ๋งŒ ์ถœ๋ ฅ 

if(age>30){
	console.log('over 30');
}else {
	console.log('You are ${age}')
}
//์กฐ๊ฑด์ด ๋‘๊ฐœ๋กœ ๋‚˜๋‰ฉ 

if(age>30){
	document.write('over 30');
}else if(age<30) {
	document.write('You are a still baby')
} else {
	document.write('you are 30 years old');
}

for ๊ตฌ๋ฌธ๊ณผ while-do while ๊ตฌ๋ฌธ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. 

const pname=['bella', 'brian', 'david', 'star']

for (let i =0; i <pname.length; i++){
	console.log('item in box ${i} is ${pname[i]}'); 
}

let i=0;
while (i<5){
	console.log('item in box ${i} is ${pname[i]}'); 
    i++; //i ๊ฐฏ์ˆ˜ ์ฆ๊ฐ€ 
}

let i=0; 
do {
    console.log('item in box ${i} is ${pname[i]}'); 
    i++; 
} while(i<5);

๋…ผ๋ฆฌ์  ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ๋„ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด์ž. 

if (age <18 || gender==="male"){           
	alert("You are still too young")
}
//๋‚˜์ด๊ฐ€ 18์„ธ ๋ณด๋‹ค ์–ด๋ฆฌ๊ฑฐ๋‚˜ ํ˜น์€ ๋‚จ์ž๋ฉด (๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ true๋ฉด ์‹คํ–‰)


if(continent === "Europe" && language === "German"){
	alert("You are from Germany");
}else {
	alert("You are not from Germany"); 
} 
//์œ ๋Ÿฝ์ด๊ณ  ๋…์ผ์–ด๋ฅผ ์“ธ ๋•Œ, ๋‘˜ ๋‹ค true์—ฌ์•ผ if ์‹œํ–‰, ์•„๋‹ˆ๋ฉด else ์‹œํ–‰

 Breaking and Continue๋„ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ break๋ฅผ ๋งŒ๋‚˜๋ญ” ์ฟผ๋ฆฌ๋ฌธ์ด ๋ฐ”๋กœ ์ข…๊ฒฐ๋˜๊ณ  continue๋Š” ๊ณ„์† ๋‹ค์Œ ์ฟผ๋ฆฌ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋„ j ๊ฐ€ 17์ด๋˜๋Š” ์ˆœ๊ฐ„ break ๊ฐ€ ์‹œํ–‰๋˜๋ฉด ์ฟผ๋ฆฌ๊ฐ€ ์ข…๊ฒฐ๋œ๋‹ค. ๊ทธ ๋‹ค์Œ ์ฝ”๋“œ์—์„œ ๋ณด๋ฉด ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ฟผ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ์ง„ํ–‰๋œ๋‹ค(j๊ฐ€ 19๊ฐ€ ๋  ๋•Œ๊นŒ์ง€) 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋ฐฐ์—ด์€ ๋˜‘๊ฐ™์ด [ ]๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด ์ ‘๊ทผ์€ ์ธ๋ฑ์Šค ํ™œ์šฉํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์œ„์น˜๋ฅผ ์ˆซ์ž๋กœ ๋„ฃ์–ด์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์—…๋ฐ์ดํŠธ๋„ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด mylist[0]์€ mylist ๋ฐฐ์—ด์˜ ์ฒซ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๊ณ , mylist[0]='replace' ๋Š” ์ฒซ ํ•ญ๋ชฉ์„ replace๋ผ๋Š” ๋‹จ์–ด๋กœ ๊ต์ฒดํ•  ๊ฒƒ์ด๋‹ค. 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ function์€ ํ™œ์šฉ๋„๊ฐ€ ๋งŽ์€ ๋ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. 

function fullname(firstname, lastname){
	alert(firstname+ " "+lastname); 
}
//fullname์ด๋ผ๋Š” function์€ ๋‘๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค. 
//์ด ๋ณ€์ˆ˜๋Š” function ์•ˆ์—์„œ ์ˆœ์„œ๋Œ€๋กœ firstname, lastname์œผ๋กœ ์ง€์นญ๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค. 

let firstname= prompt("fistname?");
let lastname= prompt("lastname?");
//ํŒ์—…์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹จ์–ด๋ฅผ ๋ฐ›์Œ 

fullname("bella", "kim"); 
//function์ด๋ฆ„(๋ณ€์ˆ˜ 1, ๋ณ€์ˆ˜ 2)์˜ ํ˜•ํƒœ๋กœ ์ด์šฉ
function add(x,y){
	return x+y;
}

let result = add(8, 12);   //๋ฐ”๋กœ add function์œผ๋กœ ๊ณ„์‚ฐ๋œ ๊ฐ’์ด ๋ณ€์ˆ˜์— ์ €์žฅ 
let result2 = add(result, 5) //result ๋ณ€์ˆ˜๊ฐ’์ด๋ž‘ 5๊ฐ€ add function์œผ๋กœ ๊ณ„์‚ฐ๋˜์–ด result2์— ์ €์žฅ

function getFullname(firstname, lastname){
	let fullname = fistname + " " + lastname;
    return fullname; 
}

let userFullname = getFullname("Bella", "Kim");    //getFullname function์œผ๋กœ ๋ณ€์ˆ˜์— ์ €์žฅ 
alert(userFullname);   //Bella Kim, ๋ณ€์ˆ˜ ์ถœ๋ ฅ

alert(getFullname("test", "name")); // test name, ์•„์˜ˆ ์ถœ๋ ฅํ•  ๋•Œ getFullname function ์‚ฌ์šฉ
const people = ['bella', 'luna', 'stella', 'bob', 'sasimi'] 

people.forEach(function(person) {   //function ์„ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ ๊ฐ ๋ฐฐ์—ด์— ์š”์†Œ๋“ค ํ•˜๋‚˜์”ฉ ๋ฐ˜์˜ 
	console.log(person);
});

people.forEach(person) => {         //์—ฌ๊ธฐ์„œ๋Š” function๋”ฐ๋กœ ์„ ์–ธ x 
	console.log(person);
});

people.forEach((person, index)=>{    //์—ฌ๊ธฐ์„œ๋Š” function๋”ฐ๋กœ ์„ ์–ธ x 
	console.log(index, person);
});
let user = new Object()
let user = {}            //object๋Š” { }๋ฅผ ์“ด๋‹ค. 

let student={
    firstname: "bella",
    lastname:"kim",
}; 

alert(student.firstname);   //bella 
alert(student["lastname"]); //kim

let anotherstudent={
    firstname: "stella",
    lastname:"lee",
    male:false,
    greet: function(){     //function์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜ 
        alert('hey'); 
    }
};
let user= {
    firstname: "bella",
    lastname:"kim",
    gender: 'female'
}; 

for (let prop in user){
	alert(prop);       //key;  firstname, lastname, gender
    alert(user[prop]); //value; 'bella', 'kim', 'female'
}

//object ๋‘ ๊ฐœ๊ฐ€ ๋ฐฐ์—ด๋กœ ์ €์žฅ๋˜์–ด ์žˆ์Œ 
let users=[
{
    firstname: "bella",
    lastname:"kim",
    gender: 'female'
},
{
    firstname: "bella2",
    lastname:"kim2",
    gender: 'female'
}
]; 

user.forEach(function(user, index){
	for (let prop in user){
    	alert(prop+"is"+user[prop]);
    }
});

 

const {MongoClient} = require('monogdb');

async function main(){          //async: ๊ฒฐ๊ณผ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๊ณ„์† ์ง„ํ–‰ 
    const uri = const uri = "mongodb+srv://<username>:<password>@<clsuter-uri>/blahblah~~";
    const client = new MongoClient(uri); 

    try {
    await client.connect(); 
    await listDatabases(client)   //์•„๋ž˜์— ์ถ”๊ฐ€๋กœ ๋‚˜์™€ ์žˆ๋Š” function ์†Œํ™˜! client์ „๋‹ฌ 
    }
    catch(e){
    console.error(e)
    }
    finally{
    await client.close();
    }
}

main().catch(console.error);

asysnc function listDatabase (client) {
	const databaseList = await client.db().admin().listDatabase(); // db, collection, list all the db ๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅ 
    console.log('Databases:');
    databaseList.databases.forEach(db => {          //databaselist objest๊ตฌ์กฐ์— database๋ผ๋Š” ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 
    	console.log(`-${db.name}`);
        });
};
const {MongoClient} = require('monogdb');

async function main(){          //async: ๊ฒฐ๊ณผ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๊ณ„์† ์ง„ํ–‰ 
    const uri = const uri = "mongodb+srv://<username>:<password>@<clsuter-uri>/blahblah~~";
    const client = new MongoClient(uri); 

    try {
    await client.connect(); 
    await createListing(client, {    //client๋Š” ์œ„์—์„œ ๋ฐ›์€ db ์œ„์น˜
    	name:'bella'
        })
    }
    catch(e){
    console.error(e)
    }
    finally{
    await client.close();
    }
}

main().catch(console.error);

asysnc function createListing (client, newListing) {
	const result = await client.dbname("sample").collection("listingsAndReview").insertOne(newListing);
    console.log(`New listing created: ${result.insertedId}`);
};

๊ทธ ๋ฐ–์—๋„ update, insert ๋“ฑ์ด ๋ชจ๋‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

https://www.mongodb.com/developer/languages/javascript/node-crud-tutorial 

 

MongoDB and Node.js Tutorial - CRUD Operations | MongoDB

Learn how to execute the CRUD (create, read, update, and delete) operations in MongoDB using Node.js in this step-by-step tutorial.

www.mongodb.com

 

๋ชฝ๊ณ ๋””๋น„ ๊ณตํ™ˆ์„ ์ž˜ ๋’ค์ ธ๋ณด๋ฉด ์ •๋ง ์›ฌ๋งŒํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ๋ชจ๋‘ ์ œ๊ณต๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ๊ฒƒ๋“ค์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์งˆ์˜์‘๋‹ต์œผ๋กœ๋„ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์–ด๋–ค ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋ฉด ์š”์ฒญ๋„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™๋‹ค. 

 

์ด์ƒ ๋ ! 

๋ฐ˜์‘ํ˜•