express에서 MongoDB 사용하기(mongoose)

Big Jay·2022년 8월 27일
0

mongoDB

목록 보기
1/1

MongoDB

MongoDB는 NoSQL로 문서 지향적 크로스 플랫폼 데이터베이스며, 뛰어난 확장성과 성능을 자랑한다.

NoSQL

NoSQL은 SQL이 없는것이 아니라 Not Only SQL이라는 뜻이다. 기존의 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터 저장소이며, 관계형 DB가 아니므로 RDMS처럼 고정된 스키마 및 JOIN이 존재하지 않는다.

RDMS(Relational Database Management System, 관계형 데이터베이스 관리 시스템)
엑셀시트와 비슷한 행과 열로 된 2차원의 table로 데이터를 관리하는 데이터베이스 시스템이다.

RDMS Join
데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현한 것으로 Join은 테이블로서 저장되거나, 그 자체로 이용할 수 있는 결과 셋을 만들어낸다.
- 참고: 위키 백과

문서 지향 데이터베이스(Document-oriented database)

일반적인 database는 sql-based로 행 기반으로 엑셀시트와 비슷하고 문서 지향 데이터베이스는 JSON-like-document로 JSON의 형태로 database에 저장된다.

// Key, Value 형태로 구성되어있다.
// _id는 mongoDB가 자동 생성해주는 유일한 값으로 12bytes의 hexadecimal 값으로 나타난다.
"_id":ObjectId("62ea6ec8c26c5bddd72e531d"),
"title":"Big Bunny",
"description":"hello world! this is my first video",

document는 동적의 schema를 갖고 있으며, 같은 collection안에 있는 document끼리 다른 schema를 갖고 있을 수 있다.

Collection

MongoDB에서의 docment의 그룹이다. RDMS의 table과 비슷한 개념이지만 mongoDB는 동적 schema를 가지고 있기 때문에 schema를 따로 가지고 있지 않는다.

MongoDB의 장점

  • Schema-less로 Schema가 없으며, 같은 콜렉션 안에 있더라고 다른 Schema를 가질 수 있다.
  • 각 객체의 구조가 뚜렷하다.
  • 복잡한 JOIN이 없다.
  • Deep Query ability(문서지향적 Query Language를 사용하여 SQL만큼 강력한 Query 성능을 제공
  • 어플리케이션에서 사용되는 객체를 데이터베이스에 추가할 때 Convenrsion / Mapping이 불필요하다.

mongoose

node.js와 mongoDB를 연결해주는 다리 역할 Javascript로 mongoDB를 사용하려면 필요하다.

mongoDB 연결하기

mongoDB의 설치는 홈페이지 참조

실행하기

터미널에서 mongo입력

mongo

❗️만약 아래와 같은 메세지가 나올 경우

MongoDB shell version v5.0.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused :
connect@src/mongo/shell/mongo.js:372:17
@(connect):2:6
exception: connect failed
exiting with code 1
-----------------------------------

환경에 맞게 입력한다.

  • 인텔맥: mongod --config /usr/local/etc/mongod.conf --fork
  • M1: mongod --config /opt/homebrew/etc/mongod.conf --fork

연결이 완료되면 아래와 같이 나타난다.

DB 연결하기

컴퓨터에서 실행되고 있는 mongo database에 연결로 터미널에서 mongoDB 실행 후 database의 url을 알아야한다.

//db.js 파일 생성 후 아래와 같이 작성
const mongoose = require("mongoose")

// 터미널에서 확인한 database url을 mongoose를 통해 연결한다.
mongoose.connect("mongodb://127.0.0.1:27017/데이타베이스이름")

const db = mongoose.connection;

const handleOpen = () => console.log("✅ DB가 연결되었습니다.");
const handleError = (error) => console.log("❌ DB error 발생", error);

// DB에 에러가 발생할때 마다 함수를 실행
// 에러는 여러번 일어날 수 있기 때문에 on
db.on("error", handleError);
// DB가 연결되고 단 한번만 함수 실행
// DB의 오픈은 단 한번만 이루어지기 떄문에 once
db.once("open", handleOpen);

위에서 생성한 db.js를 서버를 구성한 js 파일에 연결하면 된다.

//server.js
import "./db";
const express = require("express");

const app = express();
const PORT = 4000;

app.get("/", (req, res)=> {
	res.send("home 입니다.")
});

const handelServer = () => {
  console.log(`${PORT}서버에 연결 되었습니다.`);
};

app.listen(PORT, handelServer);

model 생성

mongoose를 통해 애플리케이션의 데이터가 어떠한 구조로 되어있는지 알려줘야 db에 전달해주는데 이것을 model이라 한다.

// ./models/User.js 파일 생성
import mongoose from "mongoose";
 
// model의 형식을 schema로 생성해준다.
// user라는 데이터는 id, name, password 라고 가정하에 아래와 같으며, type을 정해준다.
const userSchema = new mongoose.Schema({
 id: String,
 name: String,
 password: String,
 createdAt: Date,
});

const userModel = mongoose.model("User", userSchema);
export default userModel

위와 같이 js파일 생성후 server에 import 한다.

Schema

mongoose의 시작이며, 각 스키마는 MongoDB 컬렉션에 매핑되고 해당 컬렉션 내 문서의 모양을 정의한다.

model

모델은 Schema정의에서 컴파일된 멋진 생성자로 모델의 인스턴스를 문서라고 한다. 모델은 기본 MongoDB 데이터베이스에서 문서를 만들고 읽는 책임이 있다.
model이 있어야 생성, 삭제, 수정, 검색을 할 수 있다.

mongoose.model(모델이름, 연결할 스키마);

CRUD

Create - 생성
Read - 일기
Update - 수정
Delete - 삭제

위에서 생성된 모델을 가지고 CRUD를 가능하게 해보자.

// 문서를 생성해서 database에 저장한다.
Model.create({
// schema 정의에 따라 동일하게 생성한다.
// 예로 schema를 id, name, password라면 client로부터 post 받은 내용을 기입한다.
  id:1,
  name:"jayone",
  password: "1212",
})
// filterConfig 내용과 동일한 문서를 database에서 찾는다.({} 값일 경우 전체를 호출)
Model.find(filterConfig);
// callback 또는 promise사용
// id값을 사용하여 database내의 동일한 id를 가진 문서를 찾는다.
Model.findById(id)
// callback 또는 promise사용
// 인자로 id와 update 객체를 사용한다.
// id와 일치한 문서를 찾은 후 update 내용으로 수정한 후 database에 저장한다.
Movie.findByIdAndUpdate(id, update내용)
// callback 또는 promise사용

위 내용을 토대로 예제를 만들어 보았다.

참고

profile
안녕하세요.

0개의 댓글