ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL.93 Javascript 비동기 처리 이해하기
    TIL/Javascript 2021. 1. 9. 22:25
    728x90

    비동기 처리?

    자바스크립트의 비동기 처리란 특정 코드의 연산이 끝날 때까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하는 자바스크립트의 특성을 의미합니다


    비동기 처리의 첫 번째 사례

    비동기 처리의 가장 흔한 사례는 제이쿼리의 ajax입니다. 제이쿼리로 실제 웹 서비스를 개발할 때 ajax 통신을 빼놓을 수가 없습니다. 보통 화면에 표시할 이미지나 데이터를 서버에서 불러와 표시해야 하는데 이때 ajax 통신으로 해당 데이터를 서버로부터 가져올 수 있기 때문입니다.

    그럼 ajax 코드를 잠깐 살펴보겠습니다.

    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) 정보를 요청하는 코드죠. 좀 더 쉽게 말하면 지정된 URL에 ‘데이터를 하나 보내주세요’ 라는 요청을 날리는 것과 같습니다.

    그렇게 서버에서 받아온 데이터는 response 인자에 담깁니다. 그리고 tableData = response; 코드로 받아온 데이터를 tableData라는 변수에 저장합니다. 그럼 이제 이 getData()를 호출하면 어떻게 될까요? 받아온 데이터가 뭐든 일단 뭔가 찍혀야겠죠. 근데 결과는 맨 아래에서 보시는 것처럼 undefined입니다. 왜 그럴까요?

    그 이유는 $.get()로 데이터를 요청하고 받아올 때까지 기다려주지 않고 다음 코드인 return tableData;를 실행했기 때문입니다. 따라서, getData()의 결과 값은 초기 값을 설정하지 않은 tableData의 값 undefined를 출력합니다.

    이렇게 특정 로직의 실행이 끝날 때까지 기다려주지 않고 나머지 코드를 먼저 실행하는 것이 비동기 처리입니다. 자바스크립트에서 비동기 처리가 필요한 이유를 생각해보면, 화면에서 서버로 데이터를 요청했을 때 서버가 언제 그 요청에 대한 응답을 줄지도 모르는데 마냥 다른 코드를 실행 안 하고 기다릴 순 없기 때문입니다. 위에선 간단한 요청 1개만 보냈는데 만약 100개 보낸다고 생각해보세요. 비동기 처리가 아니고 동기 처리라면 코드 실행하고 기다리고, 실행하고 기다리고.. 아마 웹 애플리케이션을 실행하는데 수십 분은 걸릴 겁니다.


    비동기 처리의 두 번째 사례

    또 다른 비동기 처리 사례는 setTimeout()입니다. setTimeout()은 Web API의 한 종류입니다. 코드를 바로 실행하지 않고 지정한 시간만큼 기다렸다가 로직을 실행합니다. 아래 코드를 보겠습니다.

    // #1
    console.log('Hello');
    // #2
    setTimeout(function() {
    	console.log('Bye');
    }, 3000);
    // #3
    console.log('Hello Again');
    

     

    이전까지 비동기 처리를 알지 못한 상황에서 해당 코드를 해석하면 아래와 같다.

    hello 출력 -> 3초 후 Bye 출력 -> Hello Again 출력 일 것이다.

    그러나 JS 의 비동기 처리를 이해하면 코드 해석은 아래와 같다.

    Hello 출력 -> setTimeout 코드 실행 -> Hello Again 출력 -> 3초 후 Bye 출력

    setTimeout() 역시 비동기 방식으로 실행되기 때문에 3초를 기다렸다가 다음 코드를 수행하는 것이 아니라 일단 setTimeout()을 실행하고 나서 바로 다음 코드인 console.log('Hello Again');으로 넘어갔습니다. 따라서, ‘Hello’, ‘Hello Again’를 먼저 출력하고 3초가 지나면 ‘Bye’가 출력됩니다.


    아래의 출처 자료로 공부하는것이 훨씬 효율적이라고 생각한다.

    출처: joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/#%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EA%B0%80%EC%9A%94

     

    자바스크립트 비동기 처리와 콜백 함수

    (중급) 중급 자바스크립트 개발자가 되기 위한 자바스크립트 비동기 처리와 콜백 함수 이해하기. 콜백 지옥과 해결 방법 등

    joshua1988.github.io

     

    728x90

    'TIL > Javascript' 카테고리의 다른 글

    TIL.94 Javascript_Promise 이해하기  (0) 2021.01.10
    TIL.92 Javascript_Reduce 함수  (0) 2021.01.08
    TIL.89 Javascript_map 함수  (0) 2021.01.05
Designed by Tistory.