영벨롭 개발 일지

[MongoDB]Node.js Mongoose를 이용하여 스키마와 모델 구성 본문

Database/MongoDB

[MongoDB]Node.js Mongoose를 이용하여 스키마와 모델 구성

영벨롭 2022. 7. 7. 18:29

[ Mongoose의 Schema와 Model ]

 

 스키마(schema)는 해당 컬렉션의 문서에 어떤 종류의 값이 들어갈지를 정의하는 구조라고 할 수 있습니다. 데이터베이스의 테이블, 컬렉션 타입 및 속성을 정의하는 문서의 형태 또는 구조입니다. 

 

 모델(model)은 스키마를 통해서 만드는 인스턴스로, 작성된 스키마를 인스턴스화하여 실제 데이터베이스에서 적용이 가능하도록 바뀐 형태입니다. 

 

 컬렉션(collection)은 관계형 데이터베이스(RDBMS)의 테이블과 동일하며, 여러 JSON 문서를 보유할 수 있습니다. 

 

 

 

[ Schema 정의하기 ]

// mongoose import
const mongoose = require("mongoose");
const Schema = mongoose.Schema;

// schema 생성
const testSchema = new Schema(...);

// schema를 'Test'라는 이름의 model로 외부에서 사용할 수 있도록 함
module.exports = mongoose.model('Test', testSchema);

 

 ★ Schema 속성

속성 타입 설명
required boolean 필수 입력
unique boolean 다른 행과 중복되면 안됨
trim boolean 공백 제거(문자열 타입에 사용)
default 문서가 생성될 때 기본값
lowercase boolean 대문자를 소문자로 저장
match 정규표현식 저장하려는 값과 비교
validate [ function(){...}, '함수 실패했을 시 문자열'] 함수로 개발자가 조건을 만듬
set fucntion(){} 값을 입력할 때 함수로 조건을 만듬
get function(){} 값을 출력할 때 함수로 조건을 만듬
ref '모델이름' 해당하는 모델을 참조할 때 사용
minlength / maxlength number 문자열 타입의 최소 / 최대 길이

 

 

 ★ Schema 타입

 스키마의 type 속성과 함께 사용합니다. 

타입 설명
Number 숫자 타입
Boolean 불리언 타입
String 문자열 타입
Buffer 바이너리 타입
Date 날짜 
Array 배열, [] 를 사용해서 표시
ex) [String] 문자열 타입의 배열
Schema.Types.ObjectId 명시적으로 id 타입을 사용할 때
Schema.Types.Mixed 다양한 타입 저장가능, 객체 배열 JSON으로 사용

 

 

 server/model/ 위치에 User.js 파일을 생성하여 유저 정보를 담을 스키마를 정의하였습니다. 

// server/model/User.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const userSchema = new Schema({
  id: Schema.Types.ObjectId,
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    trim: true,
    required: true,
    match: /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
  },
  password: {
    type: String,
    validate: [
      function(password){
        return password && password.length > 6;
      },
      "비밀번호 길이가 6보다 커야합니다."
    ]
  }
})

module.exports = mongoose.model('User', userSchema);

 

 

 

[ Model 사용하기 ]

 server/server.js 파일로 이동하여 위에서 정의한 스키마를 모델로 사용해봅시다. 

 

const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser')
const PORT = 4000;
const DBURL = '###'

// Model
const User = require('./model/User');

const mongoose = require('mongoose');

// mongoose의 connection 메소드를 변수 db에 할당
let db = mongoose.connection;
// db 연결 실패 시
db.on('error', console.error);
// db 연결 성공 시
db.once('open', () => {
  console.log('MongoDB is connected');
})

// mongodb cluster와 연결
mongoose.connect(DBURL, {
  useUnifiedTopology: true,
  useNewUrlParser: true
})


app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());

app.get('/', (req, res) => {
  res.send({ success: true })
})

// User 등록
app.post('/register', (req, res) => {
  // 인스턴스 생성
  const user = new User();
  const { name, email, password } = req.body;

  user.name = name;
  user.email = email;
  user.password = password;

  user.save((err) => {
    if(err){
      return res.status(400).send(err);
    } else {
      return res.status(201).send({
        success: true
      })
    }
  })
})

app.listen(PORT, () => {
  console.log(`Server is running on ${PORT}`)
})

 

 post에 성공하면 콘솔창에 '성공'을 띄오도록 했는데 잘 나오네요!

 

 mongodb cluster도 확인해봅시다~!

 

 

반응형