티스토리 뷰

 MongoDB 함수 error 처리 방법

MongoClient.connect('접속URL', function(error, client) { // callback function
    if(error) return console.log(error);

    app.listen(8080, function() {
        console.log('server on : listening on 8080');
    });
});

- 위의 코드에서 error parameter는 error 발생 시 어떠한 error가 발생했는지 알려주는 역할이다.

- MongoDB 관련 함수들은 전부 callback function에서 error 처리가 가능하다.

- 참고로 connection error의 대부분은 접속 URL 오타이다.

if(error) return console.log(error); // 어떠한 error가 발생한 것인지 출력해라

● database / collection 만들기

- 데이터를 저장하기 위해서는 일단 MongoDB에 데이터를 저장할 일종의 폴더와 파일을 만들어야한다.(저장할 공간이 필요하다.)

- 저번 글에서 '접속 URL'을 길게 적어서 쓴건 자신의 계정에 접속하기 위한 것이었다.

- 이번 글에서는 바로 그 계정 안에 있는 database와 collection에 자료를 저장해볼 것이다.
- 우선 database가 없으니까 하나 강제로 만들어보자

1. MongoDB Atlas 메인 대시보드에서 Collections 버튼을 누른다.
2. Add my own data 버튼을 누른다.(혹은 이미 뭐가 있다면 create database)
3. database 이름, collection 이름을 자신의 마음대로 하나씩 정해서 create를 누른다.

- 나는 강의 그대로 database 이름은 todoapp, collection 이름은 post 라고 지었다.
- database와 collection을 그림으로 나타내자면 아래와 같다.

- database는 하나의 폴더, collection은 하나의 엑셀 파일이라고 생각하면 얼추 이해가 될 것이다.

- 내 생각에 collection이 RDB로 따지면 TABLE의 역할을 하는 것 같다.

파워포인트로 내가 직접 만들었다.

※ database와 collection은 저번 글에서 이미 만들었으니 자세한 내용은 아래 링크 참조

2023.04.15 - [Node.js+MongoDB] - #10 MongoDB 셋팅(+ 무료 호스팅)

 

#10 MongoDB 셋팅(+ 무료 호스팅)

● Database? - Database는 데이터를 일정한 형식으로 저장할 수 있게 도와주는 곳이다. - 관계형 Database는 SQL을 사용하여 데이터를 CRUD한다. - 하지만 Mongodb에서는 NoSQL을 사용할 것이다.(SQL 언어를 쓰

radderveloper.tistory.com

이제 이 곳에 데이터를 저장할 수 있다.


● server.js에 DB와 통신하는 코드 추가

- server.js의 const가 모여있는 부분에 코드를 추가해서 DB와 통신해보자

var db;
MongoClient.connect('접속URL', {useUnifiedTopology: true}, function(error, client) { // callback function
    if(error) return console.log(error);
    // 어떠한 DB를 사용할 것인지 명시
    db = client.db('todoapp'); // todoapp database에 연결해라
    
    app.listen(8080, function() { // (웹서버를 오픈하고 싶은 포트 번호, 오픈 후 callback function)
        console.log('server on : listening on 8080');
    });
}); // MongoClient.connect(DB 접속이 완료되면, callback function 실행)

cf) {useUnifiedTopology: true} --> warning message 제거

- var db; 로 페이지 전체에서 쓸 수 있는 전역 변수를 하나 생성한 후
- client.db('todoapp') 함수로 todoapp database에 접속하라는 명령을 내렸다.


collection에 자료 하나 추가하는 법 

- todoapp database에 name과 age 한 쌍을 저장해보자

- 아래의 코드를 통해 위에서 만든 collection에 내가 원하는 자료를 추가할 수 있다.

var db;
MongoClient.connect('접속URL', {useUnifiedTopology: true}, function(error, client) { // callback function
    if(error) return console.log(error);
    // 어떠한 DB를 사용할 것인지 명시
    db = client.db('todoapp'); // todoapp database에 연결해라

    // db.collection('post') --> 여러개의 collection 중 post 라는 이름의 collection을 선택한다는 뜻
    db.collection('post').insertOne({name:"John", _id : 100}, function(error, result) {
        console.log('저장완료');
    });

    // 서버띄우는 코드 여기로 옮겨야 함
    app.listen(8080, function() { // (웹서버를 오픈하고 싶은 포트 번호, 오픈 후 callback function)
        console.log('server on : listening on 8080');
    });
});

- 위의 코드 작성 후 서버를 실행하니 post collection에 아래와 같이 데이터가 저장되었다.

- 위와 같이 DB에 자료를 추가할 일이 있을 때마다 아래 세줄을 써주면 된다.

db.collection('post').insertOne({name:"John", _id : 100}, function(error, result) {
    console.log('저장완료');
});

- db.collection('post') --> 여러개의 collection 중 post 라는 이름의 collection을 선택한다는 뜻
- 그 뒤에 insertOne을 붙이면 자료를 추가할 수 있다.(Object 자료 형식으로 추가 가능)
- insertOne(추가할 자료, callback function(에러, 결과))과 같은 식으로 사용하면 된다.

- 데이터를 저장할 때는 항상 object 형식을 지켜야한다.

db.collection('post').insertOne()

- 위의 패턴은 데이터 추가는 물론 데이터의 삭제, 수정에서도 거의 동일한 형식으로 사용된다.

- 만약 데이터 추가가 잘 안되면 '접속 URL'을 복붙할 때 아래처럼 DB 이름까지 넣어야 잘되는 경우가 간혹 있다.

(난 안 붙여도 잘 됐다.)

mongoDB+srv://디비계정아이디:디비계정패스워드@어쩌구/데이터베이스이름?retryWrites=true&w=majority

- 위에서 볼 수 있듯이 MongoDB는 RDB처럼 미리 각 컬럼(?)의 데이터 타입을 미리 지정해 줄 필요가 없다.

cf) 컬럼(?) : 정확한 명칭을 몰라서 물음표 붙임

- 알아서 타입을 지정해서 데이터를 저장해준다.

- schema 설정이 없으니 매우 편하다.(schema를 알아서 만들어준다.)

- RDB라면 CREATE TABLE TABLE명 {...} 부터 시작해서 각 컬럼의 타입과 사이즈를 사전에 지정해줘야 한다.

DB가 알아서 데이터의 타입을 지정해준다.


● _id : ObjectId() 같은게 있어야하는 이유(바로 위 사진의 체크 부분 보기)
- mongoDB에서 자료들을 서로 구분하기 위해서는 _id와 같은 값이 반드시 있어야한다.
- 일종의 고유한 학번, 주민번호라고 생각하면 된다.(유니크한 아이디)
- 이러한 값은 직접 집어 넣어주거나 DB 자체에서 자동으로 집어넣도록 설정하면 된다.
- 즉, 저장하는 자료들에게 각각 고유한 PK(Primary Key)를 붙이라는 얘기이다.


● 숙제

- 사용자가 '/add'로 POST 요청을 하면 <form>에 입력된 데이터 2개가 서버로 도착한다.
- 이때 해당 데이터 2개를 post라는 이름의 collection에 저장해보자

app.post("/add", (req, res) => {
    db.collection('post').insertOne({title : req.body.title, date : req.body.date}, (error, result) => {
        console.log(result);
        console.log(req.body);
        console.log(`title : ${req.body.title} / date : ${req.body.date}`);
    });
    res.send("전송완료");
});

저장됨

cf) server.js 코드 전체

const express = require('express'); // 첨부
const app = express(); // 사용
const MongoClient = require('mongodb').MongoClient;
var db;
MongoClient.connect('접속URL', {useUnifiedTopology: true}, function(error, client) { // callback function
    if(error) return console.log(error);
    // 어떠한 DB를 사용할 것인지 명시
    db = client.db('todoapp'); // todoapp database에 연결해라

    // db.collection('post') --> 여러개의 collection 중 post 라는 이름의 collection을 선택한다는 뜻
    db.collection('post').insertOne({name:"John", _id : 100}, function(error, result) {
        console.log('저장완료');
    });

    // 서버띄우는 코드 여기로 옮겨야 함
    app.listen(8080, function() { // (웹서버를 오픈하고 싶은 포트 번호, 오픈 후 callback function)
        console.log('server on : listening on 8080');
    });
}); // MongoClient.connect(DB 접속이 완료되면, callback function 실행)

app.use(express.urlencoded({extended: true}));

app
.get("/", (req, res) => { // {"/", (req, res) = 경로, (요청내용, 응답할 방법)}
    res.sendFile(__dirname + '/index.html'); // .sendFile(보낼파일경로)
})
.get('/pet', (req, res) => { // app.get(경로, callback function)
    res.send("펫용품 사라고");
})
.get('/beauty', (req, res) => {
    res.send("뷰티용품 사라고");
})
.get("/write", (req, res) => {
    res.sendFile(__dirname + '/write.html');
})
.post("/add", (req, res) => { // <input>에 담겨있는 정보는 req에 들어있다.
    db.collection('post').insertOne({title : req.body.title, date : req.body.date}, (error, result) => {
        console.log(result);
        console.log(req.body);
        console.log(`title : ${req.body.title} / date : ${req.body.date}`);
    });
    res.send("전송완료");
});
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함