1. 비밀번호 암호화하여 저장하는 코드 적용하기
% npm install crypto --save
노드는 암호화를 위해 crypto 모듈을 제공
// crypto 모듈 불러들이기 var crypto = require('crypto'); |
//데이터베이스에 연결 function connectDB() { // 데이터베이스 연결 정보 var databaseUrl = 'mongodb://localhost:27017/local';
// 데이터베이스 연결 console.log('데이터베이스 연결을 시도합니다.'); mongoose.Promise = global.Promise; // mongoose의 Promise 객체는 global의 Promise 객체 사용하도록 함 mongoose.connect(databaseUrl); database = mongoose.connection;
database.on('error', console.error.bind(console, 'mongoose connection error.')); database.on('open', function () { console.log('데이터베이스에 연결되었습니다. : ' + databaseUrl);
// user 스키마 및 모델 객체 생성 createUserSchema();
});
// 연결 끊어졌을 때 5초 후 재연결 database.on('disconnected', function() { console.log('연결이 끊어졌습니다. 5초 후 재연결합니다.'); setInterval(connectDB, 5000); }); } |
// user 스키마 및 모델 객체 생성 function createUserSchema() { // 스키마 정의 // password를 hashed_password로 변경, 각 칼럼에 default 속성 모두 추가, salt 속성 추가 UserSchema = mongoose.Schema({ id: {type: String, required: true, unique: true, 'default':''}, hashed_password: {type: String, required: true, 'default':''}, salt: {type:String, required: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} });
// password를 virtual 메소드로 정의 : MongoDB에 저장되지 않는 가상 속성임. // 특정 속성을 지정하고 set, get 메소드를 정의함 UserSchema .virtual('password') .set(function(password) { this._password = password; this.salt = this.makeSalt(); this.hashed_password = this.encryptPassword(password); console.log('virtual password의 set 호출됨 : ' + this.hashed_password); }) .get(function() { console.log('virtual password의 get 호출됨.'); return this._password; });
// 스키마에 모델 인스턴스에서 사용할 수 있는 메소드 추가 // 비밀번호 암호화 메소드 UserSchema.method('encryptPassword', function(plainText, inSalt) { if (inSalt) { return crypto.createHmac('sha1', inSalt).update(plainText).digest('hex'); } else { return crypto.createHmac('sha1', this.salt).update(plainText).digest('hex'); } });
// salt 값 만들기 메소드 UserSchema.method('makeSalt', function() { return Math.round((new Date().valueOf() * Math.random())) + ''; });
// 인증 메소드 - 입력된 비밀번호와 비교 (true/false 리턴) UserSchema.method('authenticate', function(plainText, inSalt, hashed_password) { if (inSalt) { console.log('authenticate 호출됨 : %s -> %s : %s', plainText, this.encryptPassword(plainText, inSalt), hashed_password); return this.encryptPassword(plainText, inSalt) === hashed_password; } else { console.log('authenticate 호출됨 : %s -> %s : %s', plainText, this.encryptPassword(plainText), this.hashed_password); return this.encryptPassword(plainText) === this.hashed_password; } }); // 값이 유효한지 확인하는 함수 정의 var validatePresenceOf = function(value) { return value && value.length; };
// 저장 시의 트리거 함수 정의 (password 필드가 유효하지 않으면 에러 발생) UserSchema.pre('save', function(next) { if (!this.isNew) return next(); if (!validatePresenceOf(this.password)) { next(new Error('유효하지 않은 password 필드입니다.')); } else { next(); } })
// 필수 속성에 대한 유효성 확인 (길이값 체크) UserSchema.path('id').validate(function (id) { return id.length; }, 'id 칼럼의 값이 없습니다.');
UserSchema.path('name').validate(function (name) { return name.length; }, 'name 칼럼의 값이 없습니다.');
UserSchema.path('hashed_password').validate(function (hashed_password) { return hashed_password.length; }, 'hashed_password 칼럼의 값이 없습니다.');
// 스키마에 static으로 findById 메소드 추가 UserSchema.static('findById', function(id, callback) { return this.find({id:id}, callback); });
// 스키마에 static으로 findAll 메소드 추가 UserSchema.static('findAll', function(callback) { return this.find({}, callback); });
console.log('UserSchema 정의함.');
// User 모델 정의 UserModel = mongoose.model("users3", UserSchema); console.log('users3 정의함.');
} |
|
|
2. MySql 데이터베이스 사용하기
- 커넥션 풀을 만들 때 전달하는 개체 속성
속성 |
설명 |
connectionLimit |
커넥션 풀에서 만들 수 있는 최대 연결 개수를 설정합니다. |
host |
연결할 호스트 이름을 설정합니다. 내 컴퓨터인 경우 localhost 또는 127.0.0.1 |
port |
데이터베이스가 사용하는 포트 번호를 설정 |
user |
데이터베이스 사용자 아이디 설정 |
password |
데이터베이스 사용자의 비밀번호를 설정 |
database |
데이터베이스 이름을 설정 |
debug |
데이터베이스 처리 과정을 로그로 남길 것인지 설정 |
관계형 데이터베이스에 연결할 떄는 보통 커넥션 풀(Connection Pool)을 사용합니다. 이것은 데이터베이스 연결 객체가 너무 많이 만들어지는 것을 막고 한번 만든 연결을 다시 사용할 수 있게 합니다. 커넥션푸을 만들려면 mysql모듈의 createPool 메소드를 호출해서 옵션 정보가 있는 개체를 넣어줍니다.
//===== MySQL 데이터베이스를 사용할 수 있도록 하는 mysql 모듈 불러오기 =====// var mysql = require('mysql'); //===== MySQL 데이터베이스 연결 설정 =====// var pool = mysql.createPool({ connectionLimit : 10, host : 'localhost', user : 'root', password : 'root', database : 'test', debug : false }); |