๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š/ใ„ด JavaScript

[JavaScript / ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ] AJAX / Callback, Promise, async, await

๐Ÿ“Œ ๋™๊ธฐ(Synchronous) ํ”„๋กœ๊ทธ๋ž˜๋ฐ vs ๋น„๋™๊ธฐ(Asynchronous) ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 

 ๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ž‘์„ฑ๋œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ฝ”๋“œ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 


๐Ÿ”— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‚ฌ๋ก€ > AJAX

 

 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ํ†ต์‹ ์ด๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์˜ XML ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

 XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ฆฌ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 


๐Ÿ”— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• โ‘  > ์ฝœ๋ฐฑ(Callback) ํ•จ์ˆ˜

 

 

 ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ด์ด ์•„๋‹Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜์–ด์˜จ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

 

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

 

 ํŠน์ • ๋กœ์ง์ด ๋๋‚ฌ์„ ๋•Œ ์›ํ•˜๋Š” ๋™์ž‘์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ์ฆ‰, ๋น„๋™๊ธฐ ์ž‘์—…๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ”— ์ฝœ๋ฐฑ์ง€์˜ฅ๐ŸงŸ‍โ™€๏ธ, ๋ฌธ์ œ์  ๋ฐ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•๐Ÿงš‍โ™€๏ธ

 

 ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ฝœ๋ฐฑ์ง€์˜ฅ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ์ฝ”๋“œ ๊ตฌ์กฐ๋Š” ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋Œ€์‹ , ํ”„๋กœ๋ฏธ์Šค๋‚˜ async ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 


๐Ÿ”— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• โ‘ก) ํ”„๋กœ๋ฏธ์Šค(Promise)

 

 ES6 ๋ฌธ๋ฒ•์œผ๋กœ, ์ฃผ๋กœ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

์ถœ์ฒ˜ - MDN

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const condition = true// true๋ฉด resolve, false๋ฉด reject
const promise = new Promise(function(){
    // ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰
    if(condition){ // ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰ ์„ฑ๊ณต
        resolve('์„ฑ๊ณต');
    }else// ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰ ์‹คํŒจ
        reject('์‹คํŒจ');
    }
});
 
promise
    .then(function(message){
        console.log(message); // ์„ฑ๊ณต(resolve)ํ•œ ๊ฒฝ์šฐ ์‹คํ–‰
    })
    .catch(function(error){
        console.log(message) // ์‹คํŒจ(reject)ํ•œ ๊ฒฝ์šฐ ์‹คํ–‰
    });
 
cs

 

 new Promise๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์•ˆ์— resolve(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์„ฑ๊ณต)์™€ reject(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹คํŒจ)๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ–๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“  promise ๋ณ€์ˆ˜์— then๊ณผ catch ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ™์ธ๋‹ค. ํ”„๋กœ๋ฏธ์Šค ๋‚ด๋ถ€์—์„œ resolve๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด then์ด ์‹คํ–‰๋˜๊ณ , reject๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด catch๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 


๐Ÿ”— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• โ‘ข) async, await

 

 ES8 ๋ฌธ๋ฒ•์œผ๋กœ, ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ๊น”๋”ํ•˜๊ณ  ๋™๊ธฐ์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๊ฒŒ ์ค„์—ฌ์ค€๋‹ค.

 

1
2
3
async function ํ•จ์ˆ˜๋ช…(){
    await ๋น„๋™๊ธฐ_์ฒ˜๋ฆฌ_๋ฉ”์„œ๋“œ๋ช…();
}
cs

 

 ํ•จ์ˆ˜์˜ ์•ž๋ถ€๋ถ„์— async ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ Promise์˜ ์•ž๋ถ€๋ถ„์— await ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด try/catch๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

 


๐Ÿ”Ž ์ฐธ๊ณ  ์ž๋ฃŒ

๐Ÿ’ก ๊ฐ™์ด ๋ณด๋ฉด ์ข‹์„ Post

 

[JavaScript] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” '์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜', '๋…ผ๋ธ”๋กœํ‚น' ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  '์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ' ์–ธ์–ด์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ด๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉ์‹œ์—๋Š” ๋งŽ์€ ์ž‘์—…์ด ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”๋ฐ ์™œ ๊ทธ๋Ÿฐ ๊ฒƒ์ผ๊นŒ? ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์–ด๋–ป๊ฒŒ '๋™์‹œ์„ฑ(Concurrency)'์„ ์ง€์›ํ•˜

devjindev.tistory.com