(์ˆ˜๊ทผ์ˆ˜๊ทผ)

[JS] ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋ณธ๋ฌธ

type & Javascript

[JS] ์ฝœ๋ฐฑํ•จ์ˆ˜

InformationFarm 2021. 9. 15. 10:08

๐Ÿ˜ฒ callbackํ•จ์ˆ˜๋ž€

javascript์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ž€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋‚˜์ค‘์— ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค.

๋ฌธ๋ฒ•์  ํŠน์ง•์ด ๋”ฐ๋กœ ์กด์žฌํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜์ผ ๋ฟ์ด๋‹ค.

MDN ์ •์˜์— ๋”ฐ๋ฅด๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ผ์ข…์˜ ๋ฃจํ‹ด ๋˜๋Š” ๋™์ž‘์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋œ๋‹ค.

๐Ÿคฆ๐Ÿป CallBack ํ•จ์ˆ˜์˜ ์˜ˆ์‹œ

์ฝœ๋ฐฑํ•จ์ˆ˜๋ผ ํ•ด์„œ ์–ด๋งˆ๋ฌด์‹œํ•œ ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•  ํ•„์š”์—†๋‹ค,

์˜ˆ๋ฅผ ๋“ค์–ด ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ์šฉ์€ addEventListener์ด๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์„ ๋•Œ ์ฝ˜์†” ์ฐฝ์— ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์Œ ์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์ž‘๋™๋˜๊ฒŒ ํ•ด๋ณด์ž

<!DOCTYPE html>
<head>...์ƒ๋žต<head>
<body>
    <div>
      <button id='log_button'>๋กœ๊ทธ์ถœ๋ ฅ</button> 
  </div>
</body>
<script>
    const button = document.getElementId('log_button');

    //์ต๋ช…ํ•จ์ˆ˜๋กœ์จ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ „๋‹ฌ
    button.addEventListener('click', ()=>{
        console.log('callback test')
    })
</script>

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์“ฐ๋˜ addEventListener ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๋Œ€ํ‘œ์ ์ธ setTimeout()ํ•จ์ˆ˜๋„ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.

setTimeout(()=>{
    console.log('callback test');
},100);

๋‹ค์Œ์€ 100ms์ดํ›„์— ์ฝ˜์†” 'callback test' ๋ผ๋Š” ๋ฌธ์ž์—ด์„ ์ฐ์„ ๊ฒƒ์ด๋‹ค.

๐Ÿ†šCallback ํ•จ์ˆ˜ vs ๋น„๋™๊ธฐ ํ•จ์ˆ˜

์ฝœ๋ฐฑ๊ณผ ๋น„๋™๊ธฐํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ง์ผ๊นŒ? ๋ญ”๊ฐ€ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” ๋‹ค๋ฅด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ๋ผ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์–ธ์ œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ธ๊ฐ€?

๋น„๋™๊ธฐํ•จ์ˆ˜ ํ…Œํฌ๋‹‰์˜ ์‚ฌ์šฉ ์˜ˆ

  1. ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
  2. ๋„คํŠธ์›Œํฌ ์‘๋‹ต์ฒ˜๋ฆฌ
  3. ํŒŒ์ผ ์ฝ๊ณ  ์“ฐ๋Š”๋“ฑ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์ž‘์—…
  4. ์˜๋„์ ์œผ๋กœ ์‹œ๊ฐ„์„ ์ง€์—ฐํ•˜๋Š” ๊ธฐ๋Šฅ (์•Œ๋žŒ)

๐Ÿ“์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์ด์œ 

์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊นจ๋‹ฌ์•„ ๋ด…์‹œ๋‹ค.

function getData() {
    let data;
    $.get('url/param', function (response) {
        data= response;
    });
    return data;
}

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

๋งจ ์•„๋ž˜์˜ ์ฝ˜์†”์—์„œ ์šฐ๋ฆฌ๋Š” ajax๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ ์‹คํ–‰ ๊ฐ’์€ undefined์ž…๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿฌ๋Š” ๊ฑธ๊นŒ์š”.....?๐Ÿ˜’๐Ÿ˜’๐Ÿ˜’๐Ÿ˜’๐Ÿ˜’

โ€ผ๏ธ์ด์œ ๋Š” ์œ„์—์„œ ๋น„๋™๊ธฐํ…Œํฌ์˜ ๋ฐฉ๋ฒ• ์ค‘ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•จ์ˆ˜์ธ get์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. get์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ์‹œ๊ฐ„๋™์•ˆ console.log() ํ•จ์ˆ˜๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๊ณ  ๋‹น์—ฐํžˆ ๋ฐ์ดํ„ฐ๋Š” ์•„์ง ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•ด๋ด…์‹œ๋‹ค!

function getData(callback) {
    $.get('url/param', function (response) {
        callback(response); // ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ callbackํ•จ์ˆ˜์— ๋„˜๊ฒจ์คŒ
    });
}

getData(function (data) {
    console.log(data); 
});

์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋”๋‹ˆ get๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ†ตํ•ด response ๋ฐ›์•„์˜จ ์ดํ›„์— callbackํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์ฝ˜์†”์— ์ œ๋Œ€๋กœ ๋œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ก ์ฝœ๋ฐฑ์ง€์˜ฅ

์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์œ„์ฒ˜๋Ÿผ ๋น„๋™๊ธฐ์ ์ธ ๊ธฐ๋Šฅ์„ ํ•˜๊ธฐ์— ๊ฐ„ํŽธํ•˜๊ณ  ํ‘œ์ค€์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋น„์Šค๊ฐ€ ๋ณต์žกํ•ด ์งˆ์ˆ˜๋ก ๋น„๋™๊ธฐํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ•˜๋Š” ์ค‘์ฒฉ์— ๋น ์ง€๊ฒŒ ๋˜๊ณ  ์ด๋ฅผ ์ฝœ๋ฐฑ์ง€์˜ฅ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

callback1(function(value1) {
  callback2(value1, function(value2) {
    callback3(value2, function(value3) {
      callback4(value3, function(value4) {
        callback5(value4, function(value5) {
            // value5๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฒ˜๋ฆฌ
        });
      });
    });
  });
});

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

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Promise/ async, await ๋ผ๋Š” ํ•ด๊ฒฐ๋ฐฉ์•ˆ์„ ECMAScript์—์„œ ํ‘œ์ค€ํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

'type & Javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[NodeJS] Nodejs ๊ธฐ์ดˆ  (0) 2021.10.01
[JS] JSON๋ฐ์ดํ„ฐ CSVํŒŒ์ผ๋กœ ์ €์žฅ  (0) 2021.09.26
[JS] expression & operator  (0) 2021.09.11
๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜  (0) 2021.09.11
์‹๋ณ„์ž์™€ Value  (0) 2021.09.01
Comments