저번 몽고디비 사용법 2에 이어서 알아보겠습니다.
목표
- 몽구스와 스키마
- 몽구스로 DB 연결 및 모델 정의
- 몽구스로 DB 문서 추가와 조회
몽구스와 스키마
몽고디비는 한 컬렉션에 여러 문서를 저장하는데, 이 문서들의 속성이 제각각으로 저장할 수도 있습니다. 이렇게 되면 문서가 어떤 속성을 갖고있는지 알기 힘들기 때문에 데이터를 조회할 때 어려움이 생깁니다. 이 때문에 문서를 저장할 때 일정한 틀이 있어야하는데 이를 제공하는 대표적인 모델이 몽구스(mongoose)입니다. 그리고 이런 틀을 스키마(Schema)라고 합니다.
몽구스로 스키마를 정의하고, 이를 사용할 컬렉션과 매핑하기 위해 모델을 정의합니다. 그리고 이 모델을 통해 문서를 저장할 수 있습니다.
몽구스로 DB 연결 및 모델 정의
먼저 % npm install mongoose --save 로 몽구스 모듈을 설치합니다.
다음은 몽구스로 DB에 연결하는 코드입니다.
var mongoose = require('mongoose');
var database;
var UserSchema; // 데이터베이스 객체를 위한 변수 선언
var UserModel; // 데이터베이스 모델 객체를 위한 변수 선언
function connectDB(){
// 데이터베이스 연결 정보
var databaseUrl = 'mongodb://localhost:27017/local';
// 데이터베이스 연결
console.log('데이터베이스 연결을 시도합니다.');
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);
// 스키마 및 모델 정의
...
});
}
코드가 몇 줄 추가된 것 말곤 몽고디비 사용법1에서 본 연결 방법과 크게 다르지 않습니다. DB 객체 생성 후 on 메소드로 DB를 연결할 수 있습니다. 이후 스키마와 모델을 정의할 수 있습니다. 또한 static 함수도 정의할 수 있습니다.
다음은 스키마와 모델을 정의하는 코드입니다.
//스키마 정의
UserSchema = mongoose.Schema({
id: {type: String, required: true, unique: true},
password: {type: String, required: true},
name: {type: String, index: 'hashed'},
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},
});
console.log('UserSchema 정의함');
//UserModel 모델 정의
UserModel = mongoose.model('users2', UserSchema);
console.log('UserModel 정의함');
Schema 메소드로 스키마를 정의할 수 있습니다. 기본적으로 {속성: 타입}으로 정의할 수 있습니다. (ex id: String) 위 코드에선 인자에 조건을 추가로 줬습니다.
- required : 해당 속성(조건을 준 속성)을 필수 속성으로 지정합니다.
- unique : 해당 속성를 컬렉션 내에서 고유한 값을 갖도록 합니다.
- index : 해당 속성에 인덱스를 부여합니다.
- default : 해당 속성의 기본 값을 지정합니다.
스키마를 정의한 후, 모델을 정의 합니다. 코드에선 user2 컬렉션이 해당 스키마를 사용하도록 모델을 정의했습니다.
static 함수는 다음과 같이 정의하고 사용합니다. 해당 스키마를 모델에 추가하기 전에 정의합니다.
// 스키마에 static 메소드 추가
// id를 받아 해당하는 문서를 찾는 static 함수 정의
UserSchema.static('findById', function(id, callback){
return this.find({id: id}, callback);
});
// 정의한 static 함수 사용
UserSchema.findById()
몽구스로 DB 문서 추가와 조회
다음과 같이 문서를 추가할 수 있다.
var id = 'yoonho'
var password = '1111'
// UserModel의 인스턴스 생성
var user = new UserModel({'id': id, 'password': password, 'name': name});
// save()로 저장
user.save(function(err){
if(err){
callback(err, null);
return;
}
console.log('사용자 데이터 추가함');
callback(null, user);
});
다음과 같이 문서를 조회할 수 있다.
var id = 'yoonho'
var password = '1111'
// 아이디와 비밀번호를 사용해 조회
UserModel.find({'id': id, 'password': password}, function(err, results){
if(err){
callback(err, null)
return;
}
...
})
요약
- 스키마란 데이터를 저장하는 일정한 틀임
- 몽구스로 스키마와 모델을 정의할 수 있음
- 스키마에 static 함수를 정의할 수 있음
'Do it! Node.js 프로그래밍'을 공부한 내용입니다.
'개발 > Node.js' 카테고리의 다른 글
[Node.js] 뷰 템플릿 적용하기 - ejs 뷰 (2) | 2021.01.11 |
---|---|
[Node.js] windows에서 노드 버전 변경 - downgrade/upgrade (1) | 2021.01.11 |
[Node.js] 익스프레스에서 몽고디비 사용법 4 - 비밀번호 암호화 (0) | 2021.01.08 |
[Node.js] 익스프레스에서 몽고디비 사용법 2 - 문서 추가와 조회 (0) | 2021.01.05 |
[Node.js] 익스프레스에서 몽고디비 사용법 1 - 데이터베이스 연결 (0) | 2021.01.04 |
댓글