안녕하세요. 이제는 몽구스(Mongoose)를 서버에 연결하겠습니다. 아, 몽구스가 뭔지 모르는 분들이 계실 수도 있겠네요. 몽고DB에 Schema(스키마는 MYSQL에서의 테이블과 비슷한 개념입니다.)가 있는 거라고 생각하시면 됩니다. 몽고DB의 기능을 확장한 거죠.
Node.js는 서버이니만큼 DB를 사용할 수 있습니다. Express 프레임워크에 DB를 한 번 연결해 보죠. 일단 몽구스와 몽고디비를 설치해봅시다. 몽구스를 설치하면 몽고디비는 따라옵니다.
npm install mongoose
이제 설치한 몽구스를 사용할 파일을 server.js가 있는 곳에 만듭니다.
db.js
const mongoose = require('mongoose');
module.exports = () => {
function connect() {
mongoose.connect('localhost:27017', function(err) {
if (err) {
console.error('mongodb connection error', err);
}
console.log('mongodb connected');
});
}
connect();
mongoose.connection.on('disconnected', connect);
require('./user.js'); // user.js는 나중에 만듭니다.
};
connect 함수 안의 mongoose.connect
가 몽고디비에 연결하는 부분입니다. connect 함수는 선언되고나서 바로 호출되기 때문에 exports한 함수가 호출되면 DB에도 바로 연결됩니다. mongoose.connection.on('disconnected', connect);
부분은 연결이 해제(disconnect)될 시에 다시 connect 함수를 실행하는 부분입니다. 그래서 connect 함수가 즉시실행 함수가 아니라 따로 빠져있는 겁니다.
주소는 로컬 몽고디비 주소인 localhost:27017을 사용했습니다. 만약 몽고디비 아이디와 비밀번호가 있다면, 아이디:비밀번호@localhost:27017을 사용하면 됩니다. 아래와 같이요. 참고로 옵션인 useCreateIndex: true
를 넣으시는 분이 계신데, 몽구스 6버전에서 사라진 옵션이므로 넣으시면 안 됩니다.
mongoose.connect('아이디:비밀번호@주소:포트/admin', { dbName: '데이터베이스' }, function(err) {});
server.js
const express = require('express');
const path = require('path');
const app = express();
const db = require('./db.js'); // db 불러오기
const route = require('./route.js');
app.set('view engine', 'pug');
app.set('views', path.join(__dirname, 'html'));
db(); // 실행
app.use(express.static(path.join(__dirname, 'html')));
app.use('/', route);
// 에러 처리 부분
app.listen(8080, () => {
console.log('Express App on port 8080!');
});
이제 서버를 실행하면 자동으로 db연결까지 됩니다. 그럼 이렇게 연결한 db를 어디에 쓸까요? route.js에 쓰면 됩니다. 그 전에 모델(Model)을 만들어야합니다. User라는 이름의 모델을 만들어봅시다. 게임 사용자의 정보를 저장하는 컬렉션입니다. (컬렉션은 SQL의 테이블과 유사합니다.)
user.js
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
name: String,
data: Object,
});
module.exports = mongoose.model('User', userSchema);
코드를 보면 Schema라는 것을 사용하는데요. 스키마는 테이블의 구조를 뜻합니다. SQL에서는 처음에 테이블을 만들 때 구조를 미리 정하는데요. 몽구스를 사용하면 SQL처럼 컬렉션의 구조를 정할 수 있습니다. 만약 이 구조에 어긋나는 행동을 하면 에러를 일으킵니다.
마지막에 model로 User라는 것을 만들어 exports 하면 이제 다른 파일에서 User 모델을 사용할 수 있습니다. 그리고 몽고디비에는 users라는 컬렉션이 생긴 것을 볼 수 있습니다. 몽구스에서 User라는 모델을 만들면 몽고디비에는 users 컬렉션이 생깁니다. 만약 Monster 모델을 만들면, monsters로 생기고요. 자동으로 소문자화 + 복수형으로 바꿔줍니다.
route.js
const express = require('express');
const router = express.Router();
const User = require('./user.js');
router.get('/', (req, res) => {
res.render('main');
});
router.get('/about', (req, res) => {
res.render('about');
});
router.get('/:name', (req, res) => {
User.find({ name: req.params.name }, (err, user) => {
res.render('main', { user: user } );
});
});
module.exports = router;
router에 새롭게 /:name을 추가했습니다. 만약 /Zero로 요청이 들어오면, User 컬렉션에서 Zero라는 이름의 사용자를 찾아서 전송합니다. req.params.name
은 :name 부분을 가리킵니다. 데이터를 받고 저장하는 부분은 직접 만들어보세요.
참고로 mongoDB를 실행한 후에 node.js에서 파일을 실행해야 정상적으로 연결됩니다. 에러 메시지가 뜨는 분들은 DB를 실행했는지를 체크해보세요.
이렇게 DB를 연결해보았습니다. DB의 활용법에 대해서는 MongoDB 강좌 가 진행중이니 그것을 참고하세요. 다음 시간은 REST API에 대해서 알아보겠습니다!
다른분들처럼 연결이 안되는데요, cmd에서 mongo -u 이름 -p 비밀번호 로 접속하거나, mongodb compass로 이름 비밀번호로 접속시에는 잘 접속되는데, npm start로 하려고하면 연결이 끊겨 재시도합니다만 되네요. mongod --auth는 실행한 후에 결과입니다. 어느부분이 잘못된것일까요. 어렵네요 ㅠㅠ