์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋…ธ๋“œ 2] 2์žฅ. ์•Œ์•„๋‘ฌ์•ผ ํ•  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

23-24/Node.js 2

by _๋„๋‹ด 2023. 9. 29. 10:00

๋ณธ๋ฌธ

728x90

๐ŸŒŸ2์žฅ ํ‚ค์›Œ๋“œ๐ŸŒŸ

ES2015

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ํ”„๋กœํ† ํƒ€์ž…

๋น„๋™๊ธฐ

ํ”„๋กœ๋ฏธ์Šค, async/await

AJAX

 

 

2.1. ES2015

ES2015๋Š” ES6๋ผ ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๋ฉฐ, 2015๋…„์— ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์„ ๋„์ž…ํ•˜์—ฌ ๊ฐœ์„ ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ES2015 ์ด์ƒ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๋ฌธ๋ฒ• ๋ช‡ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

2.1.1. const, let

  • ๋ณ€์ˆ˜ ์„ ์–ธ์ด var์—์„œ const, let์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
if (true) {
  var x = 3;
}
console.log(x); // 3

if (true) {
  const y = 3;
}
console.log(y); // Uncaught ReferenceError: y is not defined
var const let
ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„, ๋ธ”๋ก ๋ฐ–์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ ๋ธ”๋ก ์Šค์ฝ”ํ”„, ๋ธ”๋ก ๋ฐ–์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ ๋ธ”๋ก ์Šค์ฝ”ํ”„, ๋ธ”๋ก ๋ฐ–์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ
ํ•œ ๋ฒˆ ๊ฐ’์„ ํ• ๋‹นํ•ด๋„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ํ•œ ๋ฒˆ ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ ํ•œ ๋ฒˆ ๊ฐ’์„ ํ• ๋‹นํ•ด๋„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • ๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ const๋ฅผ ์‚ฌ์šฉํ•˜๋˜, ๋‹ค๋ฅธ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธธ ๋•Œ let์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

 

2.1.2 ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด

  • ES2015 ๋ฌธ๋ฒ•์— ๋ฐฑํ‹ฑ(`)์œผ๋กœ ๊ฐ์‹ธ๋Š” ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.
const num3 = 1;
const num4 = 2;
const result2 = 3;
const string2 = `${num3} ๋”ํ•˜๊ธฐ ${num4}๋Š” '${result2}'`;
console.log(string2);  // 1 ๋”ํ•˜๊ธฐ 2๋Š” '3'
  • ${๋ณ€์ˆ˜} ํ˜•์‹์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ๋”ํ•˜๊ธฐ ๊ธฐํ˜ธ ์—†์ด ๋ฌธ์ž์—ด์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฑํ‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํฐ๋”ฐ์˜ดํ‘œ์™€ ์ž‘์€๋”ฐ์˜ดํ‘œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

2.1.3 ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด

  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
var sayNode = function() {
    console.log('Node');
};
var es='ES';

var oldObject = {
		sayJS: function() {              // 1๋ฒˆ
		    console.log('JS');
    },
		sayNode: sayNode,                // 2๋ฒˆ
}
oldObject[es + 6] = 'Fantastic';         // 3๋ฒˆ
oldObject.sayNode();
oldObject.sayJS();
console.log(oldObject.ES6);

const newObject = {
    sayJS(){
        console.log('JS');
    },
    sayNode,
    [es+6]:'Fantastic',
};
newObject.sayNode();      // Node
newObject.sayJS();        // JS
console.log(newObject.ES6);  // Fantastic
  1. ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์— ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์ฝœ๋ก (:)๊ณผ function์„ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
  2. sayNode์ฒ˜๋Ÿผ ์†์„ฑ๋ช…๊ณผ ๋ณ€์ˆ˜๋ช…์ด ๋™์ผํ•œ ๊ฒฝ์šฐ๋Š” ํ•œ ๋ฒˆ๋งŒ ์จ๋„ ๋ฉ๋‹ˆ๋‹ค.
  3. ๊ฐ์ฒด์˜ ์†์„ฑ๋ช…์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๐Ÿ“Œ  ์ด์ „์—๋Š” ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด(oldObject) ๋ฐ”๊นฅ์—์„œ [es+6]๋ฅผ ํ•ด์•ผ ํ–ˆ์—ˆ๋Š”๋ฐ,
           ์ด์ œ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด(newObject) ์•ˆ์— ๋™์  ์†์„ฑ์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋”ฉ์˜ ํŽธ์˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ ์ž ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, ์ต์ˆ™ํ•ด์ง€๋ฉด ์ฝ”๋“œ์˜ ์–‘์„ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2.1.4 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

function add1(x, y) {
	return x + y;
}
  
const add2 = (x, y) => {
	return x + y;
};
  
const add3 = (x, y) => x + y;
  
const add4 = (x, y) => (x + y);
  
function not1(x) {
	return !x;
}
  
const not2 = x => !x;
  • function ์„ ์–ธ ๋Œ€์‹  => ๊ธฐํ˜ธ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜์—ฌ ๋‚˜์ค‘์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด๋ถ€์— return๋ฌธ๋ฐ–์— ์—†๋Š” ๊ฒฝ์šฐ, return ๋Œ€์‹  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

// ๊ธฐ์กด function๊ณผ ๋‹ค๋ฅธ ์  : this ๋ฐ”์ธ๋“œ ๋ฐฉ์‹
var relationship1 = {
	name: 'zero',
	friends: ['nero', 'hero', 'xero'],
	logFriends: function() {   // function ์„ ์–ธ๋ฌธ ์‚ฌ์šฉ
		var that = this; // relationship1์„ ๊ฐ€๋ฆฌํ‚ค๋Š” this๋ฅผ that์— ์ €์žฅ
		this.friends.forEach(function (friend) {
			console.log(that.name, friend);
		});
	},
};
relationship1.logFriends();

var relationship2 = {
	name: 'zero',
	friends: ['nero', 'hero', 'xero'],
	logFriends() {     // :, function ์—†์Œ
		//var that = this; ํ•„์š” ์—†์Œ.
		this.friends.forEach(friend => {
			console.log(this.name, friend);
		});
	},
};
relationship2.logFriends();
relationship1 (๊ธฐ์กด)  relationship2 (ES2015 ์ดํ›„)
logFriends() ์•ˆ์˜ forEach๋ฌธ์—์„œ function ์„ ์–ธ๋ฌธ ์‚ฌ์šฉ  logFriends() ์•ˆ์˜ forEach๋ฌธ์—์„œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉ
๊ฐ์ž ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ
that์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ relationship1์— ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผ
๋ฐ”๊นฅ ์Šค์ฝ”ํ”„์ธ logFriends()์˜ this๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ 
(์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ)

 

2.1.5. ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น

  • ๊ฐ์ฒด์™€ ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ์†์„ฑ์ด๋‚˜ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๋Š” ์ฝ”๋“œ
var candyMachine = {
	status: {
		name: 'node',
		count: 5,
	},
	getCandy: function () {
		this.status.count--;
		return this.status.count;
	},
};
var getCandy = candyMachine.getCandy;
var count = candyMachine.status.count;

// ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ
const candyMachine = {
	status: {
		name: 'node',
		count: 5,
	},
	getCandy() {    // :, function ์‚ญ์ œ
		this.status.count--;
		return this.status.count;
	},
};
const { getCandy, status: { count } } = candyMachine;
  • candyMachine ๊ฐ์ฒด ์•ˆ์˜ ์†์„ฑ์„ ์ฐพ์•„์„œ ๋ณ€์ˆ˜์™€ ๋งค์นญํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„ ์ฝ”๋“œ๋Š” getCandy์™€ count ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

// ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น ๋ฌธ๋ฒ•
var array = ['nodjs', {}, 10, true];
var node = array[0];
var obj = array[1];
var bool = array[3];

// ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ
const array = ['nodejs', {}, 10, true];
const[node, obj, , bool] = array;    // 10์€ ๋ฌด์‹œ
  • node๋Š” ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ, obj๋Š” ๋‘ ๋ฒˆ์งธ ์š”์†Œ, bool์€ ๋„ค ๋ฒˆ์งธ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
  • 10์—๋Š” ๋ณ€์ˆ˜๋ช…์„ ์ง€์–ด์ฃผ์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ 10์€ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

 

2.1.6. ํด๋ž˜์Šค

  • ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ๋ฌธ๋ฒ•์„ ๋ณด๊ธฐ ์ข‹๊ฒŒ ํด๋ž˜์Šค๋กœ ๋ฐ”๊พผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—,
    ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ๋™์ž‘์ด ์•„๋‹Œ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ํ”„๋กœํ† ํƒ€์ž…์ด๋ž€?
https://www.nextree.co.kr/p7323/

// ํ”„๋กœํ† ํƒ€์ž… ์ƒ์† ์˜ˆ์ œ ์ฝ”๋“œ
var Human = function(type) {
  this.type = type || 'human';
};

Human.isHuman = function(human) {
  return human instanceof Human;
}

Human.prototype.breathe = function() {
  alert('h-a-a-a-m');
};

var Zero = function(type, firstName, lastName) {
  Human.apply(this, arguments);        // ์ƒ์†๋ฐ›๋Š” ๋ถ€๋ถ„
  this.firstName = firstName;
  this.lastName = lastName;
};

Zero.prototype = Object.create(Human.prototype);  // ์ƒ์†๋ฐ›๋Š” ๋ถ€๋ถ„
Zero.prototype.constructor = Zero; // ์ƒ์†ํ•˜๋Š” ๋ถ€๋ถ„
Zero.prototype.sayName = function() {
  alert(this.firstName + ' ' + this.lastName);
};
var oldZero = new Zero('human', 'Zero', 'Cho');
Human.isHuman(oldZero); // true
  • Human ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ , Zero ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ๊ทธ ํ•จ์ˆ˜๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ๋‚œํ•ดํ•˜๊ณ  ๋ณต์žกํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

// ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ฝ”๋“œ (๋™์ž‘์€ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜)
class Human {
  constructor(type = 'human') {
    this.type = type;
  }

  static isHuman(human) {       // staic ํ‚ค์›Œ๋“œ๋กœ ์ „ํ™˜
    return human instanceof Human;
  }

  breathe() {
    alert('h-a-a-a-m');
  }
}

class Zero extends Human {  
  constructor(type, firstName, lastName) {
    super(type);  
    this.firstName = firstName;
    this.lastName = lastName;
  }

  sayName() {
    super.breathe();
    alert(`${this.firstName} ${this.lastName}`);
  }
}

const newZero = new Zero('human', 'Zero', 'Cho');
Human.isHuman(newZero); // true
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” constructor์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  • Human.isHuman ๊ฐ™์€ ํด๋ž˜์Šค ํ•จ์ˆ˜๋Š” static ํ‚ค์›Œ๋“œ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœํ† ํƒ€์ž… ํ•จ์ˆ˜๊ฐ€ class ๋ธ”๋ก ์•ˆ์— ํฌํ•จ๋ผ์„œ ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ํด๋ž˜์Šค ์†Œ์†์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • extends ํ‚ค์›Œ๋“œ๋กœ ์‰ฝ๊ฒŒ ์ƒ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์—ฌ์ „ํžˆ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

2.1.7. โญํ”„๋กœ๋ฏธ์Šคโญ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋…ธ๋“œ์—์„œ๋Š” ์ฃผ๋กœ ๋น„๋™๊ธฐ๋ฅผ ์ ‘ํ•˜๋ฉฐ, ํŠนํžˆ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ES2015๋ถ€ํ„ฐ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋…ธ๋“œ์˜ API๋“ค์ด ์ฝœ๋ฐฑ ๋Œ€์‹  ํ”„๋กœ๋ฏธ์Šค(Promise) ๊ธฐ๋ฐ˜์œผ๋กœ ์žฌ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
๐Ÿ“Œ ๋น„๋™๊ธฐ๋ž€?

2022.09.19 - [22-23/22-23 Node.js] - [Node.js] 1์žฅ ๋…ธ๋“œ ์‹œ์ž‘ํ•˜๊ธฐ

 

โœ” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•…๋ช… ๋†’์€ ์ฝœ๋ฐฑ ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•ด ๋ด…์‹œ๋‹ค!

const condition = true; // true๋ฉด resolve, false๋ฉด reject
const promise = new Promise((resolve, reject) => {   // ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
  if (condition) {
    resolve('์„ฑ๊ณต');
  } else {
    reject('์‹คํŒจ');
  }
});
// ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ
promise
  .then((message) => {
    console.log(message); // ์„ฑ๊ณต(resolve)ํ•œ ๊ฒฝ์šฐ ์‹คํ–‰
  })
  .catch((error) => {
    console.error(error); // ์‹คํŒจ(reject)ํ•œ ๊ฒฝ์šฐ ์‹คํ–‰
  })
  .finally(() => { // ๋๋‚˜๊ณ  ๋ฌด์กฐ๊ฑด ์‹คํ–‰
    console.log('๋ฌด์กฐ๊ฑด');
  });
  • promise ์•ˆ์—๋Š” resolve์™€ reject๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ–๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.
    โœ” resolve ⇒ then์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    โœ” reject ⇒ catch๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    โœ” finally ⇒ ์ƒ๊ด€์—†์ด ๋ฐ˜๋“œ์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • resolve์™€ reject์— ๋„ฃ์–ด์ค€ ์ธ์ˆ˜๋Š” ๊ฐ๊ฐ then๊ณผ catch์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

โญํ”„๋กœ๋ฏธ์Šค๋ž€?

  • ์‹คํ–‰์€ ๋ฐ”๋กœ ํ•˜๋˜ ๊ฒฐ๊ด๊ฐ’์€ ๋‚˜์ค‘์— ๋ฐ›๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • new Promise๋Š” ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€๋งŒ, ๊ฒฐ๊ด๊ฐ’์€ then์ด๋‚˜ catch ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœ๋ฏธ์Šค๋ฅผ returnํ•œ ๊ฒฝ์šฐ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ˆ˜ํ–‰๋œ ํ›„ ๋‹ค์Œ then์ด๋‚˜ catch๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

 

ํ”„๋กœ๋ฏธ์Šค ์‘์šฉ

// ์ฝœ๋ฐฑ์„ ์“ฐ๋Š” ํŒจํ„ด
function findAndSaveUser(Users) {
  Users.findOne({}, (err, user) => { // ์ฒซ ๋ฒˆ์งธ ์ฝœ๋ฐฑ
    if (err) {
      return console.error(err);
    }
    user.name = 'zero';
    user.save((err) => { // ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ
      if (err) {
        return console.error(err);
      }
      Users.findOne({ gender: 'm' }, (err, user) => { // ์„ธ ๋ฒˆ์งธ ์ฝœ๋ฐฑ
        // ์ƒ๋žต
      });
    });
  });
}
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์„ธ ๋ฒˆ ์ค‘์ฒฉ๋˜์–ด ์ฝ”๋“œ์˜ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์ง‘๋‹ˆ๋‹ค.
  • ๊ฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋งˆ๋‹ค ๋”ฐ๋กœ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
// ํ”„๋กœ๋ฏธ์Šค๋กœ ๋ฐ”๊พผ ์ฝ”๋“œ
function findAndSaveUser(Users) {
  Users.findOne({})
    .then((user) => {
      user.name = 'zero';
      return user.save();
    })
    .then((user) => {
      return Users.findOne({ gender: 'm' });
    })
    .then((user) => {
      // ์ƒ๋žต
    })
    .catch(err => {
      console.error(err);
    });
}
  • then ๋ฉ”์„œ๋“œ๋“ค์€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์—๋Ÿฌ๋Š” ๋งˆ์ง€๋ง‰ catch์—์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ”„๋กœ๋ฏธ์Šค ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ํ•œ๋ฒˆ์— ์‹คํ–‰

const promise1 = Promise.resolve('์„ฑ๊ณต1');
const promise2 = Promise.resolve('์„ฑ๊ณต2');
Promise.all([promise1, promise2])
  .then((result) => {
    console.log(result); // ['์„ฑ๊ณต1', '์„ฑ๊ณต2'];
  })
  .catch((error) => {
    console.error(error);
  });
  • ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ ์ „๋ถ€ Promise.all์— ๋„ฃ์œผ๋ฉด ๋ชจ๋‘ resolve ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ then์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.
  • Promise ์ค‘ ํ•˜๋‚˜๋ผ๋„ reject ๋˜๋ฉด catch๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

์–ด๋–ค ํ”„๋กœ๋ฏธ์Šค์—์„œ reject ๋˜์—ˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” Promise.allSettled๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// Promise.allSettled ์‚ฌ์šฉ
const promise1 = Promise.resolve('์„ฑ๊ณต1');
const promise2 = Promise.reject('์‹คํŒจ2');
const promise3 = Promise.resolve('์„ฑ๊ณต3');
Promise.allSettled([promise1, promise2, promise3])
  .then((result) => {
    console.log(result);
/* [
*    { status: 'fulfilled', value: '์„ฑ๊ณต1' },
*    { status: 'rejected', reason: '์‹คํŒจ2' },
*    { status: 'fulfilled', value: '์„ฑ๊ณต3' }
*  ]
*/
  })
  .catch((error) => {
    console.error(error);
  });

 

try {
  Promise.reject('์—๋Ÿฌ');
} catch (e) {
  console.error(e); // UnhandledPromiseRejection: This error originated either by throwing inside...
}

Promise.reject('์—๋Ÿฌ').catch(() => {
  // catch ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
})
  • Node 16 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” reject ๋œ Promise์— ๋ฐ˜๋“œ์‹œ catch ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ™์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด UnhandledPromiseRejection์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

2.1.8. async/await

  • ES2017์—์„œ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ, ๋น„๋™๊ธฐ ์œ„์ฃผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด์•ผ ํ•  ๋•Œ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ณ„์† ๋ฐ˜๋ณต๋˜๋Š” then๊ณผ catch๊นŒ์ง€ ์ค„์—ฌ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด ๋ด…์‹œ๋‹ค.
// ๊ธฐ์กด์ฝ”๋“œ
function findAndSaveUser(Users) {
  Users.findOne({})
    .then((user) => {
      user.name = 'zero';
      return user.save();
    })
    .then((user) => {
      return Users.findOne({ gender: 'm' });
    })
    .then((user) => {
      // ์ƒ๋žต
    })
    .catch(err => {
      console.error(err);
    });
}
// async/await๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ
async function findAndSaveUser(Users) {
  try {
    let user = await Users.findOne({});
    user.name = 'zero';
    user = await user.save();
    user = await Users.findOne({ gender: 'm' });
    // ์ƒ๋žต
  } catch (error) {
    console.error(error);
  }
}

โœ” ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜์—์„œ async function์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
โœ” ํ”„๋กœ๋ฏธ์Šค ์•ž์— await์„ ๋ถ™์ž…๋‹ˆ๋‹ค.

์ด์ œ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolve ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๋‹ค์Œ ๋กœ์ง์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

(await Users.findOne()์ด resolve๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ user ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”)

 

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ + async ํ•จ๊ป˜ ์‚ฌ์šฉ
const findAndSaveUser = async (Users) => {
  try {
    let user = await Users.findOne({});
    user.name = 'zero';
    user = await user.save();
    user = await Users.findOne({ gender: 'm' });
    // ์ƒ๋žต
  } catch (error) {
    console.error(error);
  }
};
// for๋ฌธ๊ณผ async/await๋ฅผ ํ†ตํ•œ ํ”„๋กœ๋ฏธ์Šค ์ˆœ์ฐจ์  ์‹คํ–‰
const promise1 = Promise.resolve('์„ฑ๊ณต1');
const promise2 = Promise.resolve('์„ฑ๊ณต2');
(async () => {
  for await (promise of [promise1, promise2]) {
    console.log(promise);
  }
})();
// ์‹คํ–‰ ํ›„ then์„ ๋ถ™์ด๊ฑฐ๋‚˜ ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์•ˆ์—์„œ await ๋ถ™์—ฌ ์ฒ˜๋ฆฌ
async function findAndSaveUser(Users) {
  // ์ƒ๋žต
}

findAndSaveUser().then(() => { /* ์ƒ๋žต */ });
// ๋˜๋Š”
async function other() {
  const result = await findAndSaveUser();
}

๐Ÿ’ก ์•ž์œผ๋กœ ์ค‘์ฒฉ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๊ฑฐ์ณ async/await ๋ฌธ๋ฒ•์œผ๋กœ ๋ฐ”๊พธ๋Š” ์—ฐ์Šต์„ ํ•ด๋ด…์‹œ๋‹ค!

 

2.1.9. Map/Set

  • Map, Set์€ ES2015์— ์ถ”๊ฐ€๋œ ์ƒˆ๋กœ์šด ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
  • Map์€ ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•˜๋ฉฐ, Set์€ ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
const m = new Map();

m.set('a', 'b'); // set(ํ‚ค, ๊ฐ’)์œผ๋กœ Map์— ์†์„ฑ ์ถ”๊ฐ€
m.set(3, 'c'); // ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ’์„ ํ‚ค๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
const d = {};
m.set(d, 'e'); // ๊ฐ์ฒด๋„ ๋ฉ๋‹ˆ๋‹ค.

m.get(d); // get(ํ‚ค)๋กœ ์†์„ฑ ๊ฐ’ ์กฐํšŒ
console.log(m.get(d)); // e

m.size; // size๋กœ ์†์„ฑ ๊ฐœ์ˆ˜ ์กฐํšŒ
console.log(m.size) // 3

for (const [k, v] of m) { // ๋ฐ˜๋ณต๋ฌธ์— ๋ฐ”๋กœ ๋„ฃ์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  console.log(k, v); // 'a', 'b', 3, 'c', {}, 'e'
} // ์†์„ฑ ๊ฐ„์˜ ์ˆœ์„œ๋„ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

m.forEach((v, k) => { // forEach๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  console.log(k, v); // 'a', 'b', 3, 'c', {}, 'e'
});

m.has(d); // has(ํ‚ค)๋กœ ์†์„ฑ์„ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
console.log(m.has(d)); // true

m.delete(d); // delete(ํ‚ค)๋กœ ์†์„ฑ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
m.clear(); // clear()๋กœ ์ „๋ถ€ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
console.log(m.size); // 0
  • Map์€ ์†์„ฑ๋“ค ๊ฐ„์˜ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ์ด ๋˜๋ฉฐ, ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์†์„ฑ๋ช…(ํ‚ค ๊ฐ’)์œผ๋กœ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ’๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , size ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์†์„ฑ์˜ ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

const s = new Set();
s.add(false); // add(์š”์†Œ)๋กœ Set์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
s.add(1);
s.add('1');
s.add(1); // ์ค‘๋ณต์ด๋ฏ€๋กœ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
s.add(2);

console.log(s.size); // ์ค‘๋ณต์ด ์ œ๊ฑฐ๋˜์–ด 4

s.has(1); // has(์š”์†Œ)๋กœ ์š”์†Œ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
console.log(s.has(1)); // true

for (const a of s) {
  console.log(a); // false 1 '1' 2
}

s.forEach((a) => {
  console.log(a); // false 1 '1' 2
})

s.delete(2); // delete(์š”์†Œ)๋กœ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
s.clear(); // clear()๋กœ ์ „๋ถ€ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • Set์€ ์ค‘๋ณต์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ๋ฐฐ์—ด์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋„ Set์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2.1.10. ๋„ ๋ณ‘ํ•ฉ/์˜ต์…”๋„ ์ฒด์ด๋‹

??(๋„ ๋ณ‘ํ•ฉ) ์—ฐ์‚ฐ์ž์™€ ?.(์˜ต์…”๋„ ์ฒด์ด๋‹) ์—ฐ์‚ฐ์ž๋Š” ES2020์—์„œ ์ถ”๊ฐ€๋œ ์—ฐ์‚ฐ์ž๋“ค์ž…๋‹ˆ๋‹ค.

 

  • โœ” ??( ๋„ ๋ณ‘ํ•ฉ) ์—ฐ์‚ฐ์ž๋Š” ์ฃผ๋กœ || ์—ฐ์‚ฐ์ž ๋Œ€์šฉ๋˜๋ฉฐ, null๊ณผ undefined๋งŒ ๋”ฐ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
const a = 0;
const b = a || 3;  // || ์—ฐ์‚ฐ์ž๋Š” falsy ๊ฐ’์ด๋ฉด ๋’ค๋กœ ๋„˜์–ด๊ฐ
console.log(b); // 3

const c = 0;
const d = c ?? 3; // ?? ์—ฐ์‚ฐ์ž๋Š” null๊ณผ undefined์ผ ๋•Œ๋งŒ ๋’ค๋กœ ๋„˜์–ด๊ฐ
console.log(d); // 0;

const e = null;
const f = e ?? 3;
console.log(f);  // 3;

const g = undefined;
const h = g ?? 3;
console.log(h);  // 3;

 

  • ?. (์˜ต์…”๋„ ์ฒด์ด๋‹) ์—ฐ์‚ฐ์ž๋Š” null์ด๋‚˜ undefinde์˜ ์†์„ฑ ์กฐํšŒ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.
const a = {}
a.b; // a๊ฐ€ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋ฌธ์ œ์—†์Œ

const c = null;
try {
	c.d;  // undefined
} catch (e) {
	console.error(e);   // TypeError : Cannot read properties of null (reading 'd')
}
c?.d; // ๋ฌธ์ œ์—†์Œ

try {
	c.f(); // undefined
} catch (e) {
	console.error(e);  // TypeError : Cannot read properties of null (reading 'd')
}
c?.f(); // ๋ฌธ์ œ์—†์Œ

try {
	c[0]; // undefined
} catch (e) {
	console.error(e); // TypeError : Cannot read properties of null (reading 'd')
}
c?.[0]; // ๋ฌธ์ œ์—†์Œ

โœ” ์˜ต์…”๋„ ์ฒด์ด๋‹ ์—ฐ์‚ฐ์ž๋Š” TypeError: Cannot read properties of undefined ๋˜๋Š” null ์—๋Ÿฌ์˜ ๋ฐœ์ƒ ๋นˆ๋„๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“ ํ•จ๊ป˜ ๋ณด๋ฉด ์ข‹์€ ์ž๋ฃŒ

https://developer.mozilla.org/ko/docs/Web/JavaScript

https://github.com/tc39/proposals

 

 

 

2.2. ํ”„๋ŸฐํŠธ์—”๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

ํ”„๋ŸฐํŠธ์—”๋“œ์— ์‚ฌ์šฉ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ๋“ค(HTML์—์„œ script ํƒœ๊ทธ ์•ˆ์— ์ž‘์„ฑํ•˜๋Š” ๋ถ€๋ถ„)์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. 

 

2.2.1. AJAX (Asynchronous Javascript And XML)

  • ๋น„๋™๊ธฐ์  ์›น ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • ํŽ˜์ด์ง€ ์ด๋™ ์—†์ด ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
  • AJAX ์š”์ฒญ์€ jQuery๋‚˜ axios ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
// GET ์š”์ฒญ ๋ณด๋‚ด๊ธฐ
  axios.get('<<a href=https://www.zerocho.com/api/get>https://www.zerocho.com/api/get</a>>')
    .then((result) => {
      console.log(result);
      console.log(result.data); // {}
    })
    .catch((error) => {
      console.error(error);
    });
  • axios.get๋„ ๋‚ด๋ถ€์— new Promise๊ฐ€ ๋“ค์–ด์žˆ์–ด then๊ณผ catch ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

// ํ”„๋กœ๋ฏธ์Šค์ด๋ฏ€๋กœ async/await ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ
(async () => {
  try {
    const result = await axios.get('<<a href=https://www.zerocho.com/api/get>https://www.zerocho.com/api/get</a>>');
    console.log(result);
    console.log(result.data); // {}
  } catch (error) {
    console.error(error);
  }
})();
  • ํ”„๋กœ๋ฏธ์Šค์ด๋ฏ€๋กœ async/await ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

// POST๋ฐฉ์‹์˜ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ
(async () => {
  try {
    const result = await axios.post('<<a href=https://www.zerocho.com/api/post/json>https://www.zerocho.com/api/post/json</a>>', {
      name: 'zerocho',
      birth: 1994,
    });
    console.log(result);
    console.log(result.data);
  } catch (error) {
    console.error(error);
  }
})();
  • Post ๋ฐฉ์‹์˜ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋Š” axios.post๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

2.2.2. FormData

  • HTML form ํƒœ๊ทธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ AJAX์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
<script>
  // FormData ์ƒ์„ฑ์ž๋กœ formData ๊ฐ์ฒด ์ƒ์„ฑ
  const formData = new FormData();
  formData.append('name', 'zerocho');  // ํ‚ค-๊ฐ’ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ
  formData.append('item', 'orange');   // ํ‚ค ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’ ์ €์žฅ
  formData.append('item', 'melon');
  formData.has('item'); // true        // has: ์ฃผ์–ด์ง„ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ์žˆ๋‹ˆ?
  formData.has('money'); // false;
  formData.get('item');// orange       // ์ฃผ์–ด์ง„ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’ ํ•˜๋‚˜ ๊ฐ€์ ธ์˜ค๊ธฐ
  formData.getAll('item'); // ['orange', 'melon'];   ๋ชจ๋“  ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
  formData.append('test', ['hi', 'zero']);
  formData.get('test'); // hi, zero
  formData.delete('test');             // ํ˜„์žฌ ํ‚ค ์ œ๊ฑฐ
  formData.get('test'); // null  
  formData.set('item', 'apple');       // ํ˜„์žฌ ํ‚ค ์ˆ˜
  formData.getAll('item'); // ['apple'];
</script>
// axios๋กœ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์ „์†ก
(async () => {
  try {
    const formData = new FormData();
    formData.append('name', 'zerocho');
    formData.append('birth', 1994);
    const result = await axios.post('<<a href=https://www.zerocho.com/api/post/formdata>https://www.zerocho.com/api/post/formdata</a>>', formData);
    console.log(result);
    console.log(result.data);
  } catch (error) {
    console.error(error);
  }
})();

 

2.2.3. encodeURIComponent, decodeURIComponent

  • ์„œ๋ฒ„๊ฐ€ ํ•œ๊ธ€ ์ฃผ์†Œ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  (async () => {
    try {
      const result = await axios.get(`<a href=https://www.zerocho.com/api/search/$>https://www.zerocho.com/api/search/$</a>{encodeURIComponent('๋…ธ๋“œ')}`);
      console.log(result);
      console.log(result.data); // {}
    } catch (error) {
      console.error(error);
    }
  })();

 

 

โœ” ๋ฐ›๋Š” ์ชฝ์—์„œ๋Š” decodeURIComponent๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

 

2.2.4. ๋ฐ์ดํ„ฐ ์†์„ฑ๊ณผ dataset

  • HTML5์—์„œ HTML๊ณผ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต์‹์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
<ul>
  <li data-id="1" data-user-job="programmer">Zero</li>
  <li data-id="2" data-user-job="designer">Nero</li>
  <li data-id="3" data-user-job="programmer">Hero</li>
  <li data-id="4" data-user-job="ceo">Kero</li>
</ul>
<script>
  console.log(document.querySelector('li').dataset);  // ์ฒซ๋ฒˆ์งธ li ํƒœ๊ทธ์˜ ๋ฐ์ดํ„ฐ์†์„ฑ์— ์ ‘๊ทผ
  // { id: '1', userJob: 'programmer' }
</script>

โœ” HTML ํƒœ๊ทธ์˜ ์†์„ฑ์œผ๋กœ data-๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๋“ค์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.

 

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    โœ” dataset์˜ ์†์„ฑ์„ ํ†ตํ•ด ์ฒซ ๋ฒˆ์งธ li ํƒœ๊ทธ์˜ ๋ฐ์ดํ„ฐ ์†์„ฑ์— ์ ‘๊ทผ
  • data- ์ ‘๋‘์–ด๋Š” ์‚ฌ๋ผ์ง€๊ณ  -๋’ค์— ์œ„์น˜ํ•œ ๊ธ€์ž๋Š” ๋Œ€๋ฌธ์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
    โœ” data-id → id, data-user-job → userJob
  • dataset์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋„ HTML ํƒœ๊ทธ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
    โœ” dataset.monthSalary = 10000; → data-month-salary="10000"

 

 

[์ถœ์ฒ˜] ์กฐํ˜„์˜, ใ€ŽNode.js ๊ต๊ณผ์„œใ€, ๊ธธ๋ฒ—(2020), p65-91

 

 


๋นˆ์นธ ์ฑ„์šฐ๊ธฐ ๋ฌธ์ œ (๋นˆ์นธ์„ ๋“œ๋ž˜๊ทธํ•ด์„œ ์ •๋‹ต์„ ๋งžํ˜€ ๋ณด์„ธ์š”!)

  1. (ES2015)๋Š” ES6๋ผ ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๋ฉฐ, 2015๋…„์— ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์„ ๋„์ž…ํ•˜์—ฌ ๊ฐœ์„ ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  2. ES2015 ๋ฌธ๋ฒ•์— (๋ฐฑํ‹ฑ(`))์œผ๋กœ ๊ฐ์‹ธ๋Š” ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. (${๋ณ€์ˆ˜}) ํ˜•์‹์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ๋”ํ•˜๊ธฐ ๊ธฐํ˜ธ ์—†์ด ๋ฌธ์ž์—ด์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์˜ ํด๋ž˜์Šค ๋ฌธ๋ฒ•์€ (ํ”„๋กœํ† ํƒ€์ž…) ๊ธฐ๋ฐ˜ ๋ฌธ๋ฒ•์„ ๋ณด๊ธฐ ์ข‹๊ฒŒ ํด๋ž˜์Šค๋กœ ๋ฐ”๊พผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—,
    ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ๋™์ž‘์ด ์•„๋‹Œ (ํ”„๋กœํ† ํƒ€์ž…) ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  4. ES2015๋ถ€ํ„ฐ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋…ธ๋“œ์˜ API๋“ค์ด ์ฝœ๋ฐฑ ๋Œ€์‹  (ํ”„๋กœ๋ฏธ์Šค(Promise))๊ธฐ๋ฐ˜์œผ๋กœ ์žฌ๊ตฌ์„ฑ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ค‘์ฒฉ๋˜๋Š” ์ฝœ๋ฐฑ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. (async/await)๋Š” ES2017์—์„œ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ, ๋น„๋™๊ธฐ ์œ„์ฃผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด์•ผ ํ•  ๋•Œ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค์—์„œ then๊ณผ catch๊ฐ€ ๋ฐ˜๋ณต๋  ๋•Œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. (?.(์˜ต์…”๋„ ์ฒด์ด๋‹) ์—ฐ์‚ฐ์ž)๋Š”  null์ด๋‚˜ undefinde์˜ ์†์„ฑ ์กฐํšŒ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์—ฐ์‚ฐ์ž์ด๋ฉฐ, TypeError: Cannot read properties of undefined ๋˜๋Š” null ์—๋Ÿฌ์˜ ๋ฐœ์ƒ ๋นˆ๋„๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  7. (AJAX)๋Š” ๋น„๋™๊ธฐ์  ์›น ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋ฉฐ, ํŽ˜์ด์ง€ ์ด๋™ ์—†์ด ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

 

 

์ฝ”๋“œ ๋ฌธ์ œ

1. ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ ์œ„ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”๋ณด์„ธ์š”.

function findAndSaveUser(Users) {
  Users.findOne({}, (err, user) => { // ์ฒซ ๋ฒˆ์งธ ์ฝœ๋ฐฑ
    if (err) {
      return console.error(err);
    }
    user.name = 'zero';
    user.save((err) => { // ๋‘ ๋ฒˆ์งธ ์ฝœ๋ฐฑ
      if (err) {
        return console.error(err);
      }
    });
  });
}
์ •๋‹ต ๋ณด๊ธฐ
function findAndSaveUser(Users) {
  Users.findOne({})
    .then((user) => {
      user.name = 'zero';
      return user.save();
    })
    .catch(err => {
      console.error(err);
    });
}

 

2. async/await ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด ์œ„ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”๋ณด์„ธ์š”.

function findAndSaveUser(Users) {
  Users.findOne({})
    .then((user) => {
      user.name = 'zero';
      return user.save();
    })
    .then((user) => {
      return Users.findOne({ gender: 'm' });
    })
    .catch(err => {
      console.error(err);
    });
}
์ •๋‹ต ๋ณด๊ธฐ
async function findAndSaveUser(Users) {
  try {
    let user = await Users.findOne({});
    user.name = 'zero';
    user = await user.save();
    user = await Users.findOne({ gender: 'm' });
  } catch (error) {
    console.error(error);
  }
}

 


Node.js #2 

Editor : ํŒŒ์˜ค๋ฆฌ

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ