8. MongoDB와 Mongoose

최상민·2023년 9월 15일
0

Node.js 교과서

목록 보기
8/9
post-thumbnail

저번에 RDBMS의 MySQL과 Sequelize에 대해서 알아보았다.

이번엔 NoSQL중 하나인 몽고디비(mongoDB)와 Mongoose에 대해 알아보자.

NoSQL

NoSQL은 SQL을 사용하지 않는 데이터베이스로 Not only SQL을 줄여서 NoSQL이라고 부른다.
그 중 대표적인 데이터베이스로 몽고디비가 있다.

NoSQL과 SQL

SQL을 사용하는 대표적인 데이터베이스는 저번에 알아본 MySQL 등이 있고, SQL을 사용하지 않는 NoSQL은 대표적으로 몽고디비가 있는데, SQL과 NoSQL은 여러 측면에서 다르다. 그 중에서 대표적인 차이점을 알아보자.

  • NoSQL에는 고정된 테이블이 없다. 컬렉션이라는 개념이 있지만, MySQL 테이블을 만들 때 컬럼과 자료형, 옵션 등을 정의하지만, 몽고디비는 그냥 컬렉션을 만들고 끝이다. 또한 컬렉션에는 어떠한 데이터든 들어갈 수 있다.

  • 몽고디비에는 JOIN 기능이 없다. JOIN을 흉내 낼 수는 있지만 하나의 쿼리로 여러 테이블을 합치는 작업이 항상 가능하진 않다. 또한 동시에 쿼리를 수행하는 경우 쿼리가 섞여 예상치 못한 결과를 낼 수 있는 단점이 있다.

단점이 있음에도 확장성과 가용성이 좋기 대문에 몽고디비를 사용한다. 데이터의 일관성을 보장해주는 기능이 약한 대신 데이터를 빠르게 넣을 수 있고, 쉽게 여러 서버에 데이터를 분산할 수 있다.

  • MySQL의 테이블, 로우, 컬럼을 몽고디비에서는 컬렉션, 다큐먼트, 필드라고 부른다.

MongoDB

몽고디비의 특징 중 하나는 자바스크립트 문법을 사용한다는 것이다. 몽고디비를 설치하여 사용해보자.

MongoDB 공식 사이트인 https://www.mongodb.com/try/download/community 에서 MongoDB를 설치할 수 있다.

설치가 완료된 후 서버를 실행하기 전 데이터가 저장될 폴더(C:\data\db)를 먼저 만든다.

몽고디비가 설치된 경로(경로를 따로 설정하지 않았다면 기본적으로 C:\Program Files\MongoDB\Server\6.0\bin)으로 이동해서 몽고디비를 실행한다.

※ C:\data\db 폴더가 없으면 실행되지 않습니다!

실행 후 콘솔에서 mongod --ipv6 명령어를 입력해 몽고디비를 실행한다.

//콘솔

$ cd "C:\Program Files\MongoDB\Server\6.0\bin"
$ mongod --ipv6
~~~~~~~~~~~~~~~~~
(생략)
~~~~~~~~~~~~~~~~~

에러 메세지 없이 계속 실행 중이라면 성공한 것이며 기본적으로 27017번 포트에서 실행된다.
몽고디비를 사용할 일이 있으면 mongod --ipv6 명령어로 서버를 먼저 실행하자.

몽고디비를 실행한 후 몽고디비 셸을 실행해야 한다.
몽고디비 셸은 https://mongodb.com/try/download/shell 에서 설치할 수 있다.

Platform에서 자신의 운영체제에 맞는 것을 선택하여 설치한다.

설치과정에서 설치 경로 화면이 나오면 기본적으로 적혀있는 경로를 복사해두자.

설치가 끝나면 아래와 같이 명령 프롬프트를 열어 몽고디비 셸을 실행한다.

//콘솔

$ cd (설치 과정에서 복사한 경로)
$ mongosh
~~~~~~~~~~~~~~~~
(생략)
~~~~~~~~~~~~~~~~
test>

프롬프트가 test>로 바뀌었다면 성공한 것이다. 누구나 몽고디비에 접속할 수 있으므로 관리자 계정을 추가한다.

test> use admin
switched to db admin
admin> db.createUser({ user: '이름', pwd: '비밀번호', roles: ['root'] })
Successfully added user: { "user" : "root", "roles" : [ "root" ] }

db.createUser 메서드로 계정을 생성할 수 있다. roles는 권한 부여에 관한 설정으로 모든 권한이 있는 root를 부여하였다.

mongod --ipv6를 입력했던 콘솔을 종료한 뒤, mongod --ipv6 --auth 명령어를 입력하여 새로 접속한다.

mongosh를 입력한 콘솔도 종료 후, 다시 mongosh admin -u 이름 -p 비밀번호 명령어로 접속한다.

잘 접속이 되었다면 앞으로 몽고디비 프롬프트를 이용할 때는 단순히 mongosh만 입력하면 된다.

MongoDB 컴퍼스

MySQL 워크벤치와 같이 몽고디비 관리도구로 컴퍼스를 제공한다.
컴퍼스는 몽고디비 공식 사이트 https://mongodb.com/download-center/compass 에서 내려받을 수 있다.

윈도우의 경우 몽고디비 설치 과정에서 Install MongoDB Compass를 체크하였다면 함께 설치되므로 따로 설치하지 않아도 된다.

Mongoose

몽구스는 시퀄라이즈와 달리 ODM(Object Document Mapping)이라고 불린다. 몽고디비는 릴레이션이 아니라 다큐먼트를 사용하므로 ORM이 아니라 ODM이다.

몽고디비 자체가 자바스크립트인데도 자바스크립트 객체와 매핑하는 이유는 몽고디비에 없어서 불편한 기능들을 몽구스가 보완해주기 때문이다.

먼저 스키마(schema)라는 것이 생겼으며, 몽고디비는 테이블이 없어서 자유롭게 데이터를 넣을 수 있지만, 실수로 잘못된 자료형의 데이터를 넣거나, 다른 다큐먼트에는 없는 필드의 데이터를 넣을 수도 있다. 몽구스는 이것을 노드 서버 단에서 데이터를 한 번 필터링하는 역할을 한다.

또한 MySQL에 있는 JOIN 기능을 populate라는 메서드로 어느정도 보완이 가능하다.

몽구스를 사용하기 위해선 패키지를 설치해야 한다.

$ npm i mongoose

노드와 몽고디비를 연결하기 위해선 시퀄라이즈와 다르게 schemas 폴더를 루트 디렉터리에 생성하고 index.js 파일을 생성한 후 다음과 같이 작성한다.

// schemas/index.js

const mongoose = require('mongoose');

const connect = () => {
	
    if (process.env.NODE_ENV !== 'production') {
    	mongoose.set('debug', true);
    }
    
    mongoose.connect('mongodb://root:nodejsbook@localhost:27017/admin', {
    	dbName: 'nodejs',
        useNewUrlParser: true,
    }, (error) => {
    	if (error) {
        	console.log('몽고디비 연결 에러', error);
        } else {
        	console.log('몽고디비 연결 성공');
        }
    });
};

mongoose.connection.on('error', (error) => {
	console.error('몽고디비 연결 에러', error);
});
mongoose.connection.on('disconnected', () => {
	console.error('몽고디비 연결이 끊겼습니다. 연결을 재시도합니다.');
    connect();
});

module.exports = connect;

몽고디비는 주소를 사용하여 연결한다. 주소 형식은 mongodb://[username:password@]host[:port]/[database][?option]]와 같다.

스키마 정의하기

시퀄라이즈에서 테이블을 만들었던 것처럼 몽구스 스키마(schema)를 만들어보자. schemas폴더에 user.js를 만든다.

// schemas/user.js

const mongoose = require('mongoose');

const { Schema } = mongoose;
const userSchema = new Schema({
	name: {
    	type: String,
        required: true,
        unique: true,
    },
    age: {
    	type: Number,
        required: true,
    },
    married: {
    	type: Boolean,
        required: true,
    },
    comment: String,
    createdAt: {
    	type:Date,
        default: Date.now,
    },
});

module.exports = mongoose.model('User', userSchema);

몽구스 모듈에서 Schema 생성자를 사용해 스키마를 만든다.

몽구스는 알아서 _id를 기본 키로 생성하므로 _id 필드는 적어줄 필요가 없다. 나머지 필드의 스펙만 입력하면된다.

몽구스 스키마에서 특이한 점은 String, Number, Date, Buffer, Boolean, Mixed, ObjectId, Array 등을 값으로 가질 수 있다는 점이다. 몽고디비의 자료형과는 조금 다르다.

user.js에서 type은 필드의 자료형을 나타내며, required를 true로 설정하면 필수로 들어가야하는 값이며, unique가 true이면 고유한 값이라는 뜻이다. required와 default 등의 옵션이 필요하지 않다면 간단하게 자료형만 명시하면 된다.

마지막에는 몽구스의 model 메서드로 스키마와 몽고디비 컬렉션을 연결하는 모델을 만든다.


평소에 MySQL이나 Oracle SQL같은 RDBMS를 자주 사용하였는데, 자바스크립트 문법으로 이루어진 NoSQL의 몽고디비를 사용하려하니 생소하고 어려움을 많이 느꼈다. 채팅프로그램 등 엄청난 관계가 필요하지 않을 땐 유용할거 같으니 NoSQL도 연습을 많이 해놓자!

profile
기록으로 복습하자

0개의 댓글

관련 채용 정보