주소록 - 프로젝트 생성 및 mongoose로 DB 연결

소스코드

이 게시물에는 코드작성이 포함되어 있습니다. 소스코드를 받으신 후 진행해 주세요. MEAN Stack/개발 환경 구축에서 설명된 프로그램들(git, npm, atom editor)이 있어야 아래의 명령어들을 실행할 수 있습니다.

git clone https://github.com/a-mean-blogger/contact-book.git
cd contact-book
git reset --hard 70e7fd2
npm install
atom .

- Github에서 소스코드 보기: https://github.com/a-mean-blogger/contact-book/tree/70e7fd2fb4081278426071ed8533d6c6caedc401


이번 포스팅에서는 주소록을 만들기 위해 새 프로젝트를 생성하고 mongoose로 DB를 연결합니다.
이번 강의를 진행하기 전에 이전 강의(mlab.com가입 및 온라인 Mongo DB 생성)에서 생성한 DB connection string을 환경변수로 MONGO_DB에 저장해 주세요.

  • Mongoose는 mongoDB와 node.js를 연결해 주는 ORM library입니다.

프로젝트 생성

프로젝트 폴더를 만들고 npm init으로 package.json을 생성해 줍니다.

다음 명령어를 입력하여 atom 에디터를 실행해 줍니다.

$ atom .

폴더구조

index.js만 생성합니다.(.gitingore, README.md는 github을 위해 생성한 파일입니다. 여러분들은 만드시지 않으셔도 됩니다.)

Package 설치

아래 명령어를 사용하여 ejs, express, mongoose 세개의 package를 한번에 설치해 줍시다.

$ npm install --save ejs express mongoose

코드

var express = require("express");
var mongoose = require("mongoose");
var app = express();

// DB setting
mongoose.set('useNewUrlParser', true);    // 1
mongoose.set('useFindAndModify', false);  // 1
mongoose.set('useCreateIndex', true);     // 1
mongoose.connect(process.env.MONGO_DB); // 2
var db = mongoose.connection; // 3
// 4
db.once("open", function(){
  console.log("DB connected");
});
// 5
db.on("error", function(err){
  console.log("DB ERROR : ", err);
});

// Other settings
app.set("view engine", "ejs");
app.use(express.static(__dirname+"/public"));

// Port setting
var port = 3000;
app.listen(3000, function(){
  console.log("server on! http://localhost:"+port);
});

나머지는 Hello World!강의에서 설명된 내용이고, DB setting 부분만 살펴보겠습니다.

1. mongoose에서 내는 몇가지 경고를 안나게 하는 코드인데, 이 부분이 없어도 실행에는 아무런 문제가 없습니다. 경고가 자꾸 뜬다고 제보해주신 분들이 많아서 추가하였습니다. 자세한 설명은 https://mongoosejs.com/docs/deprecations.html 에서 읽어주세요.

2. node.js에서 기본으로 제공되는 process.env 오브젝트는 환경변수들을 가지고 있는 객체입니다. 저는 DB connection string을 MONGO_DB라는 이름의 환경변수에 저장하였기 때문에 node.js코드상에서 process.env.MONGO_DB로 해당 값을 불러올 수 있습니다.
mongoose.connect("CONNECTION_STRING")함수를 사용해서 DB를 연결할 수 있습니다.

3. mongoose의 db object를 가져와 db변수에 넣는 과정입니다. 이 db변수에는 DB와 관련된 이벤트 리스너 함수들이 있습니다. 

4. db가 성공적으로 연결된 경우 "DB connected"를 출력합니다.

5. db연결중 에러가 있는 경우 "DB ERROR : " 와 에러를 출력합니다.

DB연결은 앱이 실행되면 단 한번만 일어나는 이벤트 입니다. 그러므로 db.once("이벤트_이름",콜백_함수) 함수를 사용했고, error는 DB접속시 뿐만 아니라, 다양한 경우에 발생할 수 있으며, DB 연결 후에는 DB 에러가 발생한 후에도 다른 DB 에러들이 또다시 발생할 수도 있기 때문에 db.on("이벤트_이름",콜백_함수)함수를 사용합니다.

실행결과

이번부터는 nodemon을 사용해 서버를 실행하겠습니다. nodemon으로 서버를 실행하면 서버 코드를 수정시 자동으로 서버를 재시작해줍니다.
우선 아래 명령어로 nodemon을 설치해 주세요.

$ npm install --global nodemon

아래 명령어로 서버를 실행합니다.

$ nodemon

아직 route을 생성하지 않았으므로 http://localhost:3000 으로 접속해도 아무 내용이 뜨지 않지만 console에 DB가 정상적으로 접속이 된 것을 알 수 있습니다.

만일 에러가 있다면

$ printenv

를 입력해서 DB connection string이 환경변수에 제대로 설정되어 있는지, DB connection string이 정확한지를 확인해 주세요.

마치며..

이제 DB가 연결되었으니 활용을 해야겠죠?
다음강좌는 DB활용에 대한 기본적인 이론을 알아보고 실습을 하겠습니다.

댓글

오오구 (오구) 2016.10.13
mongoose.connect(process.env.MONGO_DB); 이 부분에서 DB정보값을 환경변수로 등록을 해뒀는데 참조해오지 못합니다. 혹시 위에 설명하신 부분외 별도의 설정이 더 필요한가요?
I
Ian H 2016.10.17
@오오구 (오구),
환경변수 설정후 터미널 재시작해주셔야 하는데, 혹시 재시작하셨나요?
임성훈 2016.10.14
DB ERROR :  { [MongoError: failed to connect to server [>:27017] on first connect]   name: 'MongoError',   message: 'failed to connect to server [>:27017] on first connect' }
간단한 코드라 계속 블로그 보면서 확인하면서 해봤는데 뭐가 잘못됐는지 잘 못찾겠네요 ㅜㅜ 구글링해도 잘 안나오는거 같고 뭐가 문제일까요???ㅜㅜ
임성훈 2016.10.14
환경변수 말고 uri 그대로 써도 실행이 안되네요 환경변수 문제는 아닌거 같아요 ㅜㅜ
I
Ian H 2016.10.17
@임성훈,
환경변수 문제는 아니네요.. mlab 사용하시나요? 아니면 local 사용하시나요?
W
WebLog 2016.10.19
@Ian H,
위에 글 보고 mlab 사용합니다... 계속 문제가 뭔지 찾아봐야겠네요~
권유성 2016.10.15
$ nodemon [nodemon] 1.11.0 [nodemon] to restart at any time, enter `rs` [nodemon] watching: *.* [nodemon] starting `node index.js` fuck! Server On! DB ERROR :  { MongoError: failed to connect to server [undefined:27017] on fi                                                        rst connect     at Pool.<anonymous> (C:\Users\Mycom\documents\workspace\contact-book\node                                                        _modules\mongodb-core\lib\topologies\server.js:313:35)     at emitOne (events.js:96:13)     at Pool.emit (events.js:188:7)     at Connection.<anonymous> (C:\Users\Mycom\documents\workspace\contact-boo                                                        k\node_modules\mongodb-core\lib\connection\pool.js:260:12)     at Connection.g (events.js:291:16)     at emitTwo (events.js:106:13)     at Connection.emit (events.js:191:7)     at Socket.<anonymous> (C:\Users\Mycom\documents\workspace\contact-book\no                                                        de_modules\mongodb-core\lib\connection\connection.js:162:49)     at Socket.g (events.js:291:16)     at emitOne (events.js:96:13)     at Socket.emit (events.js:188:7)     at connectErrorNT (net.js:1020:8)     at _combinedTickCallback (internal/process/next_tick.js:74:11)     at process._tickCallback (internal/process/next_tick.js:98:9)   name: 'MongoError',   message: 'failed to connect to server [undefined:27017] on first connect' } 위처럼 뜨던것을 //mongoose.connect(process.env.MONGO_DB); // 환경변수에 저장된 값을 사용하여 mongoDB에 접속 을 mongoose.connect("mongodb://<이름>:<비번>@ds011820.mlab.com:11820/kys_db"); 그냥 지정해주니까 되네요  connect(process.env.MONGO_DB); <-- 예가 나쁜놈입니다.  그런데 저거 해결할려면 어떻게 해야하나요?
I
Ian H 2016.10.17
@권유성,
환경변수 설정후 터미널 재시작해주셔야 하는데, 혹시 재시작하셨나요?
권유성 2016.10.19
@Ian H,
ㅎㅎ 껏다 키니 되네요 부끄럽습니다.
S
Sean Park 2016.11.07
nodemon을 설치하고 실행했더니 command not found가 뜨네요;; 흑흑
I
Ian H 2016.12.02
@Sean Park,
ubuntu 사용해서 그럴까요 ㅠㅠ? 검색한번 해보세요
Deleted Comment
정석호 2017.07.02
mongoose.connect(process.env.MONGO_DB, { useMongoClient: true }); 최신 버전에서는 몽구스의 자체 버그로 인한 오류가 있네요. useMongoClient를 사용하면 해결된다고 합니다. -_-b
I
Ian H 2017.07.03
@정석호,
제보 감사드립니다^^ mongoose 4.11.0버전 부터 DB접속방법이 약간 달라졌네요.  강의도 수정하겠습니다.
김남현 2017.09.15
예전에 블로그를 통해서 코딩 학습에 도움 받았었습니다. 개발이 주된 업이 아니라서  띄엄띄엄 공부중이었는데, 최근 개발하고 싶은 것이 생겨서 처음부터 공부하려고 다시 찾았습니다. 예전에 산호세에 있을 때 블로그에 글 남겼었습니다. :)
I
Ian H 2017.09.22
@김남현,
반갑습니다. 오.. 개발하고 싶은 것이 생기셨다니 궁금하네요. 어느정도 완성이 되면 저도 보여주세요^^
J
Joonsang Yu 2017.11.03
강의 잘 보고 있습니다^^;; Win10에서는 사용자 변수로 등록하게 되면 인식이 안되네요. 시스템 변수에서는 정상적으로 connection 됩니다.
정현석 2018.01.03
안녕하세요. 혼자 따라해보면서 많은 도움이 되고 있습니다. 마지막에 nodemon 실행시  ============================================== the options [useMongoClient] is not supported Server on! DB connected =========================================== 이 문장이 발생하였는데요. 직접 타이핑한것과 위에 게시해준것 비교한것에는 차이가 없는데... 마지막에 작성해주신 $ printenv 실행시 MONGO_DB=mongodb://dbuser:[email protected]:39387/fixequery 이런식으로 나오는데 어디를 손보아야하는지 헷갈리네요 ㅠㅠ
I
Ian H 2018.01.03
@정현석,
구글에 "the options [useMongoClient] is not supported"로 검색해보니 바로 나오네요. https://stackoverflow.com/questions/48031029/the-options-usemongoclient-is-not-supported
Mongoose 최신버전(5.0.0-rc)에서 useMongoClient를 기본옵션으로 채용하면서 발생하는 경고입니다. (이 게시물 작성시에는 Mongoose 4.6.0이 사용되었습니다.)
mongoose.connect(process.env.MONGO_DB, { useMongoClient: true }); 이 부분을 mongoose.connect(process.env.MONGO_DB); 이렇게 수정하면 더이상 해당 문장이 출력되지 않습니다.
김정규 2018.07.13
DB ERROR :  Error: URL malformed, cannot be parsed 왜 이런오류가 자꾸 나올까요.. 변수설정했고,, 아톰 터미널도 계속 재부팅했습니다..
I
Ian H 2018.07.16
@김정규,
DB 주소가 맞지 않는 것 같은데요, console.log("process.env.MONGO_DB: ", process.env.MONGO_DB) 하셔서 DB주소가 정확히 출력되는지 확인해 보세요
정현우 2018.08.09
WARNING: The `useMongoClient` option is no longer necessary in mongoose 5.x, ple                                                                                                                ase remove it.     at handleUseMongoClient (C:\workspace\contact-book\node_modules\mongoose\lib                                                                                                                \connection.js:582:17)     at NativeConnection.Connection.openUri (C:\workspace\contact-book\node_modul                                                                                                                es\mongoose\lib\connection.js:462:7)     at Mongoose.connect (C:\workspace\contact-book\node_modules\mongoose\lib\ind                                                                                                                ex.js:230:15)     at Object.<anonymous> (C:\workspace\contact-book\index.js:6:10)     at Module._compile (module.js:652:30)     at Object.Module._extensions..js (module.js:663:10)     at Module.load (module.js:565:32)     at tryModuleLoad (module.js:505:12)     at Function.Module._load (module.js:497:3)     at Function.Module.runMain (module.js:693:10)     at startup (bootstrap_node.js:188:16)     at bootstrap_node.js:609:3 (node:7036) DeprecationWarning: current URL string parser is deprecated, and wil                                                                                                                l be removed in a future version. To use the new parser, pass option { useNewUrl                                                                                                                Parser: true } to MongoClient.connect. server on! DB connected
강의 잘보고 있습니다 감사합니다. 접속은 됬는데 경고문가 떳습니다  useMongoClient: true 옵션을  더이상 사용하지 않는다고 나옵니다. 그냥 진행해도 무방할
I
Ian H 2018.08.09
@정현우,
그냥 진행해도 무방하며 경고 내용처럼 해당 부분을 지우고 진행해도 됩니다^^
P
PicoPico toys 2018.10.09
MongoError: Authentication failed 이게 자꾸 뜨네요 왜이리 인증이 안될까요
P
PicoPico toys 2018.10.09
db 에러 고치신분? 어떻게 고치나요
I
Ian H 2018.10.10
@PicoPico toys,
local db 사용하시나요? 아니면 mlab?
P
PicoPico toys 2018.10.11
ㅇㅇ
컴신 2018.11.09
먼저 글쓴이님께 좋은 정보 제공해주셔서 감사합니다.
환경변수가 바로 반영이 안되고 수정해도 바로 안되는경우 종종있습니다. console.log("process.env.MONGO_DB"); 콘솔로 환경변수 적용되었는지 확인하는편이 빠릅니다.
*issue  디비 유저 생성할때 비밀번호로 @가 허용됩니다. 만약, 비밀번호에 @를 생성하게되면 
몽고디비 uri상  [ mongodb://유저:비밀번호@ds152343.mlab.com:57843/comsin ]
비밀번호와 뒤 ds152343 구분점이 @이니 dbparsererror가 나니 꼭 비밀번호에 @는 제거해주시길 바랍니다.
I
Ian H 2018.11.12
@컴신,
안녕하세요 피드백 주셔서 감사합니다. 
https://www.a-mean-blog.com/ko/blog/Node-JS-첫걸음/주소록-만들기/Environment-Variable-환경변수 에서 설명한 것 처럼, 환경변수를 수정한 뒤에는 콘솔을 재시작 해 주어야 합니다.
두번째로 몽고DB 비밀번호 관련 팁은 https://www.a-mean-blog.com/ko/blog/Node-JS-첫걸음/주소록-만들기/mlab-com가입-및-온라인-Mongo-DB-생성 에 추가하였습니다.
감사합니다^^
j
jjj 2019.02.06
nodemon 을 사용할 때  'Server on!', 'DB connected' 둘 다 뜨는 반면, node index.js을 했을 때 'Server on!'만 뜨고 'DB connected'가 안 뜨는 이유가 몬가요?? 
I
Ian H 2019.02.06
@jjj,
엥 그럴리가요. nodemon은 package.json의 main 항목의 파일을 실행하는 것으로 nodemon실행시 출력되는 내용을 잘 읽어 보면
[nodemon] starting `node index.js`
이처럼 결국은 node index.js를 실행합니다. 결국은 같은 명령어예요. 다만 nodemon은 해당 프로젝트 폴더 내의 파일 변화가 있을 경우 node index.js를 자동으로 다시 실행해 줄 뿐이에요.
DB 접속이 원할하지 않은 것 같은데 다시 한번 확인해 보세요^^
칠동이 2019.02.14
the options [userNewUrlParser] is not supported (node:5344) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect. C:\workspace\contact-book\index.js:26   cnsole.log("server on! htpp://localhost:" +port);   ^
ReferenceError: cnsole is not defined     at Server.<anonymous> (C:\workspace\contact-book\index.js:26:3)     at Object.onceWrapper (events.js:285:13)     at Server.emit (events.js:197:13)     at emitListeningNT (net.js:1290:10)     at processTicksAndRejections (internal/process/next_tick.js:76:17)     at process.runNextTicks [as _tickCallback] (internal/process/next_tick.js:51:3)     at Function.Module.runMain (internal/modules/cjs/loader.js:804:11)     at executeUserCode (internal/bootstrap/node.js:526:15)     at startMainThreadExecution (internal/bootstrap/node.js:439:3)
서버 실행시 이렇게 뜨던데 NewUrlParser을 더이상 못쓰게 된 것일까요
I
Ian H 2019.02.14
@칠동이,
userNewUrlParser 부분은 warning으로 실행에는 문제가 없습니다. Error 부분을 살펴보면, C:\workspace\contact-book\index.js:26   cnsole.log("server on! htpp://localhost:" +port);   ^ ReferenceError: cnsole is not defined index.js 26번째 줄에 오타가 있다고 합니다^^
김대회 2019.03.21
DB ERROR :  { MongoNetworkError: connection 3 to cluster0-shard-00-01-nub7g.mongodb.net:27017 closed     at TLSSocket.<anonymous> (C:\workspace2\contact-book\node_modules\mongodb-core\lib\connection\connection.js:276:9)     at Object.onceWrapper (events.js:277:13)     at TLSSocket.emit (events.js:194:15)     at _handle.close (net.js:597:12)     at TCP.done (_tls_wrap.js:388:7)   name: 'MongoNetworkError',   errorLabels: [ 'TransientTransactionError' ],   [Symbol(mongoErrorContextSymbol)]: {} } 이런 오류가나는데 혹시 문제가 뭔지 알려주시면 안될까요... ㅠ 
I
Ian H 2019.03.21
@김대회,
MongoNetworkError로 코드에 이상이 있는건 아니고 DB connection에 문제가 있는 것 같은데, 혹시 mlab.com의 mongo db사용하시나요?
S
Sunwoo Kim 2019.03.29
잘 보고 갑니다. 감사합니다.
I
Ian H 2019.03.29
@Sunwoo Kim,
방문해 주셔서 감사합니다^^
m
moosekiss 2019.06.10
안녕하세요. 글 잘보고 있습니다. 질문 하나만 해도 될까요?
mongoose.connect(process.env.MONGO_DB); 이 부분에서 mongoose.connect(MONGO_DB);   process.env 을 지우니깐 연결 성공했는데... process.env 가 뭔지... 본문에 왜 쓰셨는지 다시한번 알려주시면 안되나요
I
Ian H 2019.06.10
@moosekiss,
안녕하세요. process.env는 node.js에서 기본적으로 제공하는 객체로 컴퓨터의 환경변수에 접근할 수 있게 해줍니다.
mongoose.connect(MONGO_DB)로 연결 성공하였다고 하셨는데, 아마 그 줄 위 어딘가에 var MONGO_DB = "CONNECTION_STRING";으로 해당 변수에 값을 넣으셨을꺼라고 생각됩니다.
MONGO_DB를 환경변수로 설정하고, connection string을 넣으셨으면, process.env.MONGO_DB를 써서 그 값을 가져올 수 있습니다.
댓글쓰기

이 글에 댓글을 다시려면 SNS 계정으로 로그인하세요. 자세히 알아보기

UP