๐Ÿ“š Study/JS, JQuery

๋™๊ธฐ๋ฐฉ์‹ vs ๋น„๋™๊ธฐ๋ฐฉ์‹, ์ฝœ๋ฐฑํ•จ์ˆ˜์™€ Promise ๊นŒ์ง€ ํ•œ๋ฒˆ์— ํ›‘์–ด๋ณด๊ธฐ!

kkh1902 2022. 5. 4. 13:39
728x90
๋ฐ˜์‘ํ˜•

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์˜ ๋ฐฉ์‹ :: ๋™๊ธฐ๋ฐฉ์‹ vs ๋น„๋™๊ธฐ๋ฐฉ์‹

๋™๊ธฐ๋ฐฉ์‹

์ˆœ์ฐจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹

์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ํ•ด๋‹น ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ๋‹ค์Œ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋ฉฐ ์ด ๋™์ž‘์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๋™์ž‘์€ ๋Œ€๊ธฐ์ƒํƒœ์ด๋‹ค.

 

์œ„ ๊ทธ๋Ÿผ a์ฒ˜๋Ÿผ ์นดํŽ˜์—์„œ ์ค„์„ ์„œ์„œ ์ปคํ”ผ๋ฅผ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ๋น„์œ ํ•˜๋Š”๋ฐ,

ํ•œ ๋™์ž‘์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ž‘์ด ๋Š๋ฆฌ๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ CPU๊ฐ€ ๋Š๋ ค์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์‹œ์Šคํ…œ ์ „์ฒด์ ์ธ ํšจ์œจ์ด ์ €ํ•˜๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์„ค๊ณ„๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด๋ผ๋Š” ์žฅ์ ์„ ๊ฐ€์ง€์ง€๋งŒ, ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ๋•Œ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค!

 

function func1(){ 
  console.log("1๋ฒˆ์ž…๋‹ˆ๋‹ค"); 
  func2(); 
} 
function func2(){ 
  console.log("2๋ฒˆ์ž…๋‹ˆ๋‹ค"); 
  func3(); 
} 
function func3(){ 
	console.log("3๋ฒˆ์ž…๋‹ˆ๋‹ค"); 
} 

func1(); 
//1๋ฒˆ์ž…๋‹ˆ๋‹ค 
//2๋ฒˆ์ž…๋‹ˆ๋‹ค 
//3๋ฒˆ์ž…๋‹ˆ๋‹ค

 

๋น„๋™๊ธฐ๋ฐฉ์‹

์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹

์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์— ๊ด€๊ณ„์—†์ด ๋ฐ”๋กœ ๋‹ค์Œ ๋™์ž‘์„ ์‹คํ–‰ํ•œ๋‹ค.

 

๋™๊ธฐ๋ณด๋‹ค ๋ณต์žกํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋”๋ผ๋„ ๊ทธ ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

why need?

ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ ํ–ˆ์„ ๋•Œ, ์„œ๋ฒ„๊ฐ€ ๊ทธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์–ธ์ œ ์ค„์ง€๋„ ๋ชจ๋ฅด๋Š”๋ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค ๋ฐ›์•„์งˆ๋•Œ๊นŒ์ง€ ์•ฑ์ด ๋Œ€๊ธฐ์ƒํƒœ๋กœ ๋จธ๋ฌผ๋Ÿฌ์žˆ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ๋ฐฉ์‹์ด ํ•„์š”ํ•˜๋‹ค.

 

* ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ๋ฐฉ์‹์ด ๊ฐ€๋Šฅํ•œ ์ด์œ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ”ํžˆ ์•Œ๊ณ ์žˆ๋“ฏ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ•œ๋‹ค.

**์‹ฑ๊ธ€์Šค๋ ˆ๋“œ**
ํ•œ ๋ฒˆ์— ํ•œ๊ฐ€์ง€ ์ผ๋งŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋‹จ์ผ ์Šค๋ ˆ๋“œ

๊ทธ๋Ÿฐ๋ฐ ๋™์‹œ์˜ ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋™์ž‘๋˜๋Š” ๋น„๋™๊ธฐ๋ฐฉ์‹์€ ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ์ž‘์—…์ผ ์ˆ˜ ๋ฐ–์— ์—†๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ๋ฐฉ์‹์ด ๊ฐ€๋Šฅํ•œ๊ฑธ๊นŒ?

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๋‚˜ Node.js์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ ์‹คํ–‰์ด ๋œ๋‹ค.

์ด ์—”์ง„์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋Œ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๋˜ํ•œ ์ด ์—”์ง„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ Web API๋ฅผ ๋‘์—ˆ๊ณ , ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์ธ Web API๋ผ๋Š” ๊ฒƒ์ด ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋ฉด์„œ ์—ฌ๊ธฐ์—์„œ setTimeout์ด๋‚˜ Ajax๋“ฑ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ์ผ๋“ค์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ด Web API๋“ค์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ์Šค๋ ˆ๋“œ์™€๋Š” ๋”ฐ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋”ฐ๋กœ ๋Œ๋ฉด์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์ด๋ฒคํŠธ ๋ฃจํ”„์— ๋“ค์–ด๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š”๋Œ€๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์œผ๋กœ ๋Œ๋ ค๋ณด๋‚ด์ค€๋‹ค.

example

setTimeout, ajax ...

 

setTimeout

function func1(){ 
  console.log("1๋ฒˆ์ž…๋‹ˆ๋‹ค"); 
  func2(); 
} 
function func2(){ 
  setTimeout(
    console.log("2๋ฒˆ์ž…๋‹ˆ๋‹ค");
    , 3000
  ); 
  func3(); 
} 
function func3(){ 
	console.log("3๋ฒˆ์ž…๋‹ˆ๋‹ค"); 
} 

func1(); 
//1๋ฒˆ์ž…๋‹ˆ๋‹ค 
//3๋ฒˆ์ž…๋‹ˆ๋‹ค 
//2๋ฒˆ์ž…๋‹ˆ๋‹ค

ajax

function getData() { 
  var tableData; 
  $.get('url', function (response) { 
  	tableData = response; 
  }) // $.get()๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  return ํ•ด๋ฒ„๋ฆผ 
  return tableData; 
} 
console.log(tableData) // ๋”ฐ๋ผ์„œ undefined

์ด๋•Œ, ๋น„๋™๊ธฐ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋น„๋™๊ธฐ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ 

๋ฐ”๋กœ ๋ฐ์ดํ„ฐํ†ต์‹ ์ด ๋˜๊ธฐ๋„ ์ „์— ๊ฐ’์„ returnํ•ด๋ฒ„๋ฆฌ๊ฒŒ ๋˜๊ฑฐ๋‚˜ ์ด ๊ฐ’์„ ์ด์šฉํ•˜๋Š” ์–ด๋– ํ•œ ๋™์ž‘์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์งˆ ๊ฒฝ์šฐ undefined๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

 

How can I do?

์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์ž!

์ฝœ๋ฐฑํ•จ์ˆ˜

์ฝœ๋ฐฑํ•จ์ˆ˜๋ž€?

  1. ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ์„œ ์ด์šฉ๋˜๋Š” ํ•จ์ˆ˜
  2. ์–ด๋–ค ์ด๋ฒคํŠธ์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜

callback์€ ์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด ์–ด๋–ค ์ผ์„ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์‹œํ‚ค๊ณ , ๊ทธ ์ผ์ด ๋๋‚˜๋Š” ๊ฒƒ์€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋๋‚˜๊ณ  ๋ถ€๋ฅผ ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

function plus(x, y, callback) { 
  sum = x + y; 
  callback(sum) 
} 
function print(result) { 
	console.log(result); 
} 
plus( 1, 2, print);

๋™์ž‘์ˆœ์„œ

  1. plusํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  2. plusํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ 1๊ณผ 2์˜ ์—ฐ์‚ฐ๊ฐ’์ด sum์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
  3. ๋งค๊ฐœ๋ณ€์ˆ˜์ธ callback์— ๋“ค์–ด๊ฐ„ ์ฝœ๋ฐฑํ•จ์ˆ˜์ธ print๊ฐ€ callback์— ๋“ค์–ด๊ฐ„๋‹ค.
  4. printํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  5. printํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์‚ฌ์šฉ๋œ sum์ด console.log์— ๋“ค์–ด๊ฐ
  6. ์ฝ˜์†”์— 3์ด ๋‚˜์˜ด.
function increase(number, callback){ 
  setTimeout(()=>{ 
    const result=number+10; 
    if(callback){ 
    	callback(result); 
    } 
  },1000) 
} 
increase(0, result=>{ 
	console.log(result); 
});

 

์ฝœ๋ฐฑํ•จ์ˆ˜ ์ค‘์ฒฉ

1์ดˆ ๋’ค result์— 10์„ ๋”ํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณผ๋•Œ 1์ดˆ์— ๊ฑธ์ณ์„œ 10, 20, 30, 40 ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณต์„ ํ•˜๊ณ  ์‹ถ์„๋•Œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ค‘์ฒฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

function increase(number,callback){
	setTimeout(()=>{
		constresult=number+10;
		if(callback){
			callback(result);
		}
	},1000);
}
console.log('์ž‘์—…์‹œ์ž‘');

increase(0,result=>{
	console.log(result);
	increase(result, result=>{
		console.log(result);
		increase(result,result=>{
			console.log(result);
			increase(result,result=>{
				console.log(result);
				console.log('์ž‘์—…์™„๋ฃŒ');
			});
		});
	});
});

๋„ค! ์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ ์ฝœ๋ฐฑ์ง€์˜ฅ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

 

์ฝœ๋ฐฑ์ง€์˜ฅ

์ฝœ๋ฐฑ, ์ฝœ๋ฐฑ, ์ฝœ๋ฐฑ์˜ ๋ฐ˜๋ณต์œผ๋กœ depth๊ฐ€ ๊นŠ์–ด์ง€๋Š” ์ฝ”๋“œ๋ฅผ ์ฝœ๋ฐฑ์ง€์˜ฅ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค

์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋Š” ๊ฐ€๋…์„ฑ์„ ๋งค์šฐ ๋–จ์–ด๋œจ๋ฆฌ๋ฏ€๋กœ ์ง€์–‘ํ•ด์•ผํ•œ๋‹ค.

// ์ฝœ๋ฐฑ์ง€์˜ฅ, ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง
$.get('url', function (response) {
 parseValue(response, fuction(id) {
  auth(id, function (result) {
   display(result, function (text) {
    console.log(text)
   })
  })
 })
})

 

Promise

์ฝœ๋ฐฑ์ง€์˜ฅ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์•ˆ์œผ๋กœ ES6์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์ด๋‹ค (IE์•ˆ๋…•..)

promise ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„(์„ฑ๊ณต ํ˜น์€ ์‹คํŒจ) ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด ์ดํ›„ ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์žˆ๋‹ค.

Promise๋Š” ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์œผ๋ฉฐ ์ธ์ž๋กœ ๋“ค์–ด์˜จ ํ•จ์ˆ˜๋Š” ๋‹ค์‹œ resolve(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์„ฑ๊ณต)์™€ reject(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹คํŒจ) 2๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

resolve ์‹œ then ๋ฉ”์†Œ๋“œ, reject ์‹œ catch ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

function increase(number){
const promise=newPromise((resolve,reject)=>{
		// resolve๋Š”์„ฑ๊ณต, reject๋Š”์‹คํŒจ
		setTimeout(()=>{
				const result=number+10;
				if(result>50){
				// 50๋ณด๋‹ค๋†’์œผ๋ฉด์—๋Ÿฌ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ
				const e=newError('NumberTooBig');
				return reject(e);
			}
			resolve(result);// number๊ฐ’์— +10ํ›„์„ฑ๊ณต์ฒ˜๋ฆฌ
		},1000);
	});
	return promise;
}

increase(0).then(number=>{
	// Promise์—์„œ resolve๋œ๊ฐ’์€ .then์„ํ†ตํ•ด๋ฐ›์•„์˜ฌ์ˆ˜์žˆ์Œ
	console.log(number);
	return increase(number);
	// Promise๋ฅผ๋ฆฌํ„ดํ•˜๋ฉด
})
.then(number=>{
	//๋˜ .then์œผ๋กœ์ฒ˜๋ฆฌ๊ฐ€๋Šฅ
	console.log(number);
	return increase(number);
})
.then(number=>{
	console.log(number);
	return increase(number);
})
.then(number=>{
	console.log(number);
	return increase(number);
})
.then(number=>{
	console.log(number);
	return increase(number);
})
.catch(e=>{//๋„์ค‘์—์—๋Ÿฌ๊ฐ€๋ฐœ์ƒํ•œ๋‹ค๋ฉด .catch๋ฅผํ†ตํ•ด์•Œ์ˆ˜์žˆ์Œ
	console.log(e);
});
728x90
๋ฐ˜์‘ํ˜•