๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒŒ | WEB DEV/NodeJS

[NodeJS+Express] 4. MongoDB ํƒ‘์žฌํ•ด์ฃผ๊ธฐ

by KASSID 2023. 9. 24.

๋ชฉ์ฐจ

    728x90

    ์ง€๊ธˆ๊นŒ์ง€ ์„ธํŒ…ํ•œ ์„œ๋ฒ„์— DB๋ฅผ ๋‹ฌ์•„๋ณด์ž!

     

    1. DB ํ†บ์•„๋ณด๊ธฐ

    0)  DB๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

    ์›น ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ค‘์š”ํ•œ ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ์‚ฌ์šฉ์ž๋“ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

    ์ด๋ฅผ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด DataBase(DB)์ด๋‹ค!

    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ด์šฉํ•ด ๋น ๋ฅธ ๋ฐ์ดํ„ฐ์˜ ์ž…์ถœ๋ ฅ๊ณผ ๋Œ€์šฉ๋Ÿ‰ ๋ณด๊ด€์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    1) DB์˜ ์ข…๋ฅ˜

    DB์˜ ์ข…๋ฅ˜์—๋Š” ๊ณ„์ธตํ˜•, ๋„คํŠธ์›Œํฌํ˜•, ๊ด€๊ณ„ํ˜•, ๊ฐ์ฒด์ง€ํ–ฅ, ๋น„๊ด€๊ณ„ํ˜•์ด ์žˆ๋‹ค.

    ์ด์ค‘ ์ตœ๊ทผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ด€๊ณ„ํ˜•๊ณผ ๋น„๊ด€๊ณ„ํ˜•์ด๋‹ค.

    ์ด ๋‘˜์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์ž.

    - ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

    ์‰ฝ๊ฒŒ ์ด๊ฒƒ์„ ์„ค๋ช…ํ•˜๋ฉด ์—‘์…€๊ณผ ๋น„์Šทํ•˜๋‹ค.

    ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ํ–‰์”ฉ ์ฐจ๋ก€๋กœ ๋ณด๊ด€ํ•œ๋‹ค.

    ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” DBMS(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ์‹œ์Šคํ…œ)๋ฅผ ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค.

    ex) MySQL, Oracle, SQLite, PostgreSQL ๋“ฑ

     

    ๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ถœ๋ ฅ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” SQL ์ด๋ผ๋Š” ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ ,

    ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ๋•Œ๋Š” ์ •๊ทœํ™”๋ฅผ ํ•œ ํ›„ ์ €์žฅํ•œ๋‹ค. (๋ฐ์ดํ„ฐ์˜ ์‹ ๋ขฐ์„ฑ UP)

     

    ์žฅ์  :

    ๋†’์€ ์‹ ๋ขฐ๋„ / ์ •๊ทœํ™”๋กœ ์ธํ•œ ๋ฐ์ดํ„ฐ ์•ˆ์ •์„ฑ·๋ฌด๊ฒฐ์„ฑ ์œ ์ง€, ๊ฐฑ์‹ ๋น„์šฉ ์ตœ์†Œํ™” / ๋‹ค์šฉ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅ / ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜, ์ •๋ ฌ, ํƒ์ƒ‰์†๋„ ๋น ๋ฆ„ ๋“ฑ

     

    ๋‹จ์  :

    ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ์‹œ / ์ˆ˜ํ‰ํ™•์žฅ ์–ด๋ ค์›€ / ์—ด ํ™•์žฅ ์–ด๋ ค์›€(์œ ์—ฐ์„ฑ ๋ถ€์กฑ) ๋“ฑ

     

     

     

    - ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

    ๊ด€๊ณ„ํ˜•์— ๋น„ํ•ด ์ž์œ ๋กœ์šด ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

    NoSQL DB๋กœ๋„ ๋ถˆ๋ฆฌ๋Š” ๋งŒํผ SQL ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

    (๊ฐœ์„ , ๋ณด์•ˆ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉ)

    ๋˜ํ•œ ์ •๊ทœํ™” ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋ฐ ์ด๊ฒƒ์ด ๊ถŒ์žฅ์‚ฌํ•ญ์ด๋ผ๊ณ  ํ•œ๋‹ค.

     

    ์ข…๋ฅ˜๋Š” key&value (Redis ๋“ฑ), document (MongoDB ๋“ฑ), Big Table DB ๋“ฑ์ด ์žˆ๋‹ค.

     

    ์žฅ์  :

    ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐํ•˜์—ฌ ์ €์žฅ,์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ (๋น…๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์šฉ์ด), ๊ตฌ์กฐ ์ •ํ•˜์ง€ ์•Š์•„ ์œ ์—ฐ์„ฑ ์ข‹์Œ, ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ, 

     

    ๋‹จ์  :

    ์ •๊ทœํ™”๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์•ˆ์ •์„ฑ, ์ •ํ™•๋„, ๋ฌด๊ฒฐ์„ฑ ๋“ฑ์ด ๋–จ์–ด์ง

     

     

    ์ด๋Ÿฌํ•œ ํŠน์ง•๋“ค์„ ๊ณ ๋ คํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ„ํš ์‹œ DB๋ฅผ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ• ์ง€ ์ •ํ•˜๋Š” ๊ธฐ์ค€์ด ๋  ์ˆ˜ ์žˆ๋‹ค!

     

     


    2. MongoDB ์„ธํŒ…

    1) MongoDB๋ž€?

    https://www.mongodb.com/ 

    MongoDB๋Š” ๋น„๊ด€๊ณ„ํ˜• DB์ด๊ธฐ ๋•Œ๋ฌธ์— SQL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋น„๊ต์  ํŽธํ•˜๊ฒŒ DB๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ๋˜ํ•œ document DB๋กœ ๋ถ„๋ฅ˜๋˜๋Š”๋ฐ,

    collection ์ด๋ผ๋Š” ํฐ ํ‹€์— document๋ฅผ ์—ฌ๋Ÿฟ ๋งŒ๋“ค๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

    (collection = ๋””๋ ‰ํ† ๋ฆฌ, ํ…Œ์ด๋ธ” / document = ํŒŒ์ผ, row ์˜ ๊ฐœ๋…)

     

    document๋Š” JS์˜ object ์ฒ˜๋Ÿผ ๊ธฐ๋กํ•˜๋Š”๋ฐ ๋•Œ๋ฌธ์— JS ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ๋Œ€๋กœ DB์— ๋„ฃ์„ ์ˆ˜ ์žˆ์–ด

    DB๋กœ์˜ ์ž…์ถœ๋ ฅ์ด ๋งค์šฐ ๊ฐ„ํŽธํ•˜๋‹ค!

     

    2) ํ˜ธ์ŠคํŒ… ๋ฐ›๊ธฐ

    ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ

    1. ์ปดํ“จํ„ฐ์— mongodb ์ง์ ‘ ์„ค์น˜ / 2. ํด๋ผ์šฐ๋“œ์—์„œ ํ˜ธ์ŠคํŒ… ๋ฐ›๊ธฐ ์ด๋‹ค.

     

    ์ด๋ฒˆ์—๋Š” ํ˜ธ์ŠคํŒ…์„ ๋ฐ›๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ•  ๊ฒƒ์ธ๋ฐ

    ๊ฐ€์ž… ์‹œ ๋ฌด๋ฃŒ์šฉ๋Ÿ‰(์•ฝ 500MB)์„ ์ œ๊ณตํ•ด์ฃผ๊ณ , ๊ณผ๊ธˆํ•˜์—ฌ ์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ ๋ฐฑ์—… ๊ธฐ๋Šฅ ์ œ๊ณต,

    replica set์ด๋ผ๋Š” 3๊ฐœ์˜ DB์— ์ž๋™์œผ๋กœ ๋ถ„์‚ฐ์ €์žฅ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—

    ์•„์ฃผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    3) ์„ธํŒ… (์š”์•ฝ๋ฒ„์ „)

    ์„ธํŒ…์ด ๊ฐ„ํŽธํ•œ ํŽธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๊ธ€๋งํ•˜๋ฉด ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

    ๋”ฐ๋ผ์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ธํŒ…์„ ์š”์•ฝํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

     

    1. ๊ฐ€์ž…ํ•˜๊ธฐ

    2. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

    3. Deployment -> database -> create -> ๋ฌด๋ฃŒํ‹ฐ์–ด&์„œ์šธ์„œ๋ฒ„&DB์ด๋ฆ„ -> ์ƒ์„ฑ!

    3. Security -> Database Access -> ์œ ์ € ์ƒ์„ฑ -> [Password Authentication] ์•„์ด๋””/pw ์ •ํ•˜๊ธฐ -> [Built-in Role] : Atlas admin -> ์œ ์ € ์ถ”๊ฐ€!

    4. Security -> Network Access -> ip ์ฃผ์†Œ ์ถ”๊ฐ€ -> allow access from anywhere ๋˜๋Š” 0.0.0.0/0 ์ž…๋ ฅ (์•„๋ฌด๋‚˜ ๋“ค์–ด์˜ค๊ธฐ) -> ip์ฃผ์†Œ ์ถ”๊ฐ€! 

     

    4) DB / collection ์ƒ์„ฑ

    ์ด์ œ DB๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

     

    ์œ„์˜ ์„ธํŒ… ๊ณผ์ •์—์„œ ๋งŒ๋“ค์—ˆ๋˜ [Deployment] -> [Database] ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ฉด [Collections] ํƒญ์ด ์žˆ๋‹ค.

     

    Add Own my data ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ DB๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

     

     

     

    ๊ฒŒ์‹œํŒ ํ”„๋กœ์ ํŠธ ์ด๋ฏ€๋กœ DB name : forum / Collections name : post ๋กœ ์ง€์–ด์ฃผ์—ˆ๋‹ค!

     

     

     


    3. ์„œ๋ฒ„์™€ MongoDB ์—ฐ๊ฒฐํ•˜๊ธฐ

    ๋ชฝ๊ณ DB ์„ธํŒ…์„ ๋งˆ์ณค๋‹ค๋ฉด ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ•ด๋ณด์ž!

     

    ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ์˜ ์ธก๋ฉด์—์„œ ๋ฐ”๋ผ๋ณด๋ฉด

    ์œ ์ €๊ฐ€ ์ง์ ‘ DB๋ฅผ ์ปจํŠธ๋กคํ•˜๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ๋˜๊ณ , ์ค‘๊ฐ„์—์„œ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

    ๊ทธ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ์„œ๋ฒ„์ด๋‹ค.

     

    1. ์œ ์ €๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ -> 2. ์„œ๋ฒ„๊ฐ€ ๊ฒ€์‚ฌ ํ›„ DB์— ์ €์žฅ

    ์ด๋ผ๋Š” ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด๋‹ค.

     

    1) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

    - ํ”„๋กœ์ ํŠธ ํ„ฐ๋ฏธ๋„์— ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์„ค์น˜ํ•œ๋‹ค.

    npm install mongodb@5

     

    2) ์„œ๋ฒ„ํŒŒ์ผ ์ˆ˜์ •

    - server.js(์„œ๋ฒ„ํŒŒ์ผ)์˜ ์ƒ๋‹จ์— ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.

    const { MongoClient } = require('mongodb')
    
    let db;
    const url = 'MongoDB ์‚ฌ์ดํŠธ์— ๋“ฑ๋ก๋œ DB ์ ‘์† URL'
    new MongoClient(url).connect().then((client)=>{
      console.log("DB connected");
      db = client.db('forum') //์„ค์ •ํ•œ db ์ด๋ฆ„
    
      //app.listen๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ด์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด ๋” ์•ˆ์ •์ ์ž„!
      app.listen(8080, () => {
        console.log('http://localhost:8080 ์—์„œ ์„œ๋ฒ„ ์‹คํ–‰์ค‘!')
      })
    
    }).catch((err)=>{
      console.error(err);
    })

     

    ์ด๋•Œ url ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ฃผ์†Œ๋Š” MongoDB ์‚ฌ์ดํŠธ์˜ DB์—์„œ connect ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    connet ๋ฒ„ํŠผ

     

    ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฃผ์†Œ๊ฐ€ ์žˆ๋Š”๋ฐ

    "mongodb+srv://<DB์ ‘์†์•„์ด๋””>:<๊ทธ ์•„์ด๋””์˜ password>@cluster0.aoikrmx.mongodb.net/?retryWrites=true&w=majority"

    ์ ‘์† ์•„์ด๋””์™€ ๊ทธ ์•„์ด๋””์˜ password๋ฅผ ์ž˜ ์ž…๋ ฅํ•ด์•ผํ•œ๋‹ค.

    ์ด๋•Œ ์•„์ด๋””, pw ๋Š” [DatabaseAccess]์— ๋“ฑ๋ก๋œ ์œ ์ €์— ๋Œ€ํ•œ ์ •๋ณด์ด๋‹ค.

     

     

    3) ํ™•์ธํ•ด๋ณด๊ธฐ

    ๊ฐ„๋‹จํ•˜๊ฒŒ ์—ฐ๊ฒฐ์ด ๋˜์—ˆ๋Š”์ง€ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•ด๊ธฐ ์œ„ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž.

    app.get('/news', (request, response) => {
      db.collection('post').insertOne({title: '์˜ค๋Š˜์˜ ๋‚ ์”จ'});
    })

     

    ์ด์ œ ์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•ด๋ณด๋ฉด ๋œ๋‹ค!

    ๋Œ“๊ธ€