Express MongoDB 연동

배찌 (배찌)·2023년 2월 21일
0

node.js

목록 보기
5/8

이번 MongoDB는 코딩을 위주로 할생각이기 때문에 DB는 외부 클라우드에서 대여한다.
MongoDB Atlas에서 무료로 사용할수 있다, 하지만 데이터를 많이 저장하는 경우에는 돈을 내야하니 자신이 데이터가 많으면 로컬에 MongoDB를 설치하고 실행하자

MongoDB Atlas URL

MongoDB에 연결하는 방법은 여러가지가 있지만 Node.js로 연결할때 가장 간단한 방법은 connect URL을 획득하여 입력하면 간단히 입력된다. URL의 경우 암호화도 지원하니 MongoDB를 서비스에 응용할려는 사람은 알아두면 좋을거같다.

MongoDB에 연결하는 URL 획득방법

Connect => Connect Your application

순서대로 하면 "Copy the connection string, then open MongoDB Compass."가 나올것이다.

거기 있는 url를 잘 복사해서 챙겨둬야 한다.
그리고 todoapp이라는 database를 만들고 collection을 post이름으로 만든다.

API 설정

MongoDB 라이브러리 설치 및 사용하기 위한 변수 선언

npm install mongodb@3.6.4
const MongoClient = require('mongodb').MongoClient;

이제 DB를 app에 연결하기 위해서는 기본적으로 제공되는 변수가 있다.

MongoClient.coonnect('URL', {useUnifiedTopology: true},function(error, client){
   /// app.listenling 내용
});

이렇게 추가하면 된다. 그리고 추가적인 error에 대한 내용을 확인하고 수정하기 위해 error 변수도 추가하여 만든다.

MongoClient.connect('URL', {useUnifiedTopology: true},function(error, client){
     if(error){return console.losg(error)};
     db = client.db('todoapp');
     console.log('listening on 8080');
});

모든 database를 불러오면 부하가 많아지기 때문에 todoapp으로 한정하고 불러온다.
error가면 콘솔창에 error가 나오게 되니 왜 에러가 나온건지 확인하면서 진행하면 된다.

이제 앞전에 썻던 /add 경로에 대해서 수정해보자
기본의 설정은 다음과 같다.

app.post('/add', function(req, res){
     console.log(req.body.title);
     console.log(req.body.date);
});

데이터 출력하는것까지는 같지만 데이터를 출력하여 db에다가 추가하라고 만들어야한다. 그렇기에 function 아래에 db에 정보를 전송하는 내용을 추가하고 에러가 나타나면 그에 따라 추출하는 명령어도 추가한다.

app.post('/add', function(req, res){
 db.collection('collections').insetOne({ Title : req,body.title, Date : req.body.date}, function(error, result){
      if(error){return console.log(error)
    });
  res.send('전송완료')
  console.log('전송완료')
});

여기서 inset는 db를 공부햇다면 익숙할것이다. 그리고 여기서는 하나의 object만 추가하기때문에 One라고 했지만 다수의 데이터를 넣는다면 Many로 대체해주면된다.

그러면 이제 확인해 보면 "_id" 란이 랜덤하게 만들어진것을 확인할수 잇다.

그렇다면 이제 "_id" 를 수정해보자.

id 붙이기

우선 _id가 1부터 시작하도록 counter용도의 데이터를 만들어보자
Counter Collection을 만들고 name : "게시물 갯수" 라고 젂어보자.
그리고 TotalPost를 만들고 0을 입력한 다음 TotalPost를 int32로 수정해보자
여기서 왜 int32로 하냐면 기본적으로 저장되는 데이터는 숫자가 아닌 문자이다. 그렇기때문에 카운터의 역할을 위해서는 숫자로 수정해줘야 정상적인 카운터 역할을 수행할수 있다.

우선 생각해보자 counter collection을 만들었고 거기서 counter하는 객체를 만들엇다.
그렇다면 그것을 불러오기 위해서는 다음과 같은 코드를 만들수 잇다.

db.collection('counter').findeOne({ name : "게시물 갯수" }, function(error, result){

});

이런 내용으로 추출할수있고, _id값이 TotalPost 키 벨류를 가진 데이터를 불러와서 _id를 넣는 방식이니 다음과 같은 코드를 만들수있다.
만약 생각이 안난다면 조금 더 공부하는게 필요하다

app.post('/add', function(req, res){
    db.collection('counter').findOne({ name : '게시물 갯수' }, function(error, result){
    	if(error){ return console.log('전송에러')}
        var ID = result.TotalPost
        db.collection('post').insetOne( { _id : ID + 1, Title : req.body.Title, Date : req.body.date }, function(error, result){
        	if(error){ return console.log('데이터 베이스 전송 에러')}
            res.send('전송완료')
        })
        db.collection('counter').updateOne( { name : '게시물 갯수 }, { $inc: {Total : 1}}, function(error, result){
        	if(error){returon soncole.log('카운터 데이터 업데이트 에러')}
        })
   })
   console.log('전송 완료')
});

$inc 변수로 사용하여 + 1 한 코드이다.

마지막으로 전송완료만 하는 코드에서 5초후 /wirte 페이지로 전환하는 자바스크립트를 추가한 내용이다.

app.post('/add', function(req, res){
    db.collection('counter').findOne({ name : '게시물 갯수' }, function(error, result){
    	if(error){ return console.log('전송에러')}
        var ID = result.TotalPost
        db.collection('post').insetOne( { _id : ID + 1, Title : req.body.Title, Date : req.body.date }, function(error, result){
        	if(error){ return console.log('데이터 베이스 전송 에러')}
        })
        db.collection('counter').updateOne( { name : '게시물 갯수 }, { $inc: {Total : 1}}, function(error, result){
        	if(error){returon soncole.log('카운터 데이터 업데이트 에러')}
        })
   })
   console.log('전송 완료')
   res.send("<p>전송이 완료되었습니다. 5초 후에 화면이 전환됩니다.</p>" + 
             "<script>setTimeout(function() { location.href='/wirte'; }, 5000);</script>");
});
profile
Never give up Impossible is nothing

1개의 댓글

comment-user-thumbnail
2023년 2월 21일

https://codingapple.com/ 에서 공부한 내용입니다. 여기서 더 공부해보세요

답글 달기