본문 바로가기
개발/Node.js

[Node.js] 익스프레스에서 몽고디비 사용법 3 - 몽구스로 DB 다루기

by 윤호 2021. 1. 7.

저번 몽고디비 사용법 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 프로그래밍'을 공부한 내용입니다.

댓글