-
MongoDB 데이터베이스 연결 (Express JS + Mongoose)Archive/캡스톤디자인 2022. 5. 20. 02:43
Mongo DB Atlas
mongo DB 데이터베이스를 클라우드로 사용하기 위해, Mongo DB에서 제공하는 Atlas 서비스를 이용한다.
회원가입 후 새로운 Project와 Cluster를 생성한다.
이번 프로젝트에서는 Free Tier 옵션을 사용해서 무료로 클라우드 데이터베이스 서비스를 사용하였다.
이후 Network Access 설정에서 허용 아이피를 0.0.0.0으로 하여 모든 아이피를 허용한다.
Mongoose
Mongoose란, MongoDB ODM의 일종으로 Node JS상에서 MongoDB를 쉽게 다룰 수 있는 기능을 제공하는 라이브러리이다. 해당 라이브러리를 사용한다면 MongoDB의 데이터를 Node JS에서 JavaScript 객체로 사용할 수 있다. 또한 Mongoose는 Node JS의 비동기 환경에서도 사용할 수 있도록 설계되었기 때문에 더욱 사용하기가 편리하다.
설치
npm i mongoose
연결
const mongoose = require("mongoose"); const dotenv = require("dotenv"); dotenv.config(); try { mongoose.connect(process.env.DB_URI, { useNewUrlParser: true }); mongoose.connection.once("open", () => { console.log("MongoDB is Connected"); }); } catch (error) { console.error("mongoDB error"); console.log(error); }
mongoose 연결은 mongoose객체의 connect 메서드를 이용한다.
mongoose.connect(uri, { connectionOption });
이때 uri 부분은 연결할 MongoDB의 uri를 적는다.
이번 프로젝트에서는 MongoDB Atlas를 사용하기 때문에, MongoDB에서 제공하는 Connect 버튼을 눌러 연결에 사용할 uri를 얻는다.
Connect 옵션으로는 두 번째 Connect your application을 사용한다.
모델 생성
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const dataSchema = new Schema({ location: { type: Number, required: true, trim: true, }, sound: { type: Number, required: true, trim: true, }, vibration: { type: Number, required: true, trim: true, }, updated: { type: Date, required: true, }, }); module.exports = mongoose.model("Data", dataSchema);
모델 생성을 위해 Schema를 생성한다. MongoDB는 NoSQL이지만, 이를 연결해주는 Mongoose는 데이터 형태를 미리 정의하기 때문에 Schema를 사용한다.
이렇게 Schema를 생성자를 이용해 생성한 후, 이를 mongoose객체의 model 메서드를 이용해 모델로 만든다.
해당 모델은 Node JS에서 객체의 형태로 가져와서 데이터를 찾거나 저장하는 데에 사용한다.
dotenv
MongoDB와의 연결을 위한 uri는 password도 함께 포함되어 있는 정보이기 때문에, 해당 코드는 함부로 노출되면 안 된다. 따라서 보안을 위해 dotenv 환경변수를 사용한다.
설치
npm i dotenv
사용
const dotenv = require("dotenv"); dotenv.config();
앱에서 dotenv 객체를 불러온 다음 config 메서드를 이용해 사용할 수 있다.
보안을 위한 정보는 프로젝트 폴더 루트경로에 .env 파일을 생성하여 그 안에 작성한다.
AUTH_KEY=11111 DB_URI=mongodb+srv://AAAA:11111@datacluster.tag99.mongodb.net/Database?retryWrites=true&w=majority SESSION_KEY=11111 SIGNUP_KEY=11111
.env파일은 이름=값 형식으로 작성한다.
이렇게 작성된 값은 proccess.env.이름 형태로 값을 가져와서 사용할 수 있다.
mongoose.connect(process.env.DB_URI, { useNewUrlParser: true });
데이터베이스 사용
데이터 불러오기
const Data = require("./models/dataModel"); app.get("/api/data", (req, res) => { Data.find() .then((result) => res.json(result)) .catch((err) => { console.error(err); }); });
데이터 저장하기
const Data = require("./models/dataModel"); app.post("/api/data", (req, res) => { if (req.body != undefined) { const location = req.body.location; const sound = req.body.sound; const vibration = req.body.vibration; const updated = new Date() const newData = new Data({ location, sound, vibration, updated }); newData .save() .then(() => { console.log("Upload OK"); res.status(200).json(req.body) }) .catch((err) => { console.error("DB error"); res.status(400).json(err); }); } else { console.error("empty body"); res.status(400); res.json({ status: "BAD REQUEST", }); } });
데이터 삭제하기
const Data = require("./models/dataModel"); app.delete("/api/data/:id", (req, res) => { Data.deleteOne({ _id: req.params.id }) .then((result) => { res.status(200).json(result); }) .catch((err) => { console.error(err); res.status(400).json(err); }); });