<MongoDB> Model - Video

김민석·2021년 1월 8일
1

YouTube clone

목록 보기
24/54

이번 시간에는 데이터 베이스 모델은 무엇인지 살펴보고 생성해보겠습니다. 모델이라는 것은 내가 생성할 파일의 형태를 정의해줍니다. 형태라는 것은 어떤 내용이 들어가고 그 내용은 어떤 자료형을 갖고 있는지를 의미한다고 할 수 있습니다.

project

youtube
 *|init.js
 +|models
   +|Video.js
  |controllers
   *|videoController.js

Video.js

  • model 정의
    model은 data의 이름을 의미합니다.
  • schema 정의
    schema는 data의 형태를 의미합니다. data가 어떤 이름으로 들어오는지, 어떤 type을 갖는지를 정의해줍니다.
  • option: required
    정의한 모델을 생성하기 위해서 꼭 필요한 데이터를 의미합니다. 따라서 해당 데이터가 없이 생성을 요청할 경우에 출력할 에러메시지를 입력해줍니다.
  • option: default
    모델을 생성할 때 따로 전달하지 않아도 default값을 갖는 것을 의미합니다. 조회수 같은 경우에 굳이 전달하지 않고 default 값 0을 사용하면 좋습니다.
  • fileUrl
    video를 생성할 때 데이터베이스에 실제 video 파일을 담게 되면 데이터베이스가 매우 무거워집니다. 실제 비디오 파일은 서버에 올리고 데이터베이스에는 해당 파일의 주소만 담는 것이 좋습니다.
  • createdAt
    createdAt의 default 값이 Date.now로 되어있는데요. 실행값(Date.now())를 준게 아니고 함수 자체를 주어서 데이터가 만들어지는 시점에 실행되게 됩니다. 즉 데이터가 만들어지는 시점을 default값으로 가지게 됩니다.

더 자세하게 type 종류나 정의 방법등을 살펴보려면 링크 클릭

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이 꼭 필요한 것은 아니므로 required는 정의하지 않습니다. 
  //type만 정의할 경우에는 객체로 전달하지 않아도 됩니다.
  description: String,
  views:{
    type: Number,
    default: 0
  },
  createdAt: {
    type: Date,
    default: Date.now
  }
});

const model = mongoose.model('Video', VideoSchema);

export default model;

init.js

위에서 만든 모델을 mongoose connection이 알게 하기 위해 init.js에서 import 해줍니다.

import './db';
import './models/Video';

videoController.js

먼저 위에서 만들어준 모델을 import 합니다. Video.find({})를 하면 데이터베이스에서 모든 Video element를 불러오는데요. 서버에서 불러오기 때문에 언제 올지 모릅니다. async-await가 필요하게 됩니다. try-catch문으로 하는 이유는 try-catch 없이 async-await문에서 오류가 도중에 발생하면 videos에 undefined가 넘겨지고 javascript는 에러 발생 여부와 관계없이 다음 코드를 실행하기 때문에 결국 아예 페이지가 깨져버리게 됩니다.

import Video from '../models/Video';

export const home = async(req, res) => {
  try{
    const videos = await Video.find({});
    res.render("home", {videos});
  }catch(err){
    console.log(err);
    res.render("home", {videos:[]});
  }
}
profile
누구나 실수 할 수 있다고 생각합니다. 다만 저는 같은 실수를 반복하는 사람이 되고 싶지 않습니다. 같은 실수를 반복하지 않기 위해 기록하여 기억합니다.🙃

0개의 댓글