2023. 1. 23. 22:25ใData science/Database
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๊ฐ์ง ์ด๋ค.
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}):
//๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ ฌ์ด ๋์ง๋ง, ์ ์ฒด์ ์ผ๋ก ๋ณด์์ ๋๋ ์ด๋ฆ์ ์์๋๋ก ์ ๋ ฌ๋์ด ์์ง ์๋ค.
//๋ค๋ง ๊ฐ ๋์ด ๊ทธ๋ฃน ์์์๋ ์ธ๋ฑ์ค๋ก ์ธํด ์์๋๋ก ์ ๋ ฌ๋์ด ์๋ค.
์คํค๋ง ๋์์ธ์ ํ ๋ ๊ณ ๋ คํด์ผ ํ ๊ฒ์ด ๋ฌด์์ด ์์๊น? 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: ์ธ๋ฑ์ค ๋ฐ์ดํฐ๋ ๋ฐ๋ก ์ ์ฅ๋๋ค๊ณ ํ๋ ๋ฐ ์ด ์ธ๋ฑ์ค ํ์ผ์ ๋ค์ ธ์ ํน์ ์ฐพ๋ ๊ฒฐ๊ณผ๊ฐ ์๋ ์ง ํ์ธํด๋ณธ๋ค.
๋ง์ฝ์ ์๋ฅผ ๋ค์ด ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ฐ๋ก ๊ฒฐ๊ณผ ๋ฐ์์ด ๋ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋น๋๊ธฐ ์์ ์ผ๋ก ์งํ๋๊ธฐ๋ ํ๋ค.
๋ค์ 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) ๊ณ ๊ฐ์ด ์ด๋ค ํํฐ์ ์ ์ด๋ค ๋ ธ๋์ธ์ง ์๊ณ ํด๋น ๋ ธ๋์ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ด ์๋ค.(๊ณ ๊ฐ์ด ์์น๋ฅผ ์๊ณ ์์)
๋ฐ์ดํฐ ๋ชจ๋ธ๋ง (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 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์์ - ๋ค์์ ๋์ค๋ ์์๋ ์๋ ์์๋ฅผ ๋ฐ๋ฅธ๋ค
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ function์ API๋ก ๋ถ๋ฌ์จ๋ค. - API(Application Programming Interface)
- DB๋ ์ฐ๊ฒฐ
- SQL/NoSQL ์ฝ๋ ์ค๋นํ๊ณ ํ๋ผ๋ฏธํฐ๋(๋งค๊ฐ๋ณ์)๋ ์ค๋น
- ์ฝ๋ ์ํ
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
- ์ฟผ๋ฆฌ๊ฒฐ๊ณผ๋ก ๋ถํฐ ๊ฒฐ๊ณผ๊ฐ ์ถ์ถํ๊ธฐ
- ๊ฒฐ๊ณผ ์ถ๋ ฅํ๊ธฐ
1-2) ํ์ด์ฌ์ด๋ ๋ ธ๋ JS์ ์์("Cursor", ์ปค์๋ฅผ ์ฌ์ฉํ๋)
์ปค์๋ DB์ ๋ ์ฝ๋์ ๋ํ ๋ฐ๋ณต์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ ์ด ๊ตฌ์กฐ์ด๋ค. (์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ํ ๋ฃจํ, ํ ๋ฒ์ ํ๋์ ๋ ์ฝ๋)
- ์ปค์๊ฐ ํด๋น๋๋ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ๊ฐ๋ฅดํค๋๋ก ํ๋ค. ; 7๋ฒ
- ์ปค์๋ฅผ ์ฌ์ฉํด์ ์ฟผ๋ฆฌ๋ฌธ์ ์ํํ๋ค. ; 8๋ฒ (SELECT ~~)
- ์ปค์๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ ๋ณ์๋ก ํจ์นํ๋ค.(ํ๋ฒ์ ํํ ํ๋์ฉ- ํ ํ๋) ; 9๋ฒ (mycursor.fetchall() )
- ๊ณ์ ๋ฐ๋ณตํ๋ค. ; 10, 11 ๋ฒ (for ๋ฌธ)
- ๋ชจ๋ ํ์ด ๋ค ํจ์น ์๋ฃ๋๋ฉด ์ปค์ ์ข ๊ฒจ; 12๋ฒ (mycursor.close())
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
๋ชฝ๊ณ ๋๋น ๊ณตํ์ ์ ๋ค์ ธ๋ณด๋ฉด ์ ๋ง ์ฌ๋งํ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋ชจ๋ ์ ๊ณต๋๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ๋ก ํด๊ฒฐ๋์ง ์๋ ๊ฒ๋ค์ ์ปค๋ฎค๋ํฐ์์ ์ง์์๋ต์ผ๋ก๋ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๊ณ ์ด๋ค ๊ธฐ๋ฅ์ ๋ํ ์ฌ์ฉ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์์ฒญ๋ ๊ฐ๋ฅํ ๊ฒ ๊ฐ๋ค.
์ด์ ๋ !
'Data science > Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Understanding Oracle SE and DBMS (0) | 2023.03.26 |
---|---|
Understanding Database - SQL ๊ธฐ์ด ์ด์ ๋ฆฌ (2) | 2023.01.23 |
Understanding Database 11 - Database Programming Techniques (0) | 2023.01.16 |
Understanding Database 10 - Data modelling with MongoDB (0) | 2023.01.16 |
Understanding Database 9 - Distributed Database Systems(DDB) (0) | 2023.01.16 |