🔥TIL #5. mongoDB와 mongoose

백승진·2020년 12월 27일
0

NodeJS

목록 보기
5/7

🌟 Today I learned

  1. mongoDB 란?
  2. mongoDB 설치 및 node.js 에서 사용하기
  3. mongoose 란?
  4. node.js 에서 mongoose 사용하기

1. mongoDB 란?

mongoDB는 Document-oriented NoSQL Database 이다.
NoSQL 이란 'Not only SQL'의 약자로 기존의 RDBMS의 한계를 극복하기 위한 새로운 Database 이다.
Document는 RDBMS의 record와 비슷한 개념으로 JSON objects 형태의 key/value 쌍으로 이루어진 데이터 구조로 구성된다. Document는 '_id' 라는 고유 값을 가지며 value로 document, array, document array를 가질 수 있다. Document의 형태는 아래와 같다

{
  'id':ObjectId("88EKASD32...."),
  'name':{'first':'Ray', 'last':'Allen'},
  'birthday': new Date('April 11, 1978'),
  'bobby':['baseball', 'computer game']
}

Document들의 집합으로 구성되는 것을 'Collection'이라 부르며 RDBMS의 table과 유사하다.


RDBMS와의 차이점

  1. schema-less하다. RDBMS는 table을 기준으로 records는 동일한 schema를 가져야 하나 NoSQL은 각 document가 필요시 고유의 Field를 가질 수 있다. 그래서 유연하게 Field를 추가/수정/삭제할 수 있다.
  2. JOIN 기능이 없다. RDMBS는 JOIN 기능을 통해 하나의 Data를 여러 Table에 분산시켜 관리하는 데 효과적이나 NoSQL은 하나의 Document에 최대한 많은 data를 넣는다. 해서 CRUD query에 대해 고속으로 동작한다.
  3. scalability(규모 가변성, 확장성)이 우수하고 sharding(여러 Database에 data 분할) cluster 구축이 가능함.

2. mongoDB 설치 및 node.js 에서 사용하기

mongoDB 설치는 링크 참고

  1. mongoDB package 설치 후 다음처럼 Node.js에서 client를 생성, mongodb에 접근할 수 있다.
npm install mongoDB
const MongoClient = require('mongodb').MongoClient
let database

const connectDB = () => {
  const databaseUrl = 'mongodb://localhost:27017/local' // mongodb://{IP}:{Port}/{database}
  MongoClient.connect(databaseUrl, (err, db) => {
    if (err) throw err
   
    console.log('Database에 연결 : ' + databaseUrl)
    database = db
  })
}

connectDB()

let users = database.collection('user')
users.find({'id':id, 'password':password}, (err, docs) => {...}) // select
users.insertMany{[{'id':new_id, 'password':new_password]}.ToArray((err, docs) => {...}) // create

3. mongoose 란?

schema_less은 NoSQL의 특징이다. 이는 장점이면서 동시에 단점이기도 하다.
예로 우리가 Collection을 조회할 때 안의 Document 들이 각자 다른 field를 가지고 있다면 검색이 용이하지 않을 것이다. 동일한 schema를 가지는 document들의 collection은 속성을 미리 알고 있으므로 검색이 용이하다.
Document의 schema를 만들고 Javascript의 객체와 Mapping 시킬 수 있다면 CRUD가 더욱 용이할 것이다. 이것을 Object Mapper라 하며 mongoose는 가장 많이 사용되는 Object Mapper이다.
mongoose를 설치방법은 아래와 같다.

npm install mongoose --save

mongoose는 대표적으로 아래 Method를 제공한다.

  1. connect(uri(s), [options], [callback])
    database 연결 및 mongoose.connection 객체를 통해 연결 관련 event를 처리 할 수 있다.
  2. Schema()
    Schema 정의하는 생성자.
  3. model(name, [schema], [collection], [skipInit])
    model 정의. [collection]이 지정되면 이를 이용, 미지정시 name으로 유추한 collection 사용

4. node.js 에서 mongoose 사용하기

  1. database 연결 및 event 처리
let database
let UserSchema
let UserModel

const connectDB = () => {
	const databaseUrl = 'mongodb://localhost:27017/local' 

    	mongoose.connect(databaseUrl)
    	database = mongoose.connection

        database.on('error', console.error.bind(console. 'mongoose connection error')
        database.on('open', () => {console.log("connect database")})
        database.on('disconnect', () => {
          	console.log('disconnect database. retry to connect after 5 seconds')
          	setInterval(connectDB, 5000)
        })
 
  	UserSchema = mongoose.Schema({
    	      id: {type:String, require:true, unique:true},
              password: {type:String, require:true},
              name: String,              
        })

  	UserModel = mongoose.model('users', UserSchema)
}

Schema 생성시 속성에 간단히 타입을 넣을 수도 있지만 구체적인 정보를 넣을 수도 있다.

  1. type : 자료형
  2. required : 값이 true이면 반드시 들어가야 하는 속성을 의미
  3. unique : 값이 true이면 이 속성에 고유한 값이 들어가야 함을 의미

  1. UserModel로 database 제어하기
// User 정보 찾기
UserModel.find({"id":id, "password":password}, (err, results) => {
  res.status(200).json({result})
})
// User 정보 추가
createdUser = new UserModel({"id":new_id, "password":new_password, "name":'Jim carry'}
createdUser.save()
profile
12년 .NET 개발 경력을 가진 웹 초짜 개발자입니다 :)

0개의 댓글