본문 바로가기
학원에서 배운 것/DBMS MongoDB

KDT 5th 웹개발자 입문 수업 31일차 - 2

by 쿠리의일상 2023. 3. 20.

MongoDB

Document Oriented 문서지향적 데이터베이스

뛰어난 확장성과 성능 자랑

 

NoSQL -> Not Only SQL

기존 RDBMS의 한계를 극복하기 위하여 만들어진 새로운 형태의 데이터저장소로 관계형 DB가 아니므로 고정된 스키마 및 JOIN이 존재하지 않는다.

 

  • Document
  • BASE
  • Open source

 

 

장점 단점
DATA를 JSON 형태로 처리 -> 빠르게 JSON 전환 가능 표준이 없음 = 제약이 없음
DB 구조의 변경 용이 데이터가 구조화 되어 있지 않음 (단순한 구조의 쿼리만 사용 가능)
제약이 없기에 높은 수평 확장성, 스키마 설계의 유연성 데이터의 일관성 및 안정성을 DB가 아닌 APP레벨에서 관리해줘야 함, 버그 발생 확률 높음

 

Document는 동적 스키마를 가지고 있고, 같은 Collection 안에 있는 Document 끼리 다른 스키마를 가지고 있을 수 있다.

즉, 서로 다른 데이터(다른 key)를 가지고 있을 수 있다.

 

 

MongoDB의 구조

Database -> Collection -> Document -> Field 계층으로 구성

Collection

MongoDB의 Document의 그룹 의미

Collection 내부에 Document들이 위치하고 있다.

RDMS의 table과 비슷한 개념이다.

 

Document

RDBMS의 행(row)에 해당

MongoDB는 BSON으로 데이터가 쌓이기 때문에 Array 데이터나 nested한 데이터를 쉽게 넣을 수 있다.

 

 

MongoDB Atlas 웹 클라우드 사용하기

https://www.mongodb.com/ko-kr/cloud/atlas/efficiency

 

MongoDB Atlas 운영 효율성

MongoDB Atlas에서는 운영 모범 사례가 기본적으로 제공되기 때문에 데이터베이스 관리 작업을 줄이고 비즈니스 가치 창출 및 애플리케이션 개발 가속화에 집중할 수 있습니다.

www.mongodb.com

 

구글로 가입하기 FREE, AWS
가입이 끝나면 Connet를 눌러 Connect your application 을 클릭
해당 코드를 컨트롤러에 파일로 만들어준다.

const { MongoClient, ServerApiVersion } = require('mongodb');
const uri = "mongodb+srv://유저명:패스워드@cluster0.y4isdtc.mongodb.net/?retryWrites=true&w=majority";
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });
client.connect(err => {
  const collection = client.db("test").collection("devices");
  // perform actions on the collection object
  client.close();
});

 

만들어준 collection을 출력해주면,

Collection {
  s: {
    db: Db { s: [Object] },
    options: {
      raw: false,
      promoteLongs: true,
      promoteValues: true,
      promoteBuffers: false,
      ignoreUndefined: false,
      bsonRegExp: false,
      serializeFunctions: false,
      fieldsAsRaw: {},
      writeConcern: [WriteConcern],
      readPreference: [ReadPreference]
    },
    namespace: MongoDBNamespace { db: 'kdt5', collection: 'test' },
    pkFactory: { createPk: [Function: createPk] },
    readPreference: ReadPreference {
      mode: 'primary',
      tags: undefined,
      hedge: undefined,
      maxStalenessSeconds: undefined,
      minWireVersion: undefined
    },
    bsonOptions: {
      raw: false,
      promoteLongs: true,
      promoteValues: true,
      promoteBuffers: false,
      ignoreUndefined: false,
      bsonRegExp: false,
      serializeFunctions: false,
      fieldsAsRaw: {}
    },
    readConcern: undefined,
    writeConcern: WriteConcern { w: 'majority' },
    slaveOk: false
  }
}

 

mongoDB 패키지 설치

npm i -S mongodb@4.0.0 으로 설치

- 4.0.0 버전을 설치하여 콜백으로 연습하고

- 5.0 이상 버전에선 콜백을 지원하지 않으므로 async await를 쓰도록 한다.

 

 

client.connect((err) => {
  const collection = client.db('kdt5').collection('test');

  client.close();
});

해당 코드로 인하여 kdt5라는 db에 test라는 collection이 생기도록 만들 수 있다.

 

즉, 몽고db의 구조에 따라 가장 먼저 db명을 써주고 collection명을 써줘서 컬렉션을 만들어줄 수 있다.

JSON과 유사한 구조라 다루기 편함

 

insertMany([{ }, { }, ...], (err, result) => { });

많은 데이터(Document)를 한꺼번에 삽입

해당 쿼리의 성공 여부는 리턴된 객체(result)의 acknowledged 값을 통해 확인 가능

acknowledged 값이 true면 성공한 것임

 

하나의 데이터를 삽입할 땐, insertOne({ }, (err, result) => { }); 을 사용

 

deleteMany({조건들}, (err, result) => { });

많은 데이터를 한꺼번에 삭제,

데이터베이스를 한번에 정리할 때 사용해줌

해당 쿼리의 성공 여부는 리턴된 객체(result)의 acknowledged 값을 통해 확인 가능

조건 객체를 채우지 않으면 모든 데이터가 삭제된다.

 

const { MongoClient, ServerApiVersion } = require('mongodb');
const uri =
  'mongodb+srv://guseulgi:qwer1234@cluster0.y4isdtc.mongodb.net/?retryWrites=true&w=majority';
const client = new MongoClient(uri, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  serverApi: ServerApiVersion.v1,
});
client.connect((err) => {
  const collection = client.db('kdt5').collection('test');
  collection.deleteMany({}, (deleteErr, deleteResult) => {
    if (deleteErr) throw deleteErr;
    console.log('deleteResult', deleteResult);
    collection.insertOne(
      {
        name: '이름',
        nickName: '닉네임',
      },
      (insertErr, insertResult) => {
        if (insertErr) throw insertErr;
        console.log('insertResult', insertResult);
        client.close();
      }
    );
  });
});

이렇게 만든 데이터베이스는 nodemon으로 해당 파일을 실행해준 뒤,

몽고db 아틀라스의 Browse Collections로 확인이 가능하다.

 

 

find([{ 조건들 }])

조건에 부합하는 데이터(Document)를 가져다 준다.

바로 데이터를 저장하는 것이 아니라 해당 데이터의 위치를 알려주는 cursor 형태로 가져온다.

그 커서를 배열로 바꿔준 다음 매개변수로 err 와 data를 넣어서 처리해준다.

data에 조건에 부합하는 데이터들이 담긴다.

        const findCursor = collection.find({});
        findCursor.toArray((err, data) => {
          console.log(data);
        });