- mongoDB 란?
- mongoDB 설치 및 node.js 에서 사용하기
- mongoose 란?
- node.js 에서 mongoose 사용하기
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와의 차이점
- schema-less하다. RDBMS는 table을 기준으로 records는 동일한 schema를 가져야 하나 NoSQL은 각 document가 필요시 고유의 Field를 가질 수 있다. 그래서 유연하게 Field를 추가/수정/삭제할 수 있다.
- JOIN 기능이 없다. RDMBS는 JOIN 기능을 통해 하나의 Data를 여러 Table에 분산시켜 관리하는 데 효과적이나 NoSQL은 하나의 Document에 최대한 많은 data를 넣는다. 해서 CRUD query에 대해 고속으로 동작한다.
- scalability(규모 가변성, 확장성)이 우수하고 sharding(여러 Database에 data 분할) cluster 구축이 가능함.
mongoDB 설치는 링크 참고
- 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
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를 제공한다.
- connect(uri(s), [options], [callback])
database 연결 및 mongoose.connection 객체를 통해 연결 관련 event를 처리 할 수 있다.- Schema()
Schema 정의하는 생성자.- model(name, [schema], [collection], [skipInit])
model 정의. [collection]이 지정되면 이를 이용, 미지정시 name으로 유추한 collection 사용
- 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 생성시 속성에 간단히 타입을 넣을 수도 있지만 구체적인 정보를 넣을 수도 있다.
- type : 자료형
- required : 값이 true이면 반드시 들어가야 하는 속성을 의미
- unique : 값이 true이면 이 속성에 고유한 값이 들어가야 함을 의미
- 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()