whatisthis?

javaScript. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ Callback ํ•จ์ˆ˜ ๋ณธ๋ฌธ

WEB STUDY/JAVASCRIPT

javaScript. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ Callback ํ•จ์ˆ˜

thisisyjin 2022. 1. 30. 10:33

 

 

javaScript. (20) Event Listener / Callback

๐Ÿ“Œ Event Listener - ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๋Œ€๊ธฐ์ค‘์ธ ๊ฒƒ. (์ƒ์‹œ Listening ์ค‘) - ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ ๋“ฑ๋กํ–ˆ๋˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์‹คํ–‰๋จ. window.onload = function () { alert('I\'m loaded'); }; - ๋Œ€ํ‘œ์ ์ธ ์ด๋ฒค..

mywebproject.tistory.com

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ Callback์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„

์ถ”๊ฐ€๋กœ Callback์— ๋Œ€ํ•ด ํฌ์ŠคํŒ…ํ•ด๋ณด๊ฒ ๋‹ค.


 

 

์ฝœ๋ฐฑ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ธฐ์— ์•ž์„œ, 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๋จผ์ € ์•Œ์•„๋ณด์ž.

 

๋น„๋™๊ธฐ๋Š” ๋™๊ธฐ์‹์— ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…์œผ๋กœ, ๋‘˜์„ ๋น„๊ตํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

Syncronous (๋™๊ธฐ์‹) ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ํ•ด๋‹น ์š”์ฒญ์˜ ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ๋‹ค์Œ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹
Asynchronous (๋น„๋™๊ธฐ) ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์‘๋‹ต๊ณผ ๊ด€๊ณ„์—†์ด ๋‹ค์Œ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹

 

 

1 / ๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ

const btn = document.querySelector('button');
btn.addEventListener('click', () => {
  alert('You clicked me!');

  let pElem = document.createElement('p');
  pElem.textContent = 'This is a newly-added paragraph.';
  document.body.appendChild(pElem);
});

์œ„ ์˜ˆ์ œ์—์„œ ์ฝ”๋“œ๋Š” ์œ„ > ์•„๋ž˜ ์ˆœ์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

 

1. <button> element๋ฅผ ์ฐธ์กฐํ•จ (DOM์— ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด์žˆ์Œ)

2. click ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ํ•จ์ˆ˜ ์‹คํ–‰.

>> arrow function. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์—†๊ณ ,

alert๊ธฐ๋Šฅ ํ›„์— <p>ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค์–ด html๋ฌธ์„œ์— ํŽ˜์ธํŠธํ•œ๋‹ค. 

 

ใ…ก ์—ฌ๊ธฐ์„œ alert ๊ธฐ๋Šฅ์€ alert์ฐฝ์ด ๋‹ซํžˆ๊ธฐ ์ „๊นŒ์ง€ ์›น์‚ฌ์ดํŠธ๋Š” '์ผ์‹œ์ •์ง€' ๋œ๋‹ค.

์ฆ‰, alert ์‹œ์  ์ดํ›„๋ถ€ํ„ฐ์˜ ๋ Œ๋”๋ง์ด ์ผ์‹œ์ค‘์ง€๋˜๋Š” ๊ฒƒ์ด๋‹ค.

(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” single thread์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์— ์ง„ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ , ํ•˜๋‚˜์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.)

 

>> alert๋Š” ์‹ค์ œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„  ๊ฑฐ์˜ ๊ธˆ๊ธฐ์‹œ๋œ๋‹ค. (์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ)

 

 

์œ„์™€ ๊ฐ™์€ ์ด์œ  ๋•Œ๋ฌธ์— (๋ธ”๋กœํ‚น),

๋งŽ์€ ์›น API ๊ธฐ๋Šฅ์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

ํŠนํžˆ, ์™ธ๋ถ€ ๋””๋ฐ”์ด์Šค์—์„œ ์–ด๋–ค ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

 

2 / ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ

- ํฌ๊ฒŒ ๋‘๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ๋‹ค.

 

1. j-Query์˜ ajax

 

** AJAX ๋ž€?

 

 

Ajax(Asynchronous JavaScript and XML, ์—์ด์žญ์Šค)๋Š” 

๋น„๋™๊ธฐ์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ œ์ž‘์„ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ์กฐํ•ฉ์„ ์ด์šฉํ•˜๋Š” ์›น ๊ฐœ๋ฐœ ๊ธฐ๋ฒ•

 

  • ํ‘œํ˜„ ์ •๋ณด๋ฅผ ์œ„ํ•œ HTML (๋˜๋Š” XHTML) ๊ณผ CSS
  • ๋™์ ์ธ ํ™”๋ฉด ์ถœ๋ ฅ ๋ฐ ํ‘œ์‹œ ์ •๋ณด์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ DOM, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • ์›น ์„œ๋ฒ„์™€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๊ณ  ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ XML, XSLT, XMLHttpRequest

+) Ajax ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ XML/XSLT ๋Œ€์‹  ๋ฏธ๋ฆฌ ์ •์˜๋œ HTML์ด๋‚˜ ์ผ๋ฐ˜ ํ…์ŠคํŠธ, JSON, JSON-RPC๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Œ.

 

function getData() {
	var tableData;
	$.get('https://domain.com/products/1', function(response) {
		tableData = response;
	});
	return tableData;
}

console.log(getData()); // undefined

์—ฌ๊ธฐ์„œ $.get()์ด ajax ํ†ต์‹ ์„ ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

 

https://domain.com์— 

HTTP GET ์š”์ฒญ์„ ๋‚ ๋ ค 1๋ฒˆ product์˜ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋Š” ์ฝ”๋“œ. (get ์š”์ฒญ์€ ๋’ค์— ์ €๋ ‡๊ฒŒ /1๊ณผ ๊ฐ™์ด ๋ถ™์Œ)

 

๊ทธ๋ฆฌ๊ณ , ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋Š” response์ธ์ž์— ๋‹ด๊ธด๋‹ค.

tableData๋ผ๋Š” ๋ณ€์ˆ˜์— ๊ทธ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

 

>> ๊ทธ๋Ÿผ ์ด์ œ ์ด getData()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ??  ใ…ก undefined๊ฐ€ ๋‚˜์˜ด.

์™œ? 

$.get() ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๊ธฐ๋‹ค์ง€ ์•Š๊ณ  ๋ฐ”๋กœ return tableDate๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ.

(์ฆ‰, ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ)

 

์œ„์™€ ๊ฐ™์ด ํŠน์ • ๋กœ์ง์ด ์‹คํ–‰์ด ๋๋‚ ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ 
์ดํ›„์˜ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์ด๋‹ค.

 

 

2. setTimeout() 

- WEB API์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค.

๐Ÿ’ก API(Application Programming Interface)
- ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ถœ์ž…๊ตฌ ์—ญํ• .
- ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ธฐ๊ธฐ๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ.
- ๋ชจ๋“  ์ ‘์†์„ ํ‘œ์ค€ํ™” (๊ธฐ๊ณ„๋‚˜ OS์™€ ๋ฌด๊ด€)

>> private / public / partner API๊ฐ€ ์กด์žฌํ•จ.
private API๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ, ์ฝ”๋“œ์˜ ์ž‘์„ฑ๋ฐฉ๋ฒ•์„ ํ‘œ์ค€ํ™”ํ•ด์„œ ๋น ๋ฅธ ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ. + S/W ํ†ตํ•ฉ, ํ˜‘์—… ์šฉ์ด

- ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ง€์ •ํ•œ ์‹œ๊ฐ„๋งŒํผ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋กœ์ง์„ ์‹คํ–‰ํ•จ.

console.log('Hello');

setTimeout(function() {
   console.log('Bye');
}, 3000);

console.log('Hello Again');


// result : 'Hello' > 'Hello Again' >(3์ดˆํ›„) 'Bye' ์ˆœ์œผ๋กœ

- setTimeout()์„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์„œ 'Hello Again'์ด ์‹คํ–‰๋œ ๊ฒƒ์ž„.

 

 

 


๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๋ฌธ์ œ์  ํ•ด๊ฒฐ

- ์ฝœ๋ฐฑ(callback)์„ ์ด์šฉํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ.

 

๊ธฐ์กด ์ฝ”๋“œ > [๋”๋ณด๊ธฐ]ํด๋ฆญ

๋”๋ณด๊ธฐ
function getData() {
	var tableData;
	$.get('https://domain.com/products/1', function(response) {
		tableData = response;
	});
	return tableData;
}

console.log(getData()); // undefined
function getData(callbackFunc) {
	$.get('https://domain.com/products/1', function(response) {
		callbackFunc(response); // ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ response๋ฅผ callbackFunc() ํ•จ์ˆ˜์— ๋„˜๊ฒจ์คŒ
	});
}

getData(function(tableData) {
	console.log(tableData); // $.get()์˜ response ๊ฐ’์ด tableData์— ์ „๋‹ฌ๋จ
});

- ์œ„์™€ ๊ฐ™์ด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๋กœ์ง์ด ๋๋‚ฌ์„ ๋•Œ ์›ํ•˜๋Š” ๋™์ž‘ ์‹คํ–‰ ๊ฐ€๋Šฅ.

- callbackFunc(response)๋ฅผ ํ•ด์„œ, ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ์ธ response๋ฅผ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ๋„˜๊ฒจ์ค€๋‹ค.

>> ์—ฌ๊ธฐ์„œ, callbackFunc๋Š” getData ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜์ž„.

 

์ฆ‰, ์•„๋ž˜ ์‹คํ–‰๋ถ€์—์„œ๋Š” function(tableData) { console.log(tableData) } ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์ด

์ฝœ๋ฐฑํ•จ์ˆ˜, ์ฆ‰ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ€๋Š” ํ•จ์ˆ˜์ž„.

 

 

- ์šฐ์„  ๋Œ€๊ธฐ๋ช…๋‹จ ์ž‘์„ฑํ•˜๊ณ  ๋Œ€๊ธฐํ•จ ใ…ก ๋‹ค์‹œ ์ „ํ™”๋ฐ›๋Š” ์ˆœ๊ฐ„ = ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„์ž„.

 

 

 

 

 


 

 

 

์ •๋ฆฌ

 

 

  • ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜(parameter)๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์•„, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • ์˜ˆ> forEach์˜ ๊ฒฝ์šฐ์— ํ•จ์ˆ˜์•ˆ์— ์ต๋ช…์˜ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด ๋™์ž‘์‹œํ‚จ๋‹ค.
let number = [1, 2, 3, 4];

number.forEach(x => {         // forEach ํ•จ์ˆ˜(๋ฉ”์„œ๋“œ)์•ˆ์—
    console.log(x * 2);       //  ์ต๋ช… ํ•จ์ˆ˜๊ฐ€ ์กด์žฌ ใ…ก forEach ์•ˆ์—์„œ ์‹คํ–‰
});

 

  • ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์ด๋ฆ„์ด ์—†๋Š” ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ. (ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ด๋ฆ„ ํ•„์š” X)
  • ํ™”์‚ดํ‘œํ•จ์ˆ˜ (=>)๋ฅผ ์“ฐ๊ฑฐ๋‚˜, function() { ๋‚ด์šฉ } ๊ณผ๊ฐ™์ด ์‚ฌ์šฉ
  • ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ์‹œ, ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋„˜๊ฒจ์คŒ(reference)
    function whatYourName(name, callback) {      // callback(ํ•จ์ˆ˜)๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ
        console.log(name);
        callback();             // ์ฝœ๋ฐฑ ์‹คํ–‰
    }
    
    
    function goodBye() { 
        console.log('goodbye!');
    }
    
    WhatYourName('yjin', goodBye);          //  name์— 'yjin'์ „๋‹ฌ, callback์— goodByeํ•จ์ˆ˜ ์ „๋‹ฌ
    
    
    ๊ฒฐ๊ณผ : 
    yjin 
    goodbye!โ€‹
    - ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋„˜๊ฒจ์ค˜์„œ ๊ทธ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ์˜ˆ์ œ.  ์ฆ‰, callback์ด๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ()๋กœ ํ˜ธ์ถœ์„ ํ•˜๋Š”๋ฐ, ๊ทธ callback์— ๋ณ€์ˆ˜์ฒ˜๋Ÿผ goodBye ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„ฃ์€ ๊ฒƒ์ž„.

 

 

this์˜ ๊ฒฝ์šฐ์—๋Š” ์ฝœ๋ฐฑ์—์„œ ์‚ฌ๋ผ์ง„๋‹ค.

๋”ฐ๋ผ์„œ, call()๊ณผ apply()๋กœ this๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์ฝœ๋ฐฑ์„ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

 

 

 

javaScript. ์ฝœ๋ฐฑํ•จ์ˆ˜(Callback)

 Callback ๐Ÿ“Œ ํ•จ์ˆ˜(Function) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰๊ฐ์ฒด์ด๋‹ค. ์ผ๊ธ‰ ๊ฐ์ฒด(first-class object)๋ž€, ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์— ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. โ–ช ๋ณ€์ˆ˜์— ํ• ๋‹น(as

mywebproject.tistory.com

 

 

 


REFERENCE

 

 

Introducing asynchronous JavaScript - Web ๊ฐœ๋ฐœ ํ•™์Šตํ•˜๊ธฐ | MDN

์ด ๋ฌธ์„œ์—์„  JavaScript์˜ ๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์š”์•ฝํ•˜๊ณ , ์•ž์œผ๋กœ ์ ‘ํ•˜๊ฒŒ ๋  ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ๊ธฐ์ˆ ๋“ค์„ ์‚ดํŽด๋ณด๋ฉฐ, ์–ด๋–ป๊ฒŒ ์šฐ๋ฆฌ์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

developer.mozilla.org

 

Callback function - MDN Web Docs Glossary: Definitions of Web-related terms | MDN

A callback function is a function passed into another function as an argument, which is then invoked inside the outer function to complete some kind of routine or action.

developer.mozilla.org

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

(์ค‘๊ธ‰) ์ค‘๊ธ‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ดํ•ดํ•˜๊ธฐ. ์ฝœ๋ฐฑ ์ง€์˜ฅ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๋“ฑ

joshua1988.github.io