본문 바로가기

WEB PROGRAMMING

MongoDB와 Node.js에 연동시키기

Node.js에서 효율적이게 사용할 수 있는 Nosql DB 중에서 가장 많이 사용하고있는 MongoDB를 사용할 준비와 이것을 Node.js에 연동시키는 방법을 한번 알아보겠습니다.

 

 

MongoDB 시작하기

일단 무료 온라인 Mongo DB를 생성하기 위해 https://www.mongodb.com/cloud/atlas 에 접속합니다.

접속해서 가입을 하거나 구글 연동을 한 다음 Create New Cluster 페이지에서 Clustercreate 해줍니다.

그런다음 IP whitelist를 설정하기위해 해당 목록으로 들어갑니다. 지정된 IP만 DB에서 접근할 수 있도록 할 수 있지만

연습하는 입장에서 Add IP ADDRESS를 누른 다음 Allow Access From Anywhere 버튼 눌러 IP주소가 0.0.0.0/0이 되도록합니다.

이제 Clusters 목록에 들어가 Connect를 누릅니다. 그리고 _Conect Your Application_을 눌러

1. 어떤 버전을 사용할지 선택하고 (우리는 node.js)

  1. Connection String에서 Connection String Only부분을 Copy해 줄것입니다.

단, password(<>까지 지워줌) , test_username은 자신의 username와 password로 바꾸어서 사용합니다.

 

 

 

MongoDB를 Node.js에서 사용하는 방법

○ 환경 변수 설정하기

웹 개발에서 특정한 값을 프로그램 코드에서 숨기기위해 중요한 정보를 환경변수에 저장하여 소스에서 제거할 수 있는데요. 이 작업을 하는 방법입니다.

  1. 시스텝 속성메뉴 > 고급 탭 > 환경변수 버튼 클릭

 

아까 **Connection String**에서 얻어왔던 부분을 위에 캡처사진과 같이 바꾸어 줍니다. 

단, 만약 terminal 프로그램이 실행중이라면 수정후 재 실행 해주어야 합니다.

 

○ 프로젝트에 MongoDB를 연결

작업하실 프로젝트에 mongoose DB를 연결하시기 위해선 Mongoose를 사용해야합니다. 이것은 MongoDB와 node.js의 오브젝트를 연결해주는 ORM library입니다. 

 

1. Package 설치

npm install --save mongoose

2.  DB setting

var mongoose = require('mongoose');

mongoose.set('useNewUrlParser', true);    
mongoose.set('useFindAndModify', false);  
mongoose.set('useCreateIndex', true);     
mongoose.set('useUnifiedTopology', true); 
mongoose.connect(process.env.MONGO_DB); 
var db = mongoose.connection; 

db.once('open', function(){
  console.log('DB connected');
});

db.on('error', function(err){
  console.log('DB ERROR : ', err);
});

 requrie() : mongoose 모듈 가져오기.

 mongoose.set() : 글로벌 설정을 해주는 부분으로 그냥 항상 저렇게 설정하고 쓰면 된다고 한다. 

 mongoose.connect() :DB를  연결하는 부분이다. 우리는 환경변수 MONGO_DB에 저장 했으니 위와 같이 저장하면 됨.

 db.once() & db.on() : 앱 실행시 단 한번만 사용되는 이벤트이다. DB가 연결됬을 때와 아닐때 error를 출력한다.

 

 

 ○ DB 스키마 생성

var contactSchema = mongoose.Schema({
  name:{type:String, required:true, unique:true},
  email:{type:String},
  phone:{type:String}
});

var Contact = mongoose.model('contact', contactSchema); 

이제 DB의 스키마를 생성해 볼 것입니다.  

간단하게 예시로 이름, 이메일, 전화번호 항목을 생성할 것이구요. 

특히, 이름은 requried와 unique를 사용해서 null값 허용 안함 과 중복 허용 안함을 설정할 것입니다.

mongoose.model() : contact라는 데이터 콜렉션에 현재코드를 연결해주는 역할.

여기서 변수 contact object는 model이며 DB에 접근하여 data를 변경할 수 있는 함수들을 가지고 있습니다.

단, contact라는 콜렉션은 미리 생성해 주지 않아도 자동으로 생성해줍니다.

 

Mongoose 스키마 타입은 총 8가지 입니다.  자세히 보기

 

String

Number

Date

Buffer

Boolean

Mixed

ObjectId

Array

Decimal128

Map

 

 

또한 다양한 속성들을 살펴보실 수 있습니다.

required:꼭 입력해야 한다.
unique:다른 행과 중복되면 안 된다.
trim:공백을 제거합니다.(문자열 타입에 사용)
default:문서가 생성되면 기본값으로 저장됩니다.
lowercase:대문자를 소문자로 저장한다(문자열 타입)
match:정규식으로 저장하려는 값과 비교한다.
validate:함수로 개발자가 조건을 만듭니다.
set:값을 입력할 때 함수로 조건을 만듭니다.
get:값을 출력할 때 함수로 조건을 만듭니다.
ref:해당하는 모델을 참조할 때 사용한다

출처 : https://m.blog.naver.com/rwans0397/220696586520

 

 

 ○ CRUD

   만약 DRUD에 대해서 자세히 모르신다면 링크를 통해 좀 더 알아보고 가시길 바랍니다. 

   참고 블로그는 7 Standard Actions이라 했지만 저는  Standard Controller Actions이라 하겠습니다. 

  다음 내용은 링크에서 정리한 Standard Controller Actions에 따라 정리한 것입니다.

 

 데이터 생성

 1. New(get)

app.get('/contacts/new',function(req,res){
  res.render('contacts/new');
});

 

 2. Create(Post)

app.post('/contacts',function(req,res){
  //create: data생성함
  Contact.create(req.body,function(err,contact){
    if(err) return res.json(err);
    res.redirect('/contacts');
  })
});

'contacts/new'에서 폼을 전달 받습니다.   

Contact(모델).create를 이용해 DB에 데이터를 생성합니다. req.body를 통해 data를 받습니다.

 

 데이터 조회

 1. Index(get)

app.get('/contacts', function(req, res){
  Contact.find({}, function(err, contacts){
    if(err) return res.json(err);
    res.render('contacts/index', {contacts:contacts});
  });
});

Contact(모델).find({검색조건, 콜백 함수})는 만약 검색 조건이 없으면 모델의 모든 data를 검색합니다.

여기서 contacts는 항상 한개 이상일 수 있기 때문에 arrary입니다.

 

2. Show(get)

 해당 데이터 보여주기

app.get('/contacts/:id', function(req, res){
  Contact.findOne({_id:req.params.id}, function(err, contact){
    if(err) return res.json(err);
    res.render('contacts/show', {contact:contact});
  });
});

Contact(모델).findOne은 해당 model에서 document하나를 찾는 함수입니다. 

find는 다른 점은 결과를 모두 찾아 array로 전달하는 반면 이 함수는 조건에 맞는 경과를 하나 찾아 object로 전달 합니다.(만약 없다면 null입니다.)

 

 데이터 변경

Standard Controller Actions 중 update와 destroy는 HTTP Methods 중 put과 delete를 사용하는데 브라우저 form은 get과 post만을 허용하고 나머지는 허용하지 않습니다. 

npm install --save method-override

위의 package를 설치하시면 query로 mothod 값을 받아서 request의 HTTP method를 바꿔주는 역할을 합니다.

 

1. Edit(get)

app.put('contact/:id',function(req,res){
  Contact.findOneAndUpdate({_id:req.params.id},req.body, function(err,contact){
    if(err) return res.json(err);
    res.redirect('/contacts/'+ req.params.id);
  })
});

Contact(모델).findOne을 사용하는 이유는 이제 아실겁니다.

 

2. Update(put)

app.put('/contacts/:id', function(req, res){
  Contact.findOneAndUpdate({_id:req.params.id}, req.body, function(err, contact){
    if(err) return res.json(err);
    res.redirect('/contacts/'+req.params.id);
  });
});

Contact(모델).findOneAndUpdate는 해당 model의 document를 db에서 찾아 수정하는 함수입니다.

여기서는 _id:req.params.id가 찾을 조건이고, req.body는 업데이트 정보를 입력하고, 마지막으로 vkfkalxjsms 입력 data를 찾은 후 콜백 함수를 호출합니다. 

 

 데이터 삭제

app.delete('/contacts/:id', function(req, res){
  Contact.deleteOne({_id:req.params.id}, function(err){
    if(err) return res.json(err);
    res.redirect('/contacts');
  });
});

Contact(모델).deleteOne은 해당 model의 document를 db에서 찾아 삭제하는 함수입니다.  

 

 

 

 

 

 


해당글은  A MEAN Blog의 블로그를 참고하였습니다.

https://www.a-mean-blog.com/ko/blog

 

더 자세한 코드는 깃허브 업로드 시켜놓았습니다.

https://github.com/call203/NodejsBookWeb

'WEB PROGRAMMING' 카테고리의 다른 글

[React] React 처음이라면... React란 ? React의 핵심  (0) 2020.08.11
[React]React-redux란 무엇인가?  (0) 2020.08.05
HTTP Methods & CRUD  (0) 2020.05.01
홈페이지 만들기  (0) 2019.06.26