게시글

5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭
강좌7 - NodeJS - 8년 전 등록 / 3년 전 수정

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

안녕하세요. 이제는 몽구스(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에 대해서 알아보겠습니다!

조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.
5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭

댓글

12개의 댓글이 있습니다.
2년 전
안녕하세요. 몽구스 공부중에 어려움을 겪어 댓글남깁니다.
다른분들처럼 연결이 안되는데요, cmd에서 mongo -u 이름 -p 비밀번호 로 접속하거나, mongodb compass로 이름 비밀번호로 접속시에는 잘 접속되는데, npm start로 하려고하면 연결이 끊겨 재시도합니다만 되네요. mongod --auth는 실행한 후에 결과입니다. 어느부분이 잘못된것일까요. 어렵네요 ㅠㅠ
2년 전
에러메시지가 무엇인가요?? useCreateIndex는 지우셔야합니다.
2년 전
useCreateIndex 지우니 에러메시지가 나오고 그 곳 수정하니 해결되었습니다! 감사합니다!!! ㅎㅎ
3년 전
안녕하세요. DB 연결이 끊겼습니다. 연결을 재시도합니다. 주르륵 뜨시는 분들은
learn-mongoose\schemas\index.js 파일
//useCreateIndex: true, 이부분 삭제 또는 주석 해보세요
3년 전
저도 12장 실습중인데 계속 연결이 끊겼다고 뜨네요
몽고디비 컴퍼스로 url입력해서 들어갔는데 잘되는데 뭐가문젠지 모르겠네요..
3년 전
19년도 전자책으로 연습중인데 몽고디비 연결이 끊겼습니다. 연결을 재시도합니다. 가 연속적으로 뜹니다. 무슨 원인인지를 모르겠어요 ㅠㅠ 아이디 비밀번호 입력잘하고 서버도 열어놓은것 같은데,,, 몽고디비가 막혀서 12장도 진행이 안되네요
3년 전
https://thebook.io/080229/ch08/02/01-07/
이 과정 진행하셨나요?
3년 전
뚜루뚜 빠라빠
4년 전
mongoose 나 mysql을 연결시킬때 실패하게 되면
화면에 어떻게 나타내나요? 현재 pug를 이용하고 있습니다.

next(err)를 이용하여 에러라우터로 넘길수있는 방법이 있을까요?
4년 전
favicon 때문에 db에서 값을 긁어올때 한번은 비어져서 넘어오는것같은데 favicon 처리는 어떻게 해야하나요?
4년 전
/favicon.ico는 db 관련 코드를 실행하지 않을텐데요??
4년 전
네 다시시도해보니까 그 문제가 아니었던 것 같네요...
0|server | user : [
0|server | {
0|server | _id: 5f3389aad8ce5fbf850165b0,
0|server | name: 'stephen',
0|server | data: 'he is admin'
0|server | }
0|server | ]
0|server | user : []
로그가 현재 새로고침시 이렇게 두번씩 오는데 이유를 모르겠습니다..
4년 전
node.js교과서로 8장을 하고 있는 학생입니다. 책 예제로 실행을 했을 때는 잘 되지만 한글이 깨져서 나옵니다. ㅠ.ㅠ 아무리 구글링을 해도 해결을 하지 못하여서 이렇게 댓글을 답니다. 도와주시면 감사하겠습니다.

express learn-mongoose --view=pug 로 만들었습니다.

cmd 창이랑 webrower에서 한글이 깨져서 나오지만 영어인 부분인 id랑 name 은 깨져서 나오지 않습니다 ㅠ.ㅠ
4년 전
DB에 저장된 내용이 깨져서 나오나요? 그러면 15장에 시퀄라이즈에서 한글 저장할 수 있게 하는 부분 참조해서 테이블 다시 만드시면 됩니다.
4년 전
pug 에서 사용한 한글도 깨지구 cmd 창에서도 깨져서 나옵니다 ㅠ . ㅠ
4년 전
\u003cmeta charset="utf-8" /> head 태그 안에 들어있나요?
4년 전
문제 해결 했습니다!!1 문제 원인이 비주얼 코드에서 파일을 추가했을때 각 저장되는 부분들이 utf-8 이 아닌 utf-16으로 저장이 되어서 한글이 깨졌던거였습니다. ㅠ ㅠ
도움 주셔서 감사합니다.
7년 전
"데이터를 받고 저장하는 부분은 직접 만들어보세요." 에 꽂히신 분들에게

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