이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ

게시글

강좌7 - NodeJS - 2년 전 등록 / 8달 전 수정

NodeJs, Express, 몽구스(Mongoose) 연결하기

조회수:
0
이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ
이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ

안녕하세요. 이제는 몽구스(Mongoose)를 서버에 연결하겠습니다. 아, 몽구스가 뭔지 모르는 분들이 계실 수도 있겠네요. 몽고DB에 Schema(스키마는 MYSQL에서의 테이블과 비슷한 개념입니다.)가 있는 거라고 생각하시면 됩니다. 몽고DB의 기능을 확장한 거죠.

Node.js는 서버이니만큼 DB를 사용할 수 있습니다. Express 프레임워크에 DB를 한 번 연결해 보죠. 일단 몽구스와 몽고디비를 설치해봅시다. 몽구스를 설치하면 몽고디비는 따라옵니다.

npm install mongoose --save

이제 설치한 몽구스를 사용할 파일을 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 함수가 즉시실행 함수가 아니라 따로 빠져있는 겁니다.

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에 대해서 알아보겠습니다!

투표로 게시글에 관해 피드백을 해주시면 많은 도움이 됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright © 2016- 무단 전재 및 재배포 금지

댓글

4개의 댓글이 있습니다.
5달 전
"데이터를 받고 저장하는 부분은 직접 만들어보세요." 에 꽂히신 분들에게

db.js 파일에서
const User = requrie('./user.js');
var Ins = new User();
Ins.name = "zero"; // 대문자 쓰지 마세요! 주소에서 표현이 안 되서 오류가 납니다.
Ins.save();

라고 써서 db를 써주고

route.js 에서
render 메소드 아랫줄에
console.log (id: user[0].name); 를 추가해 보세요 //find로 찾았고, 서버를 여러번 껐다 키면 같은 이름들이 많아지면서 user가 배열로 return됩니다.

그다음 localhost:8080/zero 로 들어가보시면 server 실행 쉘에 console이 찍힙니다.

favicon.ico부분에서 에러가 나긴 하는데,. 그 부분은 차차 고쳐보는걸로~☆
5달 전
참고로 new User({
name: 'zero',
});
가 정석입니다.
일 년 전
1. 몽고디비 다운로드하여 설치 2. 몽고디비를 위한 폴더 생성, C:\data\db 3. 몽고디비 실행
아래 링크 참조
http://cafe.naver.com/jjdev/3526
일 년 전
몽고디비는 몽고디비페이지에서 다운안받고 npm으로만 설치했는데 그건 맞는건가요? 그렇담 실행은 제로초블로그 몽고디비 부분 보면서 하면되는건가요?
일 년 전
npm 으로만 설치해서 그런건지 cmd에서 mongod 명령어도 못알아들어요
일 년 전
해결했씁니다
몽고디비 페이지에서 다운받아서 설치하고 cmd에서 mongod 라고 입력하니 연결이 되는군요
처음에 mongod라고 입력했을때는 오류가 나서 읽어보니 c\data\db 폴더가 없다고 나오는거같길래 그쪽에 폴더를 만드니 몽고디비가 실행되고 연결이 되네요
일 년 전
네. 직접 다운받으셔야 합니다. npm mongodb는 몽고디비랑 연결해주는 역할이에요.
일 년 전
여기까지하면 로컬:8080 으로 접속할때 클라이언트상에는 문제가 없어보이지만
cmd에서 mongodb connection error < MongoError: failed to connect to server [localhost:27017] on first connect
이러면서 밑으로 뭔가 쫙나오고
이 구문들이 계속 반복적으로 나오는데 왜그런거죠..?
일 년 전
혹시 몽고디비 실행을 하지 않으셨나요? 몽고디비 실행을 먼저 하신 후 서버를 실행하셔야 합니다.