1. 몽구스 모듈 사용하기
- 자바스크립트 객체와 데이터베이스 객체를 서로 매칭하여 바꿀 수 있게 하는 것을 오브젝터 맵퍼(Object Mapper)라고 합니다. 이 중에서 가장 만힝 사용하는 것이 바로 몽구스(mongoose) 모듈입니다.
- npm install mongoose --save
- mongoose 모듈에서 사용할 수 있는 대표적인 메소드
메소드 이름 |
설명 |
connect(uri(s), [options], [callback]) |
mongoose를 사용해 데이터베이스에 연결합니다. 연결 후에는 mongoose.connection 객체를 사용해 연결 관련 이벤트를 처리할 수 있습니다. |
Schema() |
스키마를 정의하는 생성자 |
model(name, [schema], [collection], [skipInit]) |
모델을 정의합니다. [collection]이 지정되면 이 컬렉션을 사용하며, 지정하지 않으면 name으로 유추한 컬렉션을 사용합니다. |
- mongoose에서 스키마를 정의할 때 각 속성에 사용할 수 있는 스키마 타입
스키마 타입 |
설명 |
String |
문자열 타입 |
Number |
숫자 타입 |
Boolean |
이진 타입 |
Array |
배열 타입 |
Buffer |
버퍼 타입 바이너리 데이터를 저장할 수 있습니다. |
Date |
날짜 타입 |
ObjectId |
각 문서 (Document)마다 만들어진 ObjectId를 저장할 수 있는 타입 |
Mixed |
혼합 타입 |
- 중괄호 안에 넣은 속성 이름이 갖는 의미
속성 이름 |
설명 |
type |
자료형을 지정 |
required |
값이 true이면 반드시 들어가야 하는 속성 |
unique |
값이 true이면 이 속성에 고유한 값이 들어가야 한다. |
// 스키마 정의 UserSchema = mongoose.Schema({ id: String, name: String, password: String }); console.log('UserSchema 정의함.'); // UserModel 모델 정의 UserModel = mongoose.model("users", UserSchema); |
models() 메소드의 첫 번째 파라미터로는 모델 이름이 전달되고 두 번째 파라미터에는 스키마 객체가 전달됩니다. UserModel 모델에서의 'users'는 users 컬렉션을 지정이라는 뜻이고 UserSchema는 앞서 만들었던 스키마 객체를 가르키게 됩니다. |
- mongoose에서 데이터를 처리를 위해 사용하는 대표적인 메소드
메소드 이름 |
설명 |
find([criteria], [callback]) |
조회 조건을 사용해 컬렉션의 데이터를 조회합니다. 조회 결과는 콜백 함수로 전달됩니다. |
save([options], [callback]) |
모델 인스턴스 객체의 데이터를 저장합니다. 저장 결과는 콜백 함수로 전달됩니다. |
update([criteria], [doc], [options], [callback]) |
컬렉션의 데이터를 조회한 후 업데이트합니다. where() 메소드와 함께 사용됩니다. |
remove([criteria], [callback]) |
컬렉션의 데이터를 삭제합니다. |
update문 예시) UserModel.where({id;'test'01}).update({name:'애프터스쿨'},function(err.....){...}) |
//사용자를 추가하는 함수 var addUser = function(database, id, password, name, callback) { console.log('addUser 호출됨 : ' + id + ', ' + password + ', ' + name);
// UserModel 인스턴스 생성 var user = new UserModel({"id":id, "password":password, "name":name}); // save()로 저장 : 저장 성공 시 addedUser 객체가 파라미터로 전달됨 user.save(function(err, addedUser) { if (err) { callback(err, null); return; }
console.log("사용자 데이터 추가함."); callback(null, addedUser);
}); }; |
var UserSchema = new mongoose.Schema({ id : {type: String, required : true, unique : true}, password : {type : String , required : true}, name : {type : String, index : 'hashed'}, age : Number, created_at : {type : Date, index : {unique : false, expires : '1d'}}, updated_at : Date }); 인덱스를 사용하면 검색 속도가 빨라지므로 조회가 필요한 속성에는 인덱스를 만들어 두는 것이 좋습니다. 위치 기반 서비스를 위해 저장되는 경위도 좌표에는 공간 인덱싱을 사용해야 하며 {type : [Number], index : '2d', spares : true}와 같은 형태로 객체를 만들어 설정할 수 있습니다. |
- mongoose 스키마에서 메소드를 추가하는 두 가지 방법
메소드 이름 |
설명 |
static(name, fn) |
모델 객체에서 사용할 수 있는 함수를 등록합니다. 함수의 이름과 함수 객체를 파라미터로 전달합니다. |
method(name, fn) |
모델 인스턴스 객체에서 사용할 수 있는 함수를 등록합니다. 함수의 이름과 함수 객체를 파라미터로 전달합니다. |
2. 비밀번호 암호화하기(단방향 암호)
mongoose에서 제공하는 virtual() 함수를 사용하면 쉽게 할수있다.
//===== 모듈 불러들이기 =====// var mongodb = require('mongodb'); var mongoose = require('mongoose'); //===== 데이터베이스 연결 =====// var database; var UserSchema; var UserModel; //데이터베이스에 연결하고 응답 객체의 속성으로 db 객체 추가 function connectDB() { // 데이터베이스 연결 정보 var databaseUrl = 'mongodb://localhost:27017/local'; mongoose.Promise = global.Promise; // mongoose의 Promise 객체는 global의 Promise 객체 사용하도록 함 // 데이터베이스 연결 mongoose.connect(databaseUrl, { useMongoClient: true }); database = mongoose.connection;
database.on('error', console.error.bind(console, 'mongoose connection error.')); database.on('open', function () { console.log('데이터베이스에 연결되었습니다. : ' + databaseUrl);
// user 스키마 및 모델 객체 생성 createUserSchema();
// test 진행함 doTest();
}); database.on('disconnected', connectDB); } // user 스키마 및 모델 객체 생성 function createUserSchema() { // 스키마 정의 // password를 hashed_password로 변경, default 속성 모두 추가, salt 속성 추가 UserSchema = mongoose.Schema({ id: {type: String, required: true, unique: true}, name: {type: String, index: 'hashed', 'default':''}, age: {type: Number, 'default': -1}, created_at: {type: Date, index: {unique: false}, 'default': Date.now}, updated_at: {type: Date, index: {unique: false}, 'default': Date.now} });
// info를 virtual 메소드로 정의 UserSchema .virtual('info') .set(function(info) { var splitted = info.split(' '); this.id = splitted[0]; this.name = splitted[1]; console.log('virtual info 설정함 : %s, %s', this.id, this.name); }) .get(function() { return this.id + ' ' + this.name });
console.log('UserSchema 정의함.');
// UserModel 모델 정의 UserModel = mongoose.model("users4", UserSchema); console.log('UserModel 정의함.');
} function doTest() { // UserModel 인스턴스 생성 // id, name 속성은 할당하지 않고 info 속성만 할당함 var user = new UserModel({"info":'test03 소녀시대3'}); // save()로 저장 user.save(function(err) { if (err) {throw err;}
console.log("사용자 데이터 추가함."); findAll(); });
console.log('info 속성에 값 할당함.'); console.log('id : %s, name : %s', user.id, user.name); } function findAll() { UserModel.find({}, function(err, results) { if (err) {throw err;}
if (results) { console.log('조회된 user 문서 객체 #0 -> id : %s, name : %s', results[0]._doc.id, results[0]._doc.name); } }); } // connectDB 호출 connectDB(); |
에러) (node:8912) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/4.x/docs/connections.html#use-mongo-client { useMongoClient: true} 추가 (node:8912) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html mongoose.Promise = global.Promise; 추가 |