본문 바로가기
JavaScript

MongoDB with node.js

by ma_ro 2020. 3. 3.

MongoDB

  • NoSQL DB의 한 종류로 규칙이 적고, 많은 부분을 수정할 수 있다.
  • RDBMS의 테이블처럼 고정된 스키마가 아닌 JSON 형태의 동적 스키마형 문서를 사용한다.
  • ACID를 포기한 대가로 기존 RDBMS 대비 굉장히 속도가 빠르다.
  • 대신 데이터 consistency가 보장 되지 않기 때문에 은행 데이터 작업 등에는 쓰기 어렵다.
  • MongoDB vs MySQL
  • What is MongoDB

 

NoSQL

  • SQL만 사용하는 것이 아닌 모든 DB를 가르키는 용어
  • RDBMS가 트렌젝션을통한 안정적인 데이터관리에 장점이 있었으나, 웹 2.0 환경과 빅데이터의 등장으로 RDBMS로는 비용적 한계가 너무 컸다.
  • NoSQL은 데이터 consistency를 일부 포기한 대신에 여러 대의 컴퓨터에 데이터를 분산하여 저장하는 것 ( Scale out )을 목표로 등장하였다.
  • 이처럼 여러 대의 컴퓨터를 연결하여 하나의 시스템처럼 동작하는 컴퓨터들의 집합을 클러스터 ( cluster )라고 한다.

 

설치

community와 enterprise 버전이 있는데, enterprise가 몇 가지 기능을 더 제공해주나 기업용으로 비용이 들어간다.

설치는 공식 사이트에서 해당 버전을 다운받아 설치한다.

데이터 베이스 실행 명령어는 mongod이다.
따로 환경변수 설정을 안해주면 실행파일 폴더까지 가서 실행을 시켜야 하기 때문에 환경변수 설정을 해주는 편이 좋다. 아래는 window 환경의 경우.

시스템 - 고급 시스템 설정 - 환경 변수 - 시스템 변수의 path 편집 에서
mongoDB의 설치 경로를 추가해준다.
설정이 완료되면 터미널에서 mongod 명령어 입력시 MongoDB가 실행된다.

mongod

 

mongooseJS

  • nodejs와 mongoDB를 연결하는 adapter.
  • ODM ( Object Data Mapping ) Library
  • 호환성이 없는 JavaScript의 Object와 MongoDB의 데이터를 Mapping 해준다.
  • 공식문서

설치

npm install mongoose

 

import

DB를 연결해줄 db.js 파일을 만들고, init.js에 파일 자체를 import해준다.

import mongoose from "mongoose";
mongoose.connect(
    "mongodb://localhost:포트번호/DB이름",
    {
        "기타 설정들"
        useNewUrlParser: true,
        useFindAndModify: false
    }
);
const db = mongoose.connection;

DB 위치를 지정해줘서 mongoDB를 연결한다.

포트번호는 터미널에서 mongod 명령어를 통해서 확인 가능

connect 설정을 가지고 있는 mongoose 객체를 만들고 그걸 connection 객체를 만든다. 결국 설정을 가지고 있는 연결 객체를 만든다는 것.

 

dotenv

소스를 보면 DB의 URL을 확인할 수 있기 때문에 보안상 문제가 생긴다. 이를 보완하기 위한 것이 dotenv이다. 여기서는 URL을 별도의 dict로 만들어서 key값으로가져와서 사용한다. port 번호 등 숨기고 싶은 value들은 다 넣어서 사용할 수 있다.

당연히 dotenv의 설정파일은 github에 공개하지 않는다.

npm dotenv 문서

설치

npm i dotenv

설정

dict로 만들어서 쓰고 싶은 값들은 따로 파일을 만들어서 사용한다.
설정 파일 이름은 .env 이며, root 디렉터리에 만든다.

 

'KEY=value'
MONGO_URL='URL주소'

MongoDB의 URL을 variable로 지정해준다.

 

import dotenv from "dotenv";
dotenv.config();

mongoose.connect(
    process.env.MONGO_URL,
    {
        'mongoose 설정'
    }
)

dotenv를 import해주고, cofig메서드를 통해서 설정을 실행한다.
그럼 .env 의 variable을 불러와서 process.env에 key, value 형태로 저장한다. 떄문에 여기서 key값으로 mongoDB URL을 불러온다.

 

model

MongoDB에서 데이터를 다룰때 특정한 규격에 데이터를 넣어서 다룬다. 이 규격이 model이며 model은 정해진 틀( schema )가 있다. 이 틀에 맞춰서 데이터를 넣고 데이터가 들어간 모델을 가지고 데이터의 CRUD를 하는 것이다.
스키마( schema )는 json 형태로 지정해줄 수 있다. 그리고 model 파일들은 별도의 dir( ex. models )에 넣어서 관리할 수 있으며, 파일 이름은 대문자로 시작한다.

스키마의 설정은 models 디렉터리의 별도의 model파일에서 지정한다. 설정한 스키마로 모델을 만들어서 export하여 사용한다.

 

import mongoose from "mongoose"

const '스키마이름' = new mongoose.Schema({
    //스키마 내용 
});

const model = mongoose.model("모델이름", "스키마이름");
export default model;

[ mongoose 스키마 문서 ]

Date.now 와 Date.now()

스키마에 저장할 때 Date.now와 Date.now() 중 무엇을 써야할까.

Date.now는 function 그 자체이고, Date.now()는 fucntion을 실행해서 얻은 현재 시간 데이터이다. 결론부터 말하자면, Date.now로 저장해야한다.

Date.now()를 사용하면 바로 function이 실행된 결과를 받지만 Date.now의 경우, 해당 function이 호촐될 때 ( 해당 model이 생성될 때, 여기서는 데이터를 저장할 때 ) 해당 function을 실행해서 현재 시간 데이터를 받아올 수 있다.

model 2개 연동

2개의 다른 데이터가 연동되어야 할 때가 있다. 예를 들면 비디오 데이터와 댓글 데이터이다. 비디오 데이터에는 그 비디오에 해당하는 댓글 데이터를 찾을 수 있어야 한다. 그러기 위해서는 비디오 모델이나 댓글 모델. 어느 한 쪽에 다른 쪽에 대한 정보를 가지고 있어야 한다. 이럴 때 ObjectId를 저장시켜서 연동한다.

 

//Video.js 비디오 모델
//스키마 내용
comments: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: "참조하는 모델 경로"
}]

commnet들의 objectId 리스트를 저장한다. 스키마 내용은 key와 value로 저장되는데, value값으로 리스트도 들어갈 수 있다.

'JavaScript' 카테고리의 다른 글

JavaScript - Typed Array  (0) 2020.03.11
MongoDB 파일 다루기  (0) 2020.03.08
Express 404처리  (0) 2020.03.02
Variables in Pug  (0) 2020.02.24
Pug Partial  (0) 2020.02.24

댓글