Chapter 6(2) MongoDB

#6.7~6.14

몽고DB와 몽구스 사용하기

* 몽고DB

  • 문서 기반
    • 데이터베이스는 일반적으로 문서 기반이 아닙니다.

      일반 SQL 기반(열, 행 기반)
    • 문서 기반은 객체 기반으로 간주됩니다.

    • JSON과 같은 문서이기 때문에 데이터를 rowsx에 저장할 필요가 없습니다.

* 몽구스

  • Mongoose를 사용하여 node.js에서 mongoDB와 상호 작용
  • 사용자가 JavaScript로 작성하면 Mongoose는 이를 mongoDB로 전달합니다.

더보기

몽고 사용법

WSL에서 몽고를 실행하는 방법
1. WSL 터미널을 엽니다.


2. “sudo apt update”를 입력하고 apt를 업데이트합니다.


3. sudo apt-get install mongodb를 입력하고 설치합니다.


4. “mongod –version”을 입력하고 성공적으로 설치되었는지 확인합니다.


5. “sudo service mongodb start”를 입력하고 서비스를 시작하여 mongo를 사용합니다.


6. “mongo”(또는 “mongosh”)를 입력하여 mongo 셸로 전환합니다.


7. 완료되면 “sudo service mongodb stop”을 입력하여 서비스를 중지합니다.


“sudo service mongodb status”를 입력하면 mongodb 서비스가 현재 실행 중인지 확인할 수 있습니다.

> 문자로 시작하면 mongo 쉘에 진입했음을 의미합니다.

show dbs 명령이 제대로 작동하면 완료된 것입니다!

나가고 싶으면 그냥 exit 치세요

* 콘솔에서 mongo(또는 mongoose) 명령을 실행하여 이 URL을 얻어야 합니다.

  • 몽구스 연결
import mongoose from "mongoose";
mongoose.set('strictQuery', false)
mongoose.connect("mongodb://127.0.0.1:27017/wetube", {
    useNewUrlParser: true,
    useUnifiedTopology: true,
})

const db = mongoose.connection;

*한 번

  • on : 연속으로 여러 번 발생할 수 있습니다(클릭과 같은 이벤트!
    ).
  • 한 번 : 한 번만 발생한다는 의미
const handleError = (error) => console.log("DB Error: ", error)
const handleOpen = () => console.log("Connected to DB🔮")
db.on("error", handleError)
//database에 에러가 나면, 이 event가 발생한 것임!
db.once("open", handleOpen) //connection이 열리게 되면 단 한 번만 실행됨

서버가 http://localhost:4000 포트에서 수신 중입니다
DB에 연결

– 출력을 보면 포트 4000에서 수신 대기한 후 조금 후에 데이터베이스 연결이 이루어집니다.

– 느리기 때문에


CRUD

  • 만들다 생산하는
  • 읽다 읽다
  • 업데이트하려면 편집하다
  • 끄다 끄다

* 모델

  • 애플리케이션의 데이터가 어떻게 보이는지 Mongoose에 알려야 합니다.

    • 비디오에는 제목, 세부 정보 등이 있습니다.

  • 이것은 mogos가 CRUD를 만드는 데 도움이 될 것입니다.

  • 데이터 객체를 위한 프레임워크라고 생각하세요!
  • 이름 및 유형 설명
// models/Videos.js
import mongoose from "mongoose";

//데이터의 shape 설명. 데이터 작성은 아님!
!
const videoSchema = new mongoose.Schema({ title: String, description: String, createdAt: Date, hashtags: ({ type: String }), meta: { views: Number, rating: Number }, }) const Video = mongoose.model("Video", videoSchema); export default Video; // export 했으니 다른 곳에서도 import vid from "Video" 가능 // Video model을 미리 import해서, 모두가 사용할 수 있게 하면 // 모두가 바로 사용 가능!
// server.js
import "./db"; //파일 그 자체를 import
import "./models/Video";

데이터베이스를 가져오고 server.js에 연결한 후 연결에 성공하면 비디오를 가져옵니다.

– 이 연결을 통해 db는 해당 비디오 모델을 인식합니다.

– ** Mongoose에 DB를 연결하여 비디오 모델 감지 **

* 초기화.js

– server.js는 서버의 명시적인 사항 및 구성과 관련된 코드를 처리하기 위한 것일 뿐입니다.

– 데이터베이스와 모델 등을 가져오는 역할이 분리되어 있으므로 init.js가 처리합니다.

– init.js는 모든 것을 초기화하는 파일입니다.

– 대신 package.json(스크립트의 개발 부분) 시작 시 기존 server.js 대신 init.js를 연결하여 먼저 실행

//모든걸 초기화시켜주는 파일

import "./db"; //파일 그 자체를 import
import "./models/Video";
import app from "./server"
const PORT = 4000;

const handleListening = () => console.log(`✅ Server listening on port http://localhost:${PORT} 🚀`)
app.listen(PORT, handleListening)

* 데이터베이스에 연결


* 콜백 기능

  • 어떤 일이 일어난 후에 호출되는 함수
  • 예를 들어 javascript에서 대기를 표현하는 한 가지 방법입니다.

    B. 포트에서 수신 대기하고 포트가 발생할 때 옆에 작성된 기능을 실행합니다.

  • 조건이 맞으면 어떤 기능이 발동하듯이 기다리면 발동!
    !
    !
  • 일부는 런타임에 적용되지 않을 수 있습니다.

    결과를 기다려야 한다
export const home = (req, res) => {
    Video.find(); //데이터가 전송되는 것을 기다려야 함
    //데이터베이스는 자바스크립트 밖에 존재하기 때문
    console.log("working") //자바스크립트에서 바로 실행 가능
    return res.render("home", { pageTitle: "Home", videos });
}
const handleSearch = (error, videos)=>{
    // 아래 callback function과 이렇게 독립된 function을 불러오는 것은 똑같음
}
export const home = (req, res) => {
    Video.find({},(error, videos)=>{
        //mongoose는 이걸 database
    }); 
    return res.render("home", { pageTitle: "Home", videos });
}

– Mungo는 데이터베이스에서 Video.find({} 부분을 호출합니다.

– 데이터베이스가 응답하면 mongoose는 옆에 있는 함수(콜백 함수)를 실행합니다.

– 그런 다음 Mongoose는 err 및 video 값을 로드합니다.

export const home = (req, res) => {
    Video.find({}, (error, videos) => {
        console.log("errors", error)
        console.log("videos", videos)
    });
    console.log("Hello")
    return res.render("home", { pageTitle: "Home", videos: () });
}


Chapter 6(2) MongoDB 1

– Videos.find() 함수 뒤에 hello가 나오지만 먼저 실행된다.

  • 요청이 완료되면 로거( GET ~)가 방출됩니다.

  • 요청 페이지(GET)
  • 안녕하세요 인쇄 후
  • 렌더링 프로세스를 거친 후 로거 가져오기
더보기

export const home = (req, res) => {
    console.log("Starting Search")
    Video.find({}, (error, videos) => {
        console.log("Finished Searching")
    });
    console.log("I should be the last one...")
    return res.render("home", { pageTitle: "Home", videos: () });
}


Chapter 6(2) MongoDB 2

1. 데이터베이스 검색(검색 시작)

2. 끝에 있는 코드(내가 마지막이 되어야지…)가 실행된다.

3. 그리고 Video.find() 종료!
(검색종료)

이것이 리콜이다

마지막에 일부 코드 실행

export const home = (req, res) => {
    Video.find({}, (error, videos) => {
        return res.render("home", { pageTitle: "Home", videos: () });
    });
    // database 검색이 끝나야 rendering 시작됨
}

  • 오류를 즉시 확인할 수 있습니다.

    추가 코드 없이 오류를 즉시 로드할 수 있습니다!
  • 함수 안의 함수는 이런 식으로 생겼네요…

* 약속(비동기 – 대기)

  • Callback의 최신 버전이라고 생각하세요!
export const home = async (req, res) => {
    console.log("I start")
    const videos = await Video.find({})
    console.log("I finish")
    console.log(videos)
    return res.render("home", { pageTitle: "Home", videos: () });
}


Chapter 6(2) MongoDB 3

  • 나는 출력을 시작한다
  • Videos.find() 실행
  • 내가 마무리
  • 및 비디오 출력
  • 그런 다음 렌더링(GET ~)

약속하다

  • Videos.find() 앞에 await를 넣으면 find는 콜백이 필요하지 않다는 것을 알게 됩니다.

  • 따라서 find는 찾은 동영상을 즉시 반환합니다.

  • 수색작전 결과!

– try – catch 문을 사용하여 오류 발생

  • 코드를 먼저 시도하고 포함된 오류를 확인하십시오.
    • res.render 실행 중 오류가 발생하면 오류를 잡아서 실행하십시오.
export const home = async (req, res) => {
    try {
        const videos = await Video.find({})
        return res.render("home", { pageTitle: "Home", videos: () });
    } catch (error){
        return res.render("server-error",{error})
    }
}

– 대기는 데이터베이스를 기다리고 있습니다!

– await만 있으면 javascript는 계속 대기합니다.

결과가 데이터베이스에서 수신될 때까지.

– async 및 await 사용은 직관적입니다.

JavaScript가 대기 중인 위치와 방법을 즉시 확인할 수 있습니다!

더보기

export const home = async (req, res) => {
    try {
        console.log("start")
        const videos = await Video.find({})
        console.log("finished")
        return res.render("home", { pageTitle: "Home", videos: () });
    } catch {
        return res.render("server-error")
    }
}


Chapter 6(2) MongoDB 4

데이터베이스에서 정보가 검색되기를 기다리면 코드가 순서대로 진행될 수 있습니다.


반환 및 렌더링

  • 돌아가든 말든 상관없다.

  • 결정적인 요소는 어떤 함수를 호출하느냐입니다.

  • 이미 렌더링된 것은 다시 렌더링할 수 없습니다.

  • 따라서 함수를 실행한 후 추가 작업을 방지하기 위해 return을 사용하여 사용할 수 있습니다.

  • return을 사용하여 함수를 종료할 수 있습니다!
  • 반환이 필요하지 않습니다.

    필요한 함수를 호출하기만 하면 됩니다.