[wetube]#3.1~#3.4

6mn12j·2020년 9월 7일
1

WeTube

목록 보기
7/12
post-thumbnail

📃 결과물

임의의 데이터가 아닌 몽고 db와의 연결
video의 model과 schema를 만든 후 mongodb에 model 이있는 파일도 연결.
comment의 model과 schema를 만든 후 mongodb에 model 이있는 파일도 연결.

+connect mongodb,dotenv,monogdb schema

📃 목표

  • mongodb 설치 후 mongodb를 db.js 파일을 이용해서 conneting
  • mongodb 연결 성공, 실패 시 알려주기 위한 함수 생성
  • dotenv를 설정하여 db의 url , port번호 감추기.
  • video data 스키마 생성

📃 과정

어떤 유저든 영상을 보고 검색하고, 수정 ,삭제 ,영상 업로드 ,시청이 가능하도록 하기위한 database 작업의 연결 과정이다.video data의 schema를 만든 후 mongodb와 연결 해준다.

mongodb 설치 후 진행하는 과정 입니다.

mongodb 연결

mongodb 설치 후 $ npm install dotenv 설치 설치하는 이유는 아래 dotenv 내용에서 설명.

mognodb를 db.js파일에 import 하여 연결 한다.

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

mongoose.connect

mongoose.connect(
 "mongodb://localhost:27017/wetube",
 {
    userNewUrlParser: true,
    userFindAndMotify: false
    } //기본적으로 셋팅 해주는 부분
  );
 
  const db = mongoose.connection;
  
  const handleOpen = () =>console.log("✅ Connected to DB")
  const handleError = (error) => console.log(`❌ Error on DB Connection:${error}`)
  
  db.once("open",handleOpen);
  db.on("error",handleError);

connect 함수 안의 mongoose.connect는 몽고디비에 연결하는 부분으로. 주소는 로컬 몽고 디비 주소인 localhost:2017017을 사용합니다. "mongodb://localhost:포트번호/database이름"

연결된 db를 변수를 통해서 사용합니다.db.once("open",handelOpen); db연결을 once 한번 실행했을때 사용자에게 db와 연결 된걸 알려줄 수 있는 함수를 만들어 처리합니다.error가 발생 할때를 대비해서 db.on("error",handelOpen); error를 받아와서 어떤 error인지 보여주는 함수를 만들어 줍니다.

dotenv 설정하기

임의의 데이터 파일이 있던 db.js 에 mogodb와 dotenv를 import 해서 사용 한다.
dotenv 를 설정하는 이유는 위의 코드를 보면 db의 url과 port번호등 보안상의 위험이 있는 정보들이 노출 되어 있습니다. 이러한 정보들을 안전하게 감춰주는 역할을 한다.

  1. dotenv 설치
$ npm install dotenv
  1. .env 파일을 만든후 .gitignore에 추가 한다. .env 파일에는 db의 url,port 를 만들어서 넣어준다.
//.env
MONGO_URL ="mongodb://localhost:27017/wetube"
PROT = 4000
  1. .env파일의 정보들은 dotenv.config 함수를 통해서 정보를 다른파일에서 불러와서 사용 할 수 있다. 찾은 모든 variable들은 process.env.key에 저장 된다.url을 사용하는 db.js 와 PORT 번호를 사용하는 init.js 파일을 수정 해준다.
import mongoose from "mongoose";
import dotenv from "dotenv";
dotenv.config(); //process.env.key 에 .env 파일들이 저장됨.

mongoose.connect(
  //수정된 부분"mongodb://localhost:2707017/wetube"
  process.env.MONG_URL,
    {
    userNewUrlParser: true,
    userFindAndMotify: false
    }
  );

  const db = mongoose.connection;
  ...
  1. init.js 파일을 수정해서 PORT정보를 못 받아 올 경우를 대비해서 4000을 임의로 지정 해 줬다.
  
import dotenv from "dotenv";

dotenv.config();

//const PORT = 4000;
const PORT = process.env.PORT || 4000;

const handleListening =()=> console.log(`✅ Listening on : http://localhost:${PORT}`);

Mongdb Schema

mongodb의 장점중 한가지는 documnet(JSON file)를 줄여준다.
mongodb에게 잘못된 데이터가 들어가지 않게 우리의 파일은 이렇게 생겼어 라는걸 알려줘야 한다.
"우리의 파일들은 video라는 이름을 갖고 모든 video들은 string type의 title을 가질거야~~~" 라는걸 알려줘야 한다.
몽구스는 사용자가 작성한 스키마를 토대로 data를 넣기전에 먼저 검사 한다.

sql 처음에 할때 데이터들의 테이블을 만들어주는 작업과 비슷한것 같다. create table한 후 각 데이터들의 데이터 타입, 제약조건 들을 설정해 주는 경우와 비슷하다고 생각한다.

이런 data 모델들을 모아서 사용하기 위해서 models 파일을 만들어서 model 들을 사용한다.

  • model (data)
  • schema 형태

models 폴더의 Video.js 에 video 파일들의 정보를 담아준다.
mongoose.model("Video",VideoSchma); 를 통해서 Video는 fileUrl, title, views, createdAt 을 가진 VideoSchema 를 사용 한다. 만약 title에 string이 아닌값이 들어온다면 에러가 날것 이다. 다른 파일에서 사용이 가능하도록 export 해준다.

ref

https://mongoosejs.com/docs/guide.html
mongoose schema에 관한 정보는 위의 주소로

import mongoose from "mongoose";

const VideoSchema = new mongoose.Schema({
    fileUrl:{
        type: String,
        required: "File URL is required",   
    },
    title:{
        type:String,
        required:"Title is required"
    },
    description: String,
    views:{
        type:Number,
        default:0

    },
    createdAt:{
        type:Date,
        default:Date.now
    }
});


const model = mongoose.model("Video",VideoSchema);
export default model;

위의 과정 까지 마쳤다면 지금 우리의 database는 연결이 되어있지만 model이 만들어 진 걸 모르는 상태이다. init.js 에 import "./models/Video"; 를 추가해줘서 만들어진 걸 알려준다.

📃 전체 코드

//init.js
import "./db";
import app from "./app";
import dotenv from "dotenv";
import "./models/Video";
import"./models/comment";

 


//db.js
import mongoose from "mongoose";
import dotenv from "dotenv";
dotenv.config(); //process.env.key 에 .env 파일들이 저장됨.
mongoose.connect(
  process.env.MONG_URL,
    {
    userNewUrlParser: true,
    userFindAndMotify: false
    }
  );

  const db = mongoose.connection;
  
  const handleOpen = () =>console.log("✅ Connected to DB")
  const handleError = (error) => console.log(`❌ Error on DB Connection:${error}`)
  db.once("open",handleOpen);
  db.on("error",handleError);


//models/Video.js
import mongoose from "mongoose";

const VideoSchema = new mongoose.Schema({
  fileUrl: {
    type: String,
    required: "File URL is required"
  },
  title: {
    type: String,
    required: "Tilte is required"
  },
  description: String,
  views: {
    type: Number,
    default: 0
  },
  createdAt: {
    type: Date,
    default: Date.now
  },
  //comment가 생성되면 comment ID를 video에 array 형태로 넣는다
  comments: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Comment"
    }
  ]
});

const model = mongoose.model("Video", VideoSchema);
export default model;


//models/Comment.js
import mongoose from "mongoose";

const CommentSchema = new mongoose.Schema({
    text: {
        type: String,
        required: "Text is required"
    },
    createdAt: {
        type: Date,
        default:Date.now
    },
    
})

const model = mongoose.model("Comment",CommentSchema);
export default model;
profile
TIL 쩨끼럽 남기는 중 💻

0개의 댓글