์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[Node.js] 8์žฅ ๋ชฝ๊ณ ๋””๋น„

22-23/22-23 Node.js

by dev otcroz 2022. 11. 17. 10:00

๋ณธ๋ฌธ

728x90

๐Ÿ” NoSQL vs. SQL

MySQL์€ SQL์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฉฐ, ๋ชฝ๊ณ ๋””๋น„๋Š” SQL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” NoSQL์ด๋‹ค.

๐Ÿ“Œ ํ‘œ๋กœ ๋น„๊ตํ•ด๋ณด์ž

SQL(MySQL) NoSQL(๋ชฝ๊ณ ๋””๋น„)
๊ทœ์น™์— ๋งž๋Š” ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ์ž์œ ๋กœ์šด ๋ฐ์ดํ„ฐ ์ž…๋ ฅ
ํ…Œ์ด๋ธ” ๊ฐ„ JOIN ์ง€์› ์ปฌ๋ ‰์…˜ ๊ฐ„ JOIN ๋ฏธ์ง€์›
์•ˆ์ •์„ฑ, ์ผ๊ด€์„ฑ ํ™•์žฅ์„ฑ, ๊ฐ€์šฉ์„ฑ
์šฉ์–ด(ํ…Œ์ด๋ธ”, ๋กœ์šฐ, ์ปฌ๋Ÿผ) ์šฉ์–ด(์ปฌ๋ ‰์…˜, ๋‹คํ๋จผํŠธ, ํ•„๋“œ)

 

๐Ÿ” ๋ชฝ๊ณ ๋””๋น„ ์„ค์น˜ (์œˆ๋„)

ํ•ด๋‹น ์‚ฌ์ดํŠธ์—์„œ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜ ์™„๋ฃŒ

 

Try MongoDB Community Edition

Try MongoDB Community Edition on premise non-relational database including the Community Server and Community Kubernetes Operator for your next big project!

www.mongodb.com

๐Ÿ“Œ ์„ค์น˜ ์™„๋ฃŒ ํ›„ ํ•ด์•ผํ•  ์ž‘์—…

1. C:\data\db ํด๋”๋ฅผ ๋งŒ๋“  ํ›„, ๋ชฝ๊ณ ๋””๋น„๊ฐ€ ์„ค์น˜๋œ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•ด mongod ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ชฝ๊ณ ๋””๋น„ ์‹คํ–‰

2. mongo ๋ช…๋ น์–ด๋กœ ๋ชฝ๊ณ ๋””๋น„ ํ”„๋กฌํ”„ํŠธ ์ ‘์†

3. use admin

    db.createUser({ user: '์ด๋ฆ„', pwd: '๋น„๋ฐ€๋ฒˆํ˜ธ', roles: ['root'] }) 

    ๋ฉ”์„œ๋“œ๋กœ ๊ณ„์ • ์ƒ์„ฑ

4. $ mongod --auth

    $ mongo admin -u [์ด๋ฆ„] -p [๋น„๋ฐ€๋ฒˆํ˜ธ] 

     ๋ช…๋ น์–ด๋กœ ์ ‘์†

 

๐Ÿ” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

use [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ช…] : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด

show dbs : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด

db : ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด

๐Ÿ“Œ ์ปฌ๋ ‰์…˜ ์ƒ์„ฑ

์ปฌ๋ ‰์…˜์€ MySQL์˜ ํ…Œ์ด๋ธ”์— ๋Œ€์‘๋˜๋Š” ๊ฐœ๋…์ด๋‹ค.

๋‹คํ๋จผํŠธ๋ฅผ ๋„ฃ๋Š” ์ˆœ๊ฐ„ ์ปฌ๋ ‰์…˜์€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ์ง์ ‘ ์ปฌ๋ ‰์…˜์„ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด๋กœ๋Š”

db.createCollection('์ปฌ๋ ‰์…˜์ด๋ฆ„')์ด ์žˆ์œผ๋ฉฐ, show collections๋กœ ์ƒ์„ฑํ•œ ์ปฌ๋ ‰์…˜ ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ” CRUD

๐Ÿ“Œ Create (์ƒ์„ฑ)

๋ชฝ๊ณ ๋””๋น„๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ž๋ฃŒํ˜•์„ ๋”ฐ๋ฅธ๋‹ค. Date๋‚˜ ObjectId, Binary Data, Timestamp์™€ ๊ฐ™์€ ์ž๋ฃŒํ˜•์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. db.์ปฌ๋ ‰์…˜๋ช….save(๋‹คํ๋จผํŠธ) ๋กœ ๋‹คํ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ Read (์กฐํšŒ)

find({})๋Š” ์ปฌ๋ ‰์…˜ ๋‚ด์˜ ๋ชจ๋“  ๋‹คํ๋จผํŠธ๋ฅผ ์กฐํšŒํ•˜๋ผ๋Š” ๋œป์ด๋‹ค. (ex) db.users.find({});

ํŠน์ • ํ•„๋“œ๋งŒ ์กฐํšŒํ•˜๊ณ  ์‹ถ์œผ๋ฉด find ๋ฉ”์„œ๋“œ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์กฐํšŒํ•  ํ•„๋“œ๋ฅผ ๋„ฃ๋Š”๋‹ค. 1 ๋˜๋Š” true๋กœ ํ‘œ์‹œํ•œ ํ•„๋“œ๋งŒ ๊ฐ€์ ธ์˜ค๋ฉฐ, _id๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ 0 ๋˜๋Š” false๋ฅผ ์ž…๋ ฅํ•ด ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

db.users.find({}, { _id: 0, name: 1, married: 1 });

์กฐํšŒ ์‹œ ์กฐ๊ฑด์„ ์ฃผ๋ ค๋ฉด ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜ ๊ฐ์ฒด์— ๊ธฐ์ž…ํ•œ๋‹ค.

โœ… ์ž์ฃผ ์“ฐ์ด๋Š” ์—ฐ์‚ฐ์ž

$gt(์ดˆ๊ณผ), $gte(์ด์ƒ), $lt(๋ฏธ๋งŒ), $lte(์ดํ•˜), $ne(๊ฐ™์ง€ ์•Š์Œ), $or(๋˜๋Š”), $in(๋ฐฐ์—ด ์š”์†Œ ์ค‘ ํ•˜๋‚˜)

๐Ÿ“Œ Update (์ˆ˜์ •)

db.users.update({ name: 'nero' }, { $set: { comment: '์ข‹์€ ์•„์นจ์ด์—์š”:)' } });

์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด๋Š” ์ˆ˜์ •ํ•  ๋‹คํ๋จผํŠธ๋ฅผ ์ง€์ •ํ•˜๋ฉฐ, ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด๋Š” ์ˆ˜์ •ํ•  ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค. $set ์—ฐ์‚ฐ์ž๋Š” ์–ด๋–ค ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ• ์ง€ ์ •ํ•˜๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค. ์ผ๋ถ€ ํ•„๋“œ๋งŒ ์ˆ˜์ •ํ•˜๊ณ  ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” $set ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ผ๋ฐ˜ ๊ฐ์ฒด๋ฅผ ๋„ฃ์„ ์‹œ ๋‹คํ๋จผํŠธ๊ฐ€ ํ†ต์งธ๋กœ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ฃผ์–ด์ง„ ๊ฐ์ฒด๋กœ ์ˆ˜์ •๋œ๋‹ค.

๐Ÿ“Œ Delete (์‚ญ์ œ)

db.users.remove({ name: 'nero' })

์‚ญ์ œํ•  ๋‹คํ๋จผํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๊ฐ์ฒด๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ œ๊ณตํ•œ๋‹ค.

 

๐Ÿ” ๋ชฝ๊ตฌ์Šค (Mongoose)

๋ชฝ๊ตฌ์Šค๋Š” ์‹œํ€„๋ผ์ด์ฆˆ์™€ ๋‹ฌ๋ฆฌ ๋‹คํ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ODM(Object Document Mapping)์ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ๋ชฝ๊ณ ๋””๋น„์— ์—†์–ด์„œ ๋ถˆํŽธํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๋ชฝ๊ตฌ์Šค๊ฐ€ ๋ณด์™„ํ•ด์ค€๋‹ค. ES2015 ํ”„๋กœ๋ฏธ์Šค ๋ฌธ๋ฒ•๊ณผ ๊ฐ•๋ ฅํ•˜๊ณ  ๊ฐ€๋…์„ฑ ๋†’์€ ์ฟผ๋ฆฌ ๋นŒ๋”๋ฅผ ์ง€์›ํ•œ๋‹ค.

โœ… ์Šคํ‚ค๋งˆ(schema)

๋ชฝ๊ณ ๋””๋น„๋Š” ํ…Œ์ด๋ธ”์ด ์—†์–ด์„œ ์ž์œ ๋กญ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ˆ˜๋กœ ์ž˜๋ชป๋œ ์ž๋ฃŒํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ ๋‹คํ๋จผํŠธ์—๋Š” ์—†๋Š” ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ชฝ๊ตฌ์Šค๋Š” ๋ชฝ๊ณ ๋””๋น„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ ์ „, ๋…ธ๋“œ ์„œ๋ฒ„ ๋‹จ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ ํ•„ํ„ฐ๋งํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

โœ… populate

populate ๋ฉ”์„œ๋“œ๋กœ MySQL์˜ JOIN ๊ธฐ๋Šฅ์„ ๋ณด์™„ํ•˜์—ฌ, ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ์Šคํ‚ค๋งˆ ์ •์˜ํ•˜๊ธฐ

๋ชฝ๊ตฌ์Šค ๋ชจ๋“ˆ์—์„œ Schema ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด ์Šคํ‚ค๋งˆ๋ฅผ ๋งŒ๋“ ๋‹ค. String, Number, Date, Buffer, Boolean, Mixed, ObjectId, Array๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ํ•˜๊ธฐ

  • GET /users/:id/comments  ๋Œ“๊ธ€ ๋‹คํ๋จผํŠธ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ผ์šฐํ„ฐ
  • POST /comments              ๋‹คํ๋จผํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ผ์šฐํ„ฐ
  • PATCH /comments/:id       ๋‹คํ๋จผํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ผ์šฐํ„ฐ
  • DELETE /comments/:id     ๋‹คํ๋จผํŠธ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ผ์šฐํ„ฐ

๋ชฝ๊ตฌ์Šค๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ async / await๊ณผ try / catch ๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ๊ฐ ์กฐํšŒ ์„ฑ๊ณต ์‹œ์™€ ์‹คํŒจ ์‹œ์˜ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋กํ•  ๋•Œ๋Š” ๋ชจ๋ธ.create ๋ฉ”์„œ๋“œ๋กœ ์ €์žฅํ•˜๋ฉฐ, _id๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ์ˆ˜์ •์—๋Š” update ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. update ๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์–ด๋–ค ๋‹คํ๋จผํŠธ๋ฅผ ์ˆ˜์ •ํ• ์ง€ ๋‚˜ํƒ€๋‚ธ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ๋Š” ์ˆ˜์ •ํ•  ํ•„๋“œ์™€ ๊ฐ’์ด ๋“ค์–ด ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•œ๋‹ค(์‹œํ€„๋ผ์ด์ฆˆ์™€ ์ธ์ˆ˜ ์ˆœ์„œ ๋ฐ˜๋Œ€).

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ