MongoDB 가이드

mongoDB를 사용할 때 필요한 내용들을 정리해보았습니다.

몽고 디비 가이드

MongoDB Guide

+++

MongoDB는 수년간 대표적인 NoSQL제품으로 자리 잡았다. 특히, 전통적인 RDBMS 대비 우월한 샤드 및 대량 트래픽, 대량 데이터가 발생하는 모던 웹 시대에 걸맞는 저장소로 널리 쓰이고 있다.

하나의 MongoDB 노드는 복수개의 데이터베이스로 구성된다.

Mongodb 가이드

https://blog.naver.com/illumulus/221765001524

mongoDB 실행하기

mongod --dbpath=/Users/dong149/data/db --logpath=/Users/dong149/data/log/db/mongo.log

x다른 터미널에서

mongo

MongoDB

자바스크립트와 mongoDB가 연결되려면, Adapter가 필요하다. 자바스크립트 코드를 짜고 싶으면 MongoDB로부터 Instruction 을 받아야 한다.

이것은 Mongoose가 해줄 것이다.

Mongoose

MongoDB ODM중 가장 유명한 것이다.

ODM = Object Document Mapping를 의미한다. 객체와 문서를 1대 1 매칭한다는 의미로도 해석 가능하다. Object는 자바스크립트의 객체이고, Document는 MongoDB의 문서를 의미한다. 즉, 문서를 조회할 때 자바스크립트 객체로 바꿔주는 역할이다.

MongoDB의 ODM으로는 Mongo.js 등등 많지만, Mongoose가 압도적으로 많이 사용된다.

몽구스의 장점을 꼽자면 강제 스키마의 부활, populate, 프로미스와 콜백 사용 가능, 편리한 쿼리 빌더 등을 꼽을 수 있다.

사실 nosql자체가 테이블과 join이 없는 것을 활용하는 DB이다. 그런데 , 몽구스는 오히려 그 기능을 부활시켰다. DB에 다큐먼트를 넣을 때 값과 타입 그리고 필드를 검사한다. populate는 SQL의 join 과 비슷한 기능을 흉내내준다.

몽고DB에서 쿼리를 작성할 때 JSON 형식으로 작성하기 때문에 뭔가 장황한 느낌을 준다. 몽구스의 쿼리는 간결한 느낌이다. 제공하는 쿼리 빌더로 손쉽게 쿼리를 만들어준다.

몽고DB의 경우 다큐먼트에 아무거나 넣어도 에러가 생기지 않는다.

이런 문제를 막기 위해 몽구스는 Schema 를 도입했다. 몽구스는 사용자가 작성한 스키마를 기준으로 데이터를 DB에 넣기 전에 검사한다. 스키마에 어긋나는 데이터가 있으면 에러를 발생시킨다. 즉, 테이블과 어느 정도 비슷한 역할을 합니다. 스키마를 설정할 때 인덱스까지 같이 걸어둘 수도 있습니다. 기본값도 설정 가능하다.

보통 한 파일에 하나의 스키마를 작성한다. 물론 스키마가 커지면 여러 파일로 분산해도 된다.

const mongoose = require('mongoose');

const imageSchema = new mongoose.Schema({
  width: Number,
  height: Number,
});

const userSchema = new mongoose.Schema({
  email : { type: String , required: true, unique: true, lowercase: true},
  password: { type : String, required: true, trim: true}, //옵션들을 넣어준 것.
  nickname : String,  // 필수가 아님.
  birth : {type : Data, default : Date.now} //디폴트로 현재 시간이 들어간다.
  image : imageSchema,

  ...
});

userSchema.index({email: 1,nickname: 1});

module.exports  = mongoose.model('User',userSchema);

객체 안의 속성명들이 필드의 이름이 된다.

https://www.zerocho.com/category/MongoDB/post/59a1870210b942001853e250 [몽구스 스키마]

const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const cors = require("cors");
// IMPORT MODELS
require("./models/Product");

const app = express();

mongoose.Promise = global.Promise;
mongoose.connect(
  process.env.MONGODB_URI || `mongodb://localhost:27017/node-react-starter`,
  {
    useNewUrlParser: true,
    useFindAndModify: false,
    useCreateIndex: true,
    useUnifiedTopology: true,
  }
);
// mongoose.set("useNewUrlParser", true);
// mongoose.set("useFindAndModify", false);
// mongoose.set("useCreateIndex", true);
// mongoose.set("useUnifiedTopology", true);

corsOptions = {
  origin: "http://deathnote-gg.herokuapp.com/",
  optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204
};
app.use(cors(corsOptions));

app.use(bodyParser.json());

//IMPORT ROUTES
require("./routes/productRoutes")(app);

if (process.env.NODE_ENV === "production") {
  app.use(express.static("client/build"));

  const path = require("path");
  app.get("*", (req, res) => {
    res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
  });
}

const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
  console.log(`app running on port ${PORT}`);
});