[MongoDB] Model๊ณผ Schema๊ฐ€ ๋ญ์ฃ ..? ๐Ÿค”

Shin Hyun Wooยท2022๋…„ 12์›” 1์ผ
0
post-thumbnail

John ahn๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  node๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๊ธฐ๋„ ํ•˜๊ณ  mongoDB๋‚˜ mongoos์˜ ๊ธฐ์ดˆ๋„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋Š์ •๋„ ์Šค์Šค๋กœ ์ดํ•ดํ•ด๋ณด๊ณ ์ž ๊ฒŒ์‹œ๋ฌผ์„ ์“ด๋‹ค.

๊ฐ•์˜์—์„œ Mongoose์˜ model๊ณผ schema๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ model์ด๋ž€ schema๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชฐ๋ผ์„œ ๊ฐ•์˜๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ต๊ฒŒ ๋Š๊ปด์กŒ๋‹ค. ๊ทธ๋ž˜์„œ ์—ญ์‹œ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

Model

๊ฐ•์˜์—์„œ๋Š” model์€ 'schema'๋ฅผ ๊ฐ์‹ธ๊ธฐ ์œ„ํ•œ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.
๊ฐ•์˜ ์ž๋ฃŒ์—์„œ๋Š” '๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ, ์ฟผ๋ฆฌ, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ ๋“ฑ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค'๊ณ  ํ•œ๋‹ค.

Schema

๊ฐ•์˜ ์ž๋ฃŒ๋ฅผ ๋ณด๋ฉด 'Schema๋Š” ๋ฌธ์„œ์˜ ๊ตฌ์กฐ, ๊ธฐ๋ณธ๊ฐ’, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ์„ ์ •์˜ํ•œ๋‹ค'๊ณ  ํ•œ๋‹ค.
๋˜ํ•œ John ahn๋‹˜์˜ ์˜ˆ์‹œ๋กœ ์ƒํ’ˆ์— ๊ด€๋ จ๋œ ๊ธ€์„ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๊ธ€์„ ์ž‘์„ฑํ•œ ์‚ฌ๋žŒ์ด ๋ˆ„๊ตฌ์ธ์ง€, ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€์˜ ์ œ๋ชฉ์€ ๋ฌด์—‡์ธ์ง€, ์„ค๋ช…์€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๊ฐ’์˜ ํƒ€์ž…์ด๋‚˜ ์ œํ•œ(์œ ํšจ์„ฑ ๊ฒ€์‚ฌ) ๊ฐ™์€ ๊ฒƒ์„ ์ง€์ •์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด Schema๋ผ๊ณ  ํ•œ๋‹ค.
์กฐ๊ธˆ ๋” ์•Œ์•„๋ณด๊ณ  ์‹ถ์–ด์„œ ๊ณต์‹๋ฌธ์„œ์™€ ์—ฌ๋Ÿฌ ๊ฒŒ์‹œ๋ฌผ์„ ๊ตฌ๊ธ€๋งํ•ด์„œ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

A schema is a JSON object that defines the the structure and contents of your
data.
...
Schemas represent types of data rather than specific values. App Services supports many built-in schema types. These include primitives, like strings and numbers, as well as structural types, like objects and arrays, which you can combine to create schemas that represent custom object types.

์ถœ์ฒ˜ : MongoDB Documentation

๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ์™€ ์ฝ˜ํ…์ธ (๋‚ด์šฉ)์„ ์ •์˜ํ•˜๋Š” JSON ๊ฐ์ฒด๋ผ๊ณ  ์„ค๋ช…ํ•œ๋‹ค.
Schema๋Š” ํŠน์ •ํ•œ ๊ฐ’์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๊ณ , ๋ฌธ์ž์—ด, ์ˆซ์ž์—ด ๊ฐ™์€ ์›์‹œ ํƒ€์ž…์˜ ์ž๋ฃŒํ˜•๊ณผ ๊ฐ์ฒด, ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์  ์œ ํ˜•(Structural types)๊ฐ€ ํฌํ•จ์ด ๋˜๊ณ , ์ด๊ฒƒ๋“ค์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด๋Š” Schema๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Zerocho๋‹˜์˜ ๋ธ”๋กœ๊ทธ์—์„œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

Mongoose์˜ Schema๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์Šคํ‚ค๋งˆ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ๋„ฃ๊ธฐ ์ „์— ๋จผ์ € ๊ฒ€์‚ฌํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ž‘์„ฑํ•œ ์Šคํ‚ค๋งˆ์— ์–ด๊ธ‹๋‚˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
๋˜ํ•œ ์Šคํ‚ค๋งˆ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์ธ๋ฑ์Šค๊นŒ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ธฐ๋ณธ๊ฐ’ ๋˜ํ•œ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ฆ‰, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํŽธ์˜ ๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜๋กœ ๋ชจ์•„๋‘์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

๊ฐ•์˜์—์„œ Schema๋Š” ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋งŒ๋“ ๋‹ค.

const mongoose = require("mongoose");

const userSchema = mongoose.Schema({
  name: {
    type: String,
    maxlength: 50,
  },
  email: {
    type: String,
    trim: true,
    unique: 1,
  },
  password: {
    type: String,
    minlength: 5,
  },
  lastname: {
    type: String,
    maxlength: 50,
  },
  role: {
    type: Number,
    default: 0,
  },
  image: String,
  token: {
    type: String,
  },
  tokenExp: {
    type: Number,
  },
});

์ฝ”๋“œ ๋‚ด์—์„œ ๊ฐ์ฒด ์•ˆ์˜ ์†์„ฑ๋ช…(property)์ด ํ•„๋“œ์˜ ์ด๋ฆ„์ด ๋œ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ํ’€์–ด์„œ ๋ณด์ž๋ฉด,
email์˜ ์ž๋ฃŒํ˜•์€ String์ด๊ณ  ์œ ์ผํ•ด์•ผํ•˜๊ณ , ๋ฐ์ดํ„ฐ์˜ ๊ณต๋ฐฑ์„ ์—†์•ค๋‹ค.
password์˜ ์ž๋ฃŒํ˜•์€ String์ด๊ณ  ์ตœ์†Œ 5๊ธ€์ž์—ฌ์•ผํ•œ๋‹ค.
role์˜ ์ž๋ฃŒํ˜•์€ Number์ด๊ณ  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ 0์„ ์ง€์ •ํ•œ๋‹ค. (role์˜ ์ž๋ฃŒํ˜•์ด Number์ธ ์ด์œ ๋Š” 1์ผ๋•Œ ๊ด€๋ฆฌ์ž, 0์ผ๋•Œ ์ผ๋ฐ˜ ์œ ์ €๋กœ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.)
๋งŒ์•ฝ ํ•„์ˆ˜ ๊ฐ’์„ ์›ํ•œ๋‹ค๋ฉด require ์†์„ฑ๋ช…์„ ์ถ”๊ฐ€ํ•ด์„œ boolean๊ฐ’์„ ๋ฐ›์•„์ฃผ๋ฉด true์ผ ๋•Œ ํ•ด๋‹น ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผํ•œ๋‹ค๊ณ  ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Schema๋ฅผ ์ •๋ฆฌํ•˜์ž๋ฉด ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ์™€ ๋‚ด์šฉ์„ ์ •์˜ํ•˜๋Š” JSON ๊ฐ์ฒด์ด๋ฉฐ, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํŽธ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ์•„๋‘” Mongoose์˜ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

Schema ๋“ฑ๋ก

์ž‘์„ฑํ•œ Schema๋ฅผ ๋“ฑ๋กํ•˜๋ ค๋ฉด model() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ธ์ž๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

const User = mongoose.model("User", userSchema);

model()์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” '์ปฌ๋ ‰์…˜์˜ ์ด๋ฆ„'์ด๋ฉฐ, ์ปฌ๋ ‰์…˜์— ์ด๋ฆ„์— ๋Œ€๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ•์ œ๋กœ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ ํ›„ ๋“ฑ๋ก์ด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.
๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์ž‘์„ฑํ–ˆ๋˜ schema๋ฅผ ๋„ฃ์œผ๋ฉด User๋ผ๋Š” ๋ชจ๋ธ์— ์ž‘์„ฑํ•œ userSchema๋ฅผ ์ ์šฉ์‹œํ‚ค๋Š” ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ๊ฐ™๋‹ค.
๋งŒ์•ฝ ์ปฌ๋ ‰์…˜ ์ด๋ฆ„์ด ๊ฐ•์ œ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์ด ๋ง˜์— ๋“ค์ง€ ์•Š์œผ๋ฉด ์„ธ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฌธ์ž์—ด์„ ๋„ฃ์–ด ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

const User = mongoose.model("User", userSchema, "myfreename");
profile
untiring_dev - Notion ํŽ˜์ด์ง€๋Š” ์ •๋ฆฌ ์ค‘!

0๊ฐœ์˜ ๋Œ“๊ธ€