์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ๋ฅผ ์ฒ๋ฆฌํ ๋ callback๊ณผ promise๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
๋จผ์ callback ํจ์์ ๋ํด์ ์์๋ณด์
๋น๋๊ธฐ ์ฒ๋ฆฌ?
์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ํน์ ์ฝ๋์ ์ฐ์ฐ์ด ๋๋ ๋๊น์ง ์ฝ๋์ ์คํ์ ๋ฉ์ถ์ง ์๊ณ
๋ค์ ์ฝ๋๋ฅผ ๋จผ์ ์คํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ์ ์๋ฏธํฉ๋๋ค.
ํ๋ก์ ํธ ์ํ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
์ด๋ฅผ ์ํด HTTP ํต์ ์ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ ์ด๋ ๋น๋๊ธฐ์ฒ๋ฆฌ์ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๊ฒ ๋๋ค.
์๋์ ajax ํต์ ์ฌ๋ก๋ฅผ ํตํด ์์๋ณด์
function getData() {
var tableData;
$.get('https://domain.com/products/1', function(response) {
tableData = response;
});
return tableData;
}
console.log(getData()); // undefined
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ด 'https://domain.com/products/1' ์ HTTP GET์์ฒญ์ ๋ ๋ ค
1๋ฒ์งธ ์ํ(products)์ ๋ณด๋ฅผ ์์ฒญํ๋ ์ฝ๋๊ฐ์๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ์๋ฒ์์ ๋ฐ์์จ ๋ฐ์ดํฐ๋ tableData๋ผ๋ ๋ณ์์ ์ ์ฅํ๋ค.
์ดํ getData()๋ฅผ ํธ์ถํ์ฌ console.log()๋ฅผ ํตํด ์ฐ์ด๋ณด๋ฉด ๋ฐ์ดํฐ๋ ์๊ณ undefined๊ฐ ์ฐํ๋๊ฒ์
ํ์ธํ ์ ์๋ค.
๊ทธ ์ด์ ๋ $.get()๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ๋ฐ์์ฌ ๋๊น์ง ๊ธฐ๋ค๋ ค์ฃผ์ง ์๊ณ ๋ค์ ์ฝ๋์ธ
return tableData;๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์, getData()์ ๊ฒฐ๊ณผ ๊ฐ์ ์ด๊ธฐ ๊ฐ์ ์ค์ ํ์ง ์์ tableData์ ๊ฐ undefined๋ฅผ ์ถ๋ ฅํ๋ค.
์ด๋ ๊ฒ ํน์ ๋ก์ง์ ์คํ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ฃผ์ง ์๊ณ ๋๋จธ์ง ์ฝ๋๋ฅผ ๋จผ์ ์คํํ๋ ๊ฒ์ด
๋น๋๊ธฐ ์ฒ๋ฆฌ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ด์ ๋, ํ๋ฉด์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ ๋
์๋ฒ๋ก๋ถํฐ ์๋ต์ด ๋์์ฌ ์๊ฐ์ ์์ธํ ์ ์ ์๊ธฐ๋๋ฌธ์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์คํ ํ์ง ์๊ณ ๊ธฐ๋ค๋ฆด ์ ์๊ธฐ๋๋ฌธ์ด๋ค.
์์์ ๊ฐ๋จํ ์์ฒญ 1๊ฐ๋ง ๋ณด๋์ง๋ง ์์ฒญ์ด ๋ฌด์ํ ๋์ด๋๋ค๊ณ ๊ฐ์ ํ๋ฉด.
๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์๋๊ณ ๋๊ธฐ ์ฒ๋ฆฌ๋ผ๋ฉด ์ฝ๋ ์คํํ๊ณ ์๋ต์ด ์ฌ๋๊ฐ์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ฅผ ๋ฐ๋ณตํ ๊ฒ์ด๋ค.
callback์ ์ฌ์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ #1
์๋๋ web API์ธ setTimeout() ํจ์๋ฅผ ํตํด ์์์๋ callback ํจ์๋ฅผ
1์ด๋ค์ ์คํํ๊ฒ ํจ( ์๋ฒ๋ก ๋ถํฐ ํต์ ์ด 1์ด๋ค์ ์จ ๊ฒ์ ๊ฐ์ )์ผ๋ก์จ
์์์ $.getํจ์์ ๊ฐ์ด HTTP ํต์ ํ ํจ๊ณผ๋ฅผ ๋ด์๋ค.
function check(callback) {
setTimeout(() => {
callback("i'm here!!");
}, 1000);
}
check(function (msg) {
console.log(msg);
});
check ํจ์๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก callback์ ๋ฐ๊ณ , callback์ด ์คํ ๋ ๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ console์ ์ถ๋ ฅํ๋ค.
callback์ด ์คํ๋๋ ์์ ์ checkํจ์ ์์ ์๋ setTimeout์ผ๋ก ์ธํด์ 1์ด ํ์ ์คํ์ด ๋๋ค.
callback์ด ์คํ์ด ๋๋ฉด์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก "i'm here!!"์ด ๋ค์ด๊ฐ๊ณ , ์ฝ์์ "i'm here!!"์ด ๋ํ๋๋ค.
์ด๋ ๊ฒ callback์ ํตํด์ ์ด๋ ํ ๋น๋๊ธฐ ๋ก์ง์ด ๋๋ฌ์ ๋ callback ํจ์๋ฅผ ์คํ์ํด์ผ๋ก์จ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ ๋์์ ๋ callback์์ ์์ฑํ ์ด๋ ํ ํ๋์ ์คํํ ์ ์๊ฒ ๋๋ค.
callback์ ์ฌ์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ #2
์๋๋ html ํ์ผ์ head ๋ถ๋ถ์
1. script ํ๊ทธ๋ฅผ ๋ง๋ค๊ณ ( let script = document.createElement('script'); )
2. script ํ๊ทธ์ src ์์ฑ์ผ๋ก path๋ฅผ ์ถ๊ฐ ํ์ฌ
3. head์ ์ถ๊ฐํ๋ ์ฝ๋์ด๋ค.
function loadScript(path) {
1. let script = document.createElement('script');
2. script.src = path;
3. document.head.append(script);
}
4. loadScript('/my/script.js');
newFunction(); // ํจ์๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค!
4. ์์์ ์์ฑํ loadScript ํจ์๋ฅผ ์คํํ๋ค. ( ๋ถ๋ฌ์จ '/my/script.js' ์ "function newFunction() {…}"ํจ์๊ฐ ์๋ค๋ ๊ฐ์ . )
5. loadScript ํจ์๋ฅผ ํตํด ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ๋ฌ์์ newFunctionํจ์๋ฅผ ์คํํ์ง๋ง ํจ์๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ ์๋ฌ ๋ฐ์
์๋ฌ๋ ์์#1์์ ๋ณด์๋ ๊ฒ ์ฒ๋ผ ๋ธ๋ผ์ฐ์ ๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ด์ฌ ์ ์๋ ์๊ฐ์ ์์ง๋ชปํ๋ฉฐ, ์๊ฐ์ ์ถฉ๋ถํ ํ๋ณดํ์ง
๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ฝ๋ฐฑํจ์๋ก ํด๊ฒฐํ๋ค.
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(script);
document.head.append(script);
}
loadScript('/my/script.js', function() {
// ์ฝ๋ฐฑ ํจ์๋ ์คํฌ๋ฆฝํธ ๋ก๋๊ฐ ๋๋๋ฉด ์คํ๋ฉ๋๋ค.
newFunction(); // ์ด์ ํจ์ ํธ์ถ์ด ์ ๋๋ก ๋์ํฉ๋๋ค.
...
});
์ด๋ ๊ฒ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ ํจ์(๋๊ฐ ์ต๋ช ํจ์, ์์์์๋ callback์ด๋ผ๋ ์ด๋ฆ์ ํจ์)๋
์ํ๋ ๋์(์ ์์ ์์ ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ )์ด ์๋ฃ๋์์ ๋ ์คํ๋ฉ๋๋ค.
์ด๋ฐ ๋ฐฉ์์ ‘์ฝ๋ฐฑ ๊ธฐ๋ฐ(callback-based)’ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํฉ๋๋ค.
๋ฌด์ธ๊ฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ํํ๋ ํจ์๋ ํจ์ ๋ด ๋์์ด ๋ชจ๋ ์ฒ๋ฆฌ๋ ํ ์คํ๋์ด์ผ ํ๋ ํจ์๊ฐ ๋ค์ด๊ฐ ์ฝ๋ฐฑ์
์ธ์๋ก ๋ฐ๋์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ ์์์์
loadScript์ ์ธ์๋ก callback์ด๋ผ๋ ํจ์๋ฅผ ์ ๊ณตํด ์ฃผ์๋๋ฐ, ์ด๋ ๊ฒ ์ฝ๋ฐฑ์ ์ฌ์ฉํ ๋ฐฉ์์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ฐ์ ์ธ ์ ๊ทผ๋ฒ์ ๋๋ค.
๐์ถ์ฒ
https://ko.javascript.info/callbacks
https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation
'๐Technical interview(Front)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Promise (0) | 2022.11.16 |
---|---|
[JavaScript] ์ค์ฝํ ์ฒด์ธ์ด๋? (0) | 2022.11.09 |
[JavaScript] Scope๋? (0) | 2022.11.05 |
Closure ํด๋ก์ (0) | 2022.10.23 |
๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ Url์ ์ ๋ ฅํ๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋๋๊ฐ? (0) | 2022.10.23 |