1️⃣ 비동기 처리란 무엇일까?
비동기 처리의 가장 흔한 사례는 jquery의 ajax이다. 이 ajax를 통신을 통해 데이터를 서버로부터 가져올 수 있기 때문이다.
👀 아래의 ajax 코드를 한편 살펴보자.
function getData(){
var dongleData;
$.get('https://domain.com/product/1', function(response){
dongleData = response;
});
return dongleData;
}
console.log(getData()); // undefined
▫ $. get()이
ajax 통신을 하는 부분
▫ https://domain.com에
HTTP GET 요청을 해서 product 1번을 요청
▫ 서버에서 받아온 데이터는 response
인자에 담김
▫ response;
코드로 받아온 데이터는 dongleData
라는 변수에 저장
▫ 이 상태에서 getData()
를 호출하게 되면 undefined
출력
❔ 왜 undefined가 출력되었을까
그 이유는 $. get()로
데이터를 요청하고 받아올 때까지 기다리지 않고 return dongleData;
를 실행했기 때문이다. 따라서 getData()
의 결과 값은 초기 값을 설정하지 않은 dongleData
의 값 undefined
를 출력하게 된다.
✅ 이렇게 특정 로직의 실행이 끝날 때까지 기다려주지 않고 나머지 코드를 먼저 실행하는 것이 비동기 처리이다.
2️⃣ 비동기 처리 해결하기 위한 콜백 함수의 사용
비동기 처리 방식에 의해서 발생될 수 있는 문제들을 해결하기 위해서 콜백(call back) 함수를 이용하게 된다.
❔ 콜백 함수(call back)는 어떻게 동작할까
콜백 함수는 말 그대로 나중에 호출되는 함수를 말한다. 그 동작 방식은 식당에 웨이팅을 하는 것과 같다.
예를 들어 어떤 식당을 방문하였는데 만석이어서 웨이팅을 하게 되었다고 가정해보자. 다행히 그 가게에는 웨이팅을 등록할 수 있는 키오스크가 있었고, 키오스크에 웨이팅 등록을 하고 근처에서 간단하게 쇼핑을 할 수 있었다.
쇼핑을 하다가 식당에서 연락(call back)이 왔고 나는 웨이팅 하는 시간을 다른 시간으로 채울 수 있어서 시간 낭비를 하지 않았다. 아래의 코드는 위의 코드에 callback 함수를 적용한 것이다.
function getData(callbackFunc) {
$.get('https://domain.com/product/1', function(response) {
callbackFunc(response); // 서버에서 받은 데이터 response를 callbackFunc() 함수에 넘겨줌
});
}
getData(function(dongleData) {
console.log(dongleData); // $.get()의 response 값이 tableData에 전달됨
});
✅ 이렇게 call back 함수를 사용하게 되면 비동기 처리 방식의 문제점을 해결할 수 있다.
3️⃣ 콜백의 무분별한 사용 ➡ 😈 콜백 지옥
웹 서비스를 개발하다보면 서버에서 데이터를 받아서 화면에 표시하기까지 다양한 과정들이 발생하게 되는데, 이 모든 과정들을 다 비동기 처리를 하게 되면 콜백에 콜백에 콜백을 하게 되고 혼란스러워지기 마련이다. 이러한 상황은 가독성, 재사용성, 유지 보수 측면에서 모두 문제가 발생하기 때문에 '콜백 지옥'이라고 부른다.
마무리 : ❔ 콜백 지옥은 어떻게 해결할 수 있을까
콜백 지옥을 해결하기 위한 방법으로는 Promise나 Async를 보통 이용한다고 한다. 다음 글에서는 Promise에 대해서 알아보도록 하겠다.
'Tech > Javascript' 카테고리의 다른 글
[Javascript] 제너레이터 함수 (Generator Function) (0) | 2021.04.06 |
---|---|
[Javascript] 화살표 함수 (Arrow Function) (0) | 2021.04.06 |
[Javascript] ES6 - Template literal (0) | 2021.03.07 |
[Javascript] DOM을 조작하는 방법 (0) | 2021.01.27 |
[Javascript] DOM - Critical Rendering Path (0) | 2021.01.18 |