๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ฐ์ดํฐ ์ ์ฅ ์ ์คํค๋ง๋ก ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ ์ ์๋ค.
๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์์๋ณด์.
+) ์คํค๋ง ํ์
JavaScript์ ๋ฐ์ดํฐ ํ์ ๊ณผ ๋น์ทํ๋ค.
์ฐจ์ด์ ์ Mongoose ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํน์ ์ฐ๊ด๊ด๊ณ๊ฐ ์๋ค๋ ๊ฒ์ด๋ค.
String | JavaScript์ String ํ์ ์ผ๋ก ์ ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฒ ๋ค๋ ์๋ฏธ. |
Date | ์ธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ฑฐ๋ ์์ ๋๋์ง ์ ์ ์๋ค. JavaScript์ Date ๊ฐ์ฒด๋ฅผ ๋ฐ์ ์ ์๋ค. |
Array | ๋ฆฌ์คํธ ์์ดํ ์ ์์ฑ์ ์ ์ฅํ ์ ์๋ค. ๋๊ดํธ๋ก ๋ฌถ์ ๋ฐฐ์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ค. |
Mixed | ํค-๊ฐ ์์ ๋ชจ๋ธ์ ์ ์ฅํ๋ค. mongoose.Schema.Types.Mixed๋ฅผ ์ ์ํด์ผ ํ๋ค. |
ObjectId | ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค. ๋ชจ๋ธ ์ํธ๊ฐ ์กฐํฉ์ด ์ผ๋ ๋ ํนํ ์ค์ํ๋ค. mongoose.Schema.Types.ObjectId๋ฅผ ์ ์ํด์ผ ํ๋ค. |
Subscriber.js์์ ์คํค๋ง์ Validator ์ถ๊ฐ
๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด Mongoose์ Validator๋ฅผ ์ถ๊ฐํ๋ค.
Validator๋ ๋ชจ๋ธ ์์ฑ์ ์ ์ฉ๋๋ฉฐ ์ ํจ์ฑ ๊ฒ์ฆ์ ์คํจํ๋ฉด DB์ ์ฅ ๋ฑ์ ํ์ง ๋ชปํ๊ฒ ํ๋ค.
์ด๋ฉ์ผ ์ฃผ์๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ ์ ๋์๋ฌธ์ ๋ฌธ์ ๋ฅผ ์์ ๊ธฐ ์ํด lowercase ์์ฑ์ true๋ก ์ค์ ํ๋ค.
์ฐํธ๋ฒํธ ์์ฑ์ ํ์ ํญ๋ชฉ์ ์๋์ง๋ง, ์๋ฆฌ์์ ์ต์๊ฐ, ์ต๋๊ฐ์ด ์กด์ฌํ๋ค. 10000์๋์ ๊ฐ์ด ์ ๋ ฅ๋๋ฉด ์ฌ์ฉ์ ์ ์ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ , 99999 ์ด์์ด ์ ๋ ฅ๋๋ฉด Mongoose๋ก ๋ถํฐ ์๋ฌ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ฉฐ ๋ฐ์ดํฐ๋ ์ ์ฅ๋์ง ์์ ๊ฒ์ด๋ค.
(+ ์ด๋ฉ์ผ ์์ฑ์์ ์ฌ์ฉ๋ unique ์ต์ ์ validator๋ ์๋๋ฉฐ mongoose ์คํค๋ง์ ํฌํผ์ ๊ฐ๊น๋ค. ํฌํผ๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ ํจ์ฑ ํ๊ฐ์์ ๊ฐ์ด ๋์ํ๋ ๋ฉ์๋ ๊ฐ์ ๊ฒ์ด๋ค.)
Subscriber.js์์ ์คํค๋ง์ ์ธ์คํด์ค ๋ฉ์๋ ์ถ๊ฐ
์คํค๋ง ํ์ผ์ ๋ค๋ฅธ ์ธ์คํด์ค๋ ์ ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
instance ๋ฉ์๋๋ subscriberSchema.methods ์ ์ํด ์ ์๋๊ณ ,
์ ์ (static) ๋ฉ์๋๋ subscriberShema.statics ์ ์ํด ์ ์๋๋ค.
23ํ~25ํ์ getInfo๋ ๊ตฌ๋ ์ ์ ๋ณด๋ฅผ ํ ์ค๋ก ์ป๊ธฐ ์ํด ํธ์ถํ๋ค.
27ํ~31ํ์ findLocalSubscribers๋ ๋์ผ ์ฐํธ๋ฒํธ์ ๊ตฌ๋ ์๋ค์ ๋ฐฐ์ด์ ํํ๋ก ๋๋ ค์ค๋ค.
๋ ๋ง์ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ผ๋, Mongoose ์์ฒด์ ์ผ๋ก ์ฌ๋ฌ๊ฐ์ง ์ฟผ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.
์ฟผ๋ฆฌ | ์ค๋ช |
find | ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์ ๋ง๋ ๋ ์ฝ๋์ ๋ฐฐ์ด์ ๋๋ ค์ค๋ค. ์ด๋ฆ์ด "Jon"์ด๋ผ๋ ๊ตฌ๋
์๋ฅผ ๊ฒ์ํ๋ ค๋ฉด Subscriber.find({name: "Jon"})์ผ๋ก ๊ฒ์ํ๋ฉด ๋๋ค. |
findOne | ๋จ์ผ ๋ ์ฝ๋๋ฅผ ๋๋ ค์ค๋ค. Subscriber.findOne({name: "Jon"})์ ๊ฒ์ํ๋ฉด ๊ฒฐ๊ณผ๋ค์ ํ๋์ ๋ํ๋จผํธ์ ๋ด์์ ๋๋ ค์ค๋ค. |
findById | ObjectId๋ฅผ ํค๋ก ์ฟผ๋ฆฌํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋๋ฐ ์ฉ์ด. |
remove | ๋ชจ๋ ๋ํ๋จผํธ๋ฅผ ์ญ์ ํ๊ธฐ ์ํ ๊ตฌ๋ฌธ. |
์ด๋ค ๊ฐ ์ฟผ๋ฆฌ๋ ํ๋ผ๋ฏธ์ค๋ฅผ ๋๋ ค์ค๋ค. ๋ฐ๋ผ์ then๊ณผ catch๋ฅผ ์ฌ์ฉํด ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ค.
REPL์์์ ํ ์คํ ๋ชจ๋ธ
ํฐ๋ฏธ๋ ์ฐฝ์์ node๋ฅผ ์ ๋ ฅํ๊ณ REPL ๋ชจ๋๋ก ๋ค์ด๊ฐ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ค.
(๊ตณ์ด ์ ์ด๋ ๊ฒ ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ด์ ๊ฑ ์ํ์)
๋ชจ๋ธ ์กฐํฉ์ ์์ฑ
Mongoose ํจํค์ง๋ ๊ฐ์ฒด์งํฅ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๊ฐ์ ธ์ค๋๋ก ํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ๊ฐ๋ฐ์ ๋ง์ ์๊ฐ์ ์ ์ฝํ ์ ์๊ฒ ํด์ค๋ค.
๊ทธ๋ฌ๋ ๊ด๊ณํDB๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ํ ์ด๋ธ์ด ์กด์ฌํ์ง ์๊ณ , ์กฐ์ธ๋ ๋ถ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ๊ด๊ณํDB์์์ ์ผ๋์ผ, ์ผ๋๋ค, ๋ค๋๋ค ๊ด๊ณ๋ฅผ ๊ตฌํํ ์๋ ์์ด๋ณด์ธ๋ค.
์ฐ๊ฒฐ๋ ๋ชจ๋ธ ์ด๋ฆ์ ์์ฑ์ผ๋ก ์ถ๊ฐํ๋ค. (๋ง์น ์ธ๋ํค ํ๋์ฒ๋ผ)
ex) ๊ตฌ๋ ์(subscribers)-๊ฐ์ข(courses)
- Course ์คํค๋ง์ subscribers ์์ฑ ์ถ๊ฐ
subscribers: [{
type: mongoose.Schema.Types.ObjectId,
ref: "Subscriber" }]
>> ํ ๊ฐ์ข์ ์ฌ๋ฌ๋ช ์ ๊ตฌ๋ ์๊ฐ ์์ ์ ์์.
- Subscriber ์คํค๋ง์ courses ์์ฑ ์ถ๊ฐ
courses: [{
type: mongoose.Schema.Types.ObjectId,
ref: "Course" }]
>> ์ฌ๋ฌ๊ฐ์ ๊ฐ์ข๋ฅผ ๋ฑ๋กํ ์ ์์.
๋๊ดํธ๋ ๋ค์ค์ฐธ์กฐ ๋ฐฐ์ด์ ์๋ฏธํ๋ค. ๊ตฌ๋ ์๊ฐ ํ๋์ ๊ฐ์ข๋ง ์ ์ฒญ ๊ฐ๋ฅํ๋ค๋ฉด ๋๊ดํธ๋ฅผ ์์ ์ผํ๋ค.
์ด์ ์ค์ ๋ก ๊ฐ๋ณ ๋ชจ๋ธ์ ์ฐ๊ฒฐ์ํค๋ ค๋ฉด JavaScript ํ ๋น ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
ex) subscriber1, course1์ด ์๊ณ , ๊ตฌ๋ ์๋ ๋ค์์ ๊ฐ์ข์ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋ค๊ณ ๊ฐ์ .
subscriber1.courses.push(course1)์ ์คํ์์ผ์ผ ํ๋ค. (ObjectId๋ก๋ ํธ์ ๊ฐ๋ฅ)
๊ฐ์ข ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ ์๋ก๋ถํฐ ๊ฒ์ํ๋ ค๋ฉด ๊ฐ์ข์ ObjectId์ Course ๋ชจ๋ธ์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฐ๊ฒฐ๋ ๊ฐ์ข ์ฝํ ์ธ ์ ๋ฐ๋ฅธ ๊ตฌ๋ ์ ์ฟผ๋ฆฌ๋ฅผ ์ํ populate ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฐ๊ฒฐ ๋ชจ๋ธ๋ก๋ถํฐ์ ๋ฐ์ดํฐ ํฌ๋ฎฌ๋ ์ดํ
Population์ ๋ชจ๋ธ๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ ๋ชจ๋ ๋ํ๋จผํธ๋ฅผ ๊ฐ๊ณ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ถ๊ฐํ๊ฒ ํด์ฃผ๋ ๋ฉ์๋๋ค.
์ง์ง ๋ญ์๋ฆฐ์ง ๋ชจ๋ฅด๊ฒ ๋ค.
์์๋ก ์ข ์ดํด๋ฅผ ํด๋ดค๋๋ฐ,
Subscriber.populate(subscriber, "courses") ์ด๋ ๊ฒ ์ ์ํ๋ฉด,
subscriber ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ฐ์ข๋ฅผ ํ๋์ Course ๋ํ๋จผํธ๋ก ๋ฐ๊ฟ์ฃผ๊ฒ ๋๋ค.
์์ ์ฝ๋๋ฅผ ์์ฑํด๋ดค๋ค.
const mongoose = require("mongoose"),
Subscriber = require("./models/subscriber"),
Course = require("./models/course");
var testCourse, testSubscriber;
mongoose.connect(
"mongodb://localhost:27017/recipe_db",
{useNewUrlParser: true}
);
mongoose.Promise = global.Promise;
Subscriber.remove({})
.then((items) => console.log("Remove " + items.n + " records!"))
.then(() => {
return Course.remove({});
})
.then((items) => console.log("Remove " + items.n + " records!"))
.then(() => {
return Subscriber.create({
name: "Hannah",
email: "hannah@jo.com",
zipCode: "12345"
});
})
.then(subscriber => {
console.log("Create Subscriber " + subscriber.getInfo());
})
.then(() => {
return Subscriber.findOne({
name: "Hannah"
});
})
.then(subscriber => {
testSubscriber = subscriber;
console.log("Found one subscriber: " + subscriber.getInfo());
})
.then(() => {
return Course.create({
title: "Tomato Land",
description: "Locally farmed tomatos only",
zipCode: 12345,
items: ["cherry", "heirloom"]
});
})
.then(course => {
testCourse = course;
console.log("Created course: " + course.title);
})
.then(() => {
testSubscriber.courses.push(testCourse);
testSubscriber.save();
})
.then(() => {
return Subscriber.populate(testSubscriber, "courses");
})
.then(subscriber => console.log(subscriber))
.then(() => {
return Subscriber.find({courses: mongoose.Types.ObjectId(testCourse._id)});
})
.then(subscriber => console.log(subscriber));
์ฝ๋ ์์๋
1. ๊ตฌ๋ ์ ๊ด๋ จ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊นจ๋์ด ์ ๋ฆฌ
2. ํ๋ผ๋ฏธ์ค ์ฒด์ธ์ ๊ตฌ์ฑํ๋ค
๊ตฌ๋ ์ ์์ฑ / testSubscriber๋ผ๋ ์ธ๋ถ ๋ณ์ ์ ์ฅ / testCourse ์ธ๋ถ๋ณ์ ์ ์ฅ
3. ๋ ๋ชจ๋ธ ์ธ์คํด์ค ์ฐ๊ฒฐ
4. ์ฐ๊ฒฐ populating
5. ๊ฒฐ๊ณผ ๋ก๊น
๊ฒฐ๊ณผ๋
์ด๋ ๊ฒ ๋์จ๋ค. ๋ ์ ์ดํดํ๊ธฐ ์ํด ๋ช๋ฒ ๋ค์ ์ฝ์ด๋ด์ผ๊ฒ ๋ค. ๊ฐ๋ ์ด ์ ์ดํด๊ฐ ์๊ฐ๋ค.
(+ 2021.11.08 16:18 ์ถ๊ฐ)
๊ฐ์ ์์ฑ
: ๊ณ์ฐ๋ ์์ฑ (computed attribute)
์ ๊ท ์คํค๋ง ์์ฑ๊ณผ ์ ์ฌํ์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ง ์๋๋ค.
DB์ ์ ์ฅ๋์ง ์์ง๋ง ์ฌ์ฉ์ ๋ชจ๋ธ์์ user.zipCode์ ๊ฐ์ด ๋ค๋ฅธ ์์ฑ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ํ๋ค.
๊ทธ๋์ ์ฌ์ฉ์์ ํ๋ค์์ ์ป๊ธฐ ์ํ ๊ฐ์ ์์ฑ์ ์ถ๊ฐํ๋ค.
58ํ์ ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ณด๊ธฐ ์ํด ์ถ๊ฐํ ๋ฌธ์ฅ์ด๋ค.
๊ฐ์์์ฑ์ ์ด๋ ๊ฒ ์ง์ ํ๊ณ , ์ปจํธ๋กค๋ฌ๋ ๋ค๋ฅธ js ํ์ผ์์ user.fullName ์ด๋ฐ์์ผ๋ก ์ ๊ทผํด์ ์ฌ์ฉํ ์ ์๊ณ , ๊ทธ๋ฌ๋ฉด ์ ํจ์๋ return๋ฌธ์ ์ํด last์ first name์ ํฉ์ณ์ ์ ๋ฌํด์ค๋ค.
์ด๋ก ์ ์ผ๋ก๋ ์ด๋ฐ๋ฐ,,, ๋ง์ ์คํ์์ผ๋ณด๋ฉด ์ ๋๋ก ๋์ค์ง ์๋๋ค. ์ถ๋ ฅํด๋ณด๋ฉด {} ์ด๋ฐ์์ผ๋ก ๋น ๋๊ดํธ๊ฐ ๋์ค๊ฑฐ๋
undefined ๋ผ๊ณ ๋์จ๋ค.. ๊ทผ๋ฐ ์ผ๋จ ๋น์ฅ ๋ด ํ๋ก์ ํธ์์ ์ฌ์ฉํ ๊ฒ ๊ฐ์ง ์์์ ๊ทธ๋ฅ ๋์ด๊ฐ๋ค.
์ก์
์ง๊ธ๊น์ง๋ ๋ชจ๋์ export ๊ฐ์ฒด์ ์ถ๊ฐํด ์๋ก์ด ์ปจํธ๋กค๋ฌ ์ก์ ์ ์์ฑํ๋ค.
๊ทธ๋ฌ๋ ๋ ๋ง์ ์ก์ ์ ๋ง๋ค์๋ก export๋ฅผ ๊ทธ๋งํผ ๋ฐ๋ณตํ๊ฒ ๋๋ฉฐ, ์ด๊ฒ์ ๊ทธ๋ค์ง ํจ์จ์ ์ด์ง ๋ชปํ๋ค.
๊ทธ๋์ ์๋กญ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด module.exports ์์ ์ก์ ์ ์ฝค๋ง๋ก ๊ตฌ๋ถํด์ ๋ชจ๋ ํฌํจ์ํค๋ ๊ฒ์ด๋ค.
์๋๊ฐ์ผ๋ฉด ์ด๋ ๊ฒ exports.(ํจ์์ด๋ฆ) ์ด๋ฐ์์ผ๋ก ์ก์ ์ exports๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํด์ ์ ์ํ๋๋ฐ, ๊ทธ๋ ๊ฒ ํ์ง ์๊ณ
์ด๋ ๊ฒ ํ๊ฒ ๋จ ์๋ฆฌ์ด๋ค.
๋ฏธ๋ค์จ์ด ํจ์์ ์ก์ ๊ฐ์ ์ข ๋ ๋์ ์ฐ๋์ ์ฌ์ฉํ๊ธฐ ์ํด ์ด๋ ๊ฒ ์์ ํด์ ์ฌ์ฉํ๋ค.
'โ๏ธ 21-2 IPP > Node.js study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Node.js - 19 ํจ์ค์๋ ํด์ฑ, ์ ํจ์ฑ ๋ฏธ๋ค์จ์ด (0) | 2021.11.09 |
---|---|
Node.js - 18 ์ธ์ ๊ณผ ํ๋์ ๋ฉ์์ง, ์ฌ์ฉ์ ๊ณ์ ์ธ์ฆ (0) | 2021.11.08 |
Node.js - 16 ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ธ๊ณผ์ ์ฐ๊ฒฐ (0) | 2021.11.03 |
Node.js - 15 Mongoose๋ฅผ ์ฌ์ฉํ ๋ชจ๋ธ ์ ์ (0) | 2021.10.29 |
Node.js - 14 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ (0) | 2021.10.28 |
๋๊ธ