๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ๏ธ 21-2 IPP/Node.js study

Node.js - 17 ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๊ฐœ์„ (+๊ฐ€์ƒ ์†์„ฑ, ์•ก์…˜)

by hanwitjus 2021. 11. 4.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ ์Šคํ‚ค๋งˆ๋กœ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์—†๋‹ค.

๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

 

+) ์Šคํ‚ค๋งˆ ํƒ€์ž…

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์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ์†์„ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ ์‚ฌ์šฉ์ž์˜ ํ’€๋„ค์ž„์„ ์–ป๊ธฐ ์œ„ํ•œ ๊ฐ€์ƒ ์†์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

models/user.js

 

58ํ–‰์€ ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณด๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•œ ๋ฌธ์žฅ์ด๋‹ค.

๊ฐ€์ƒ์†์„ฑ์„ ์ด๋ ‡๊ฒŒ ์ง€์ •ํ•˜๊ณ , ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ js ํŒŒ์ผ์—์„œ user.fullName ์ด๋Ÿฐ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋Ÿฌ๋ฉด ์ € ํ•จ์ˆ˜๋Š” return๋ฌธ์— ์˜ํ•ด last์™€ first name์„ ํ•ฉ์ณ์„œ ์ „๋‹ฌํ•ด์ค€๋‹ค.

 

์ด๋ก ์ ์œผ๋กœ๋Š” ์ด๋Ÿฐ๋ฐ,,, ๋ง‰์ƒ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด ์ œ๋Œ€๋กœ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค. ์ถœ๋ ฅํ•ด๋ณด๋ฉด {} ์ด๋Ÿฐ์‹์œผ๋กœ ๋นˆ ๋Œ€๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๊ฑฐ๋‚˜

undefined ๋ผ๊ณ  ๋‚˜์˜จ๋‹ค.. ๊ทผ๋ฐ ์ผ๋‹จ ๋‹น์žฅ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™์ง„ ์•Š์•„์„œ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ„๋‹ค.

 

 

์•ก์…˜

 

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ชจ๋“ˆ์˜ export ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•ด ์ƒˆ๋กœ์šด ์ปจํŠธ๋กค๋Ÿฌ ์•ก์…˜์„ ์ƒ์„ฑํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋” ๋งŽ์€ ์•ก์…˜์„ ๋งŒ๋“ค์ˆ˜๋ก export๋ฅผ ๊ทธ๋งŒํผ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•˜๋‹ค.

 

๊ทธ๋ž˜์„œ ์ƒˆ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด module.exports ์•ˆ์— ์•ก์…˜์„ ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๋ชจ๋‘ ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์›๋ž˜๊ฐ™์œผ๋ฉด ์ด๋ ‡๊ฒŒ exports.(ํ•จ์ˆ˜์ด๋ฆ„) ์ด๋Ÿฐ์‹์œผ๋กœ ์•ก์…˜์„ exports๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ–ˆ๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ 

 

 

์ด๋ ‡๊ฒŒ ํ•˜๊ฒ ๋‹จ ์†Œ๋ฆฌ์ด๋‹ค.

๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜์™€ ์•ก์…˜ ๊ฐ„์˜ ์ข€ ๋” ๋‚˜์€ ์—ฐ๋™์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

LIST

๋Œ“๊ธ€