EtoC

mongoose 본문

BackEnd/Database

mongoose

게리드 2023. 8. 28. 12:50

1. mongoose

mongoose는 mongodb를 쓰는데 있어 필수적인 package로 nodejs와 mongoDB를 이어주는 다리역할을 한다.
nodejs에서 javascript로 코드를 적을텐데 mongoose가 이 자바스크팁트형식의 코드르 mongoDB에 전달해 주기 때문이다.

2. 장점

1. schema

몽구스의 장점은 schema이다.
MongDB같은 NoSQL에는 스키마에대한 메타데이터가 없어 도큐먼트에 무엇을 넣어도 에러가 발생하지 않는다. 하지만 실제로 사용해보면 에러가나는데, 이런 문제를 막기위해 몽구스는 스키마를 도입했다.

Mongoose Schema 공식페이지

2. 다양한 모델 메소드

몽구스를 사용해보니 메소드가 확실히 편하다는 느낌을 받았다.
find, findOne, findById, findOneAndRemove, findOneAndUpdate, findByIdAndRemove, findByIdAndUpdate같이 조건이나 id를 찾으면서 다른 작업이 가능하다.

Mongoose API Model 공식페이지

3. 설치 및 DB 연결하기

설치방법: npm i mongoose 를 입력하여 몽구스를 설치한다.

서버가 시작하는 파일과 같은 경로에 db.js파일을 만든다.

//db.js
import mongoose from "mongoose"; //몽구스를 사용하기위해 임포트
mongoose.connect("mongodb://127.0.0.1:27017/wetube"); 
//몽고디비 쉘에있던 url을적고 뒤에 사용할 데이터베이스 이름을 적는다.

server.js에 import "./db"; 를 적어 데이터베이스에 연결한다.

경고문이 하나 뜨는데


strictQuery 옵션을 false로 주라고 한다.

 mongoose.connect("mongodb://127.0.0.1:27017/wetube",{strictQuery: false}

근데 주면 에러남..


찾아보니 버전을 5로 낮추면 된다고한다.
근데 어차피 false로 쓸꺼고 7에서 디폴트로 false라서 그냥 넘어가려한다.

이제 DB에 연결이 되었는지 확인하기위해

const db = mongoose.connection;

const handleOpen = () => console.log("✅Connected to DB");
const handleError = () => console.log("❌DB Error", error);
db.on("error", handleError);
db.once("open", handleOpen);

서버가 연결되었을때 handleopen함수를 출력하여 "connected to DB"라는 말이뜨게하였고,
서버에 에러가 났을때는 handleError함수를 이용하여 "DB Error"라는 메세지가 뜨게했다.

3. mongoose 사용하기

mongoose는 DB에 연결하는 다리같은 역할을 한다고 했다.
그 역할을 해주는 폴더가 필요한데 바로 models라는 폴더이다.

1.models폴더와 video.js파일 만들기

model은 데이터베이스와 api를 연결해주는곳으로 DB를 사용하기위해 models/video.js를 만들어주었다.

2. video에 데이터 타입 정하기

이제 mongoose를 사용하기 위해 내가 만든 애플리케이션의 데이터가 어떻게 생겼는지 video.js에 알려줘야한다.

import mongoose from "mongoose"
 const videoSchema = new mongoose.Schema({
   title: String,
   description: String,
   createdAt: Date,
   hashTags: [{type: String}],
 })

schema는 데이터의 형태를 정의해준다.

3. 서버실행문이 있는 파일에 import하기

 import "./db";
import "./models/video";

4. mongoose 쿼리문 작성하기

mongooseDocumentaion

import Video from "../models/video";

export const home = (req, res) => {
  Video.find();//몽구스 쿼리
  res.render("home", { pageTitle: "Home" });

몽구스 쿼리문 실행에는 두가지 방법이 있는데
하나는 callback함수를 사용하는것이고, 두이는 Promise를 사용하는 것이다.

Video.find({searchTerm}, callback(error, videos) =>{
console.log("errors", error)
console.log("vidoes", videos) })
//callback은 err과 docs라는 signature을 가진다.
//아래의 함수와 같다.
const search = (error, videos) => {}

 hello가 먼저 출력되고 logger가 뜬뒤 에러와 데이터가 뜬다.
/페이지를 요청하고 hello를 출력한뒤, 렌더링을 거쳐 logger가 생성된다.
responce를 한뒤에 console.log의 값들이 출력된다.
(nodejs가 빠르게 처리되는것부터 먼저 처리하는데 데이터를 검색하는 과정에서 시간이 어느정도 걸려서 저렇게 뜨는게 아닌가 싶다.)
이유는 데이터베이스의 검색이 안 끝났는데 render되는것을 방지하기 위해서이다.

콜백함수는 다른데서 만든함수를 대기시켜두었다가 다른곳에서 호출하는것이고,
프로미스는