ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 비동기 작업의 이해
    web 2023. 3. 26. 17:10

     

    리액트를 공부하다보면 동기, 비동기에 대한 이야기를 정말 많이 접할 수 있지요, 특히 데이터 패칭을 시작하면 자바스크립트 비동기 작업에 대해 반드시 짚고 넘어가야하더라고요 그래서 오늘은 비동기 작에 대한 이야기를 해보려고 합니다. 사실 비동기는 그렇게 어려운 내용이 아닙니다.

     

    비동기란?

    예를 들어, 과제가 1부터 10까지 있는데, 과제 1을 하는데에는 3시간이 걸리고, 과제10을 하는데에는 10분이 걸린다고 칩시다.  그럼 우리 생각에는 과제 10을 먼저 할 수도 있는 거아요, 그런데 기는 그런 거 없이 정직하게 하는 거에요. 과제1시작해요, 나면 과제2시작하고요 나면 과제3하고 이런식입니다. 그런데 비동기는 이렇게 서대로 하지 아요. 앞에 작끝났든 안 끝났든 다음 테스크를 할 수 있어요. 과제 1하다가 그과제10먼저 하고 이렇게 할 수도 있고, 과제 1이랑 과제10이랑 시에 할 수도 있어요.

     

    이 이야기를 면요, 우리가 서버의 API호출할 때, '닉네임 API야 멤버들의 닉네임 데이터가 요해 요할게~'하고 응답는 과정! 이 때 이 과정이 비동기적으로 이니다. 그러니까 내가 데이터를 요하면 응답이 올 때까지 기다려야해요. 내가 요서대로 데이터가 오지 을 수도 있고요, 여러가지 요했을 때 시에 데이터가 올 수도 있는거죠. 만약에 이 작기적으로 이어진다면, 끝날 때까지 다음 작을 할 수 없어요. 끝날 때까지 기다려야하는데, 비동기적으로 하니까 그렇게 기다릴 필요 없이 멈추수가 있습니다.

     

     

    콜백 함수 

    그리고 이렇게 비동기 작을 자바스크립트에서 수하게될 때 사용하는 방법이 바로 콜백 함수입니다. 그러니까 요을 보을 때 세아네응답이 오기다리는 게 아니라, 정이벤트생했으르 때 호출을 원하는 내용을 콜백 함수에 전하는 니다.

    이렇게 자바스크립트에서 비동로그래을 하기 해서 콜백함수를 쓰는데, 이 때에는 (1) 비동기적으로 콜백함수를 호출하는 함수와 (2) 비동기적으로 호출되기를 원하는 콜백함수가 요해요. 어떻게 보면 콜백함수는 함수 안에서 또 다른 함수를 실하는 함수다라고 말할 수도 있어요. , 함수를 만들 때 인값을 함수 자로 넘주고, 때가 되면 나중에 호출, 나중에 콜백한다는 니다.

    왼쪽을 먼저 보면, 제가 콜백이라는 이름의 함수를 썼죠. 그리고 이 콜백이라는 함수는 라는 함수를 아와서 라는 함수를 보여라라는 이에요. 이게 비동기적으로 호출되기를 원하는 콜백함수고요, 이 아래 콜백함수를 호출하죠. 그리고 콘솔에 하이라고 게 하는 함수를 넣어라는 의미죠. 그러니까 여기 콘솔에 하이라고 게 해함수가 함수 부분으로 들어가서 니다. , 여기서는 비동기적으로 콜백함수를 호출했어요. 오른쪽도 마찬가지인데요, 여기서 setTimeout콜백함수의 실을 지정된 만큼 지하는 자바스크립트 함수입니다. 여기서는 함수를 3초 뒤호출!라는 의미겠죠.

    예를 들어서, 우리가 콘솔에 위와 같이 입력한다면 순서대로 1 2 3 이 뜨지요.

    그런데 이렇게 setTimeout을 쓰게 되면 순서가 1 3 2 로 뜨게 됩니다.

     

    Promise

    그런데 이렇게 콜백함수 안에 또 콜백 함수를 넣고 콜백 함수를 넣고 중되게 구을 할 수가 있어요, 콘솔에 입하면은 그Hi~가 세번 뜨긴 하는데요, 이게 가성이 그리 지가 . 이런식으로 중되게 들어가서 가성이 어지는 요런 형식의 코드를 콜백 이라고 합니다. 이러한 형의 코드는 우리가 지양해야할 코드에요. 그런데 그렇다면 콜백 을 만들지 게 할 수 없을까요? 합니다! promise를 이용한다면요.

    promise는 언가는 너에게 도할게!라고 약속하는 아이라고 생각하시면 되어요. promise를 이용하면 위에서 처럼 계속 중되는것을을수있기 때문에 콜백 을 해결할 수 있고요, 여기서 코드를 잠시 살펴보면, .then을 쓰고 나면 이게 Promise에서의 값을 아오게 됩니다.

    그리고 .catch는 에러가 나면 이걸 해서 수가 있어요. , promise는 여러 작연달아 처리한다고 해서 함수를 여러번 감싸는 게 아니라, .then을 이용해서 그다음 작을 설정하는 니다. 그래서 콜백 이 형성되지 습니다.

     

    async / await

    그리고 이 Promise좀 더 쉽게 이용할 수 있도록 는 아이들이 있어요, 바로 async(에이싱크)/await 입니다. 이 친구들은 비동기의 핵심이라고 할 수 있어요.

    자 결국 Promise를 이용해도, promise then promise then promise then이게 복이 되죠. 그래서 이걸 좀 더 쉽게 할 수 있도록 asyncawait이 나왔습니다. 새로운 게 가된 게 아니고 기존의 Promise좀 더 얹어주는 느낌이에요. 여기 이렇게 함수 앞에 async라는 키워드를 여주면 자적으로 함수가 Promise로 변이 됩니다. awaitasync은 함수 안에서만 사용할 수가 있고, 말 그대로 기다리는 거에요. promise가 처리될 때까지 함수 실을 기다리는 거죠. promise가 처리되면 다시 실이 재가 됩니다. 이게 앞에서 promise.then의 역할을 대해주는 게 await이라고 생각하시면 됩니다.

     

    사실 비동기 작업은 공부를 해도해도 끝없이 까먹게 되더라고요, 오늘 글을 통해서 비동기 작업에 대해 잘 이해하셨기를 바랍니다!

     

    댓글

Designed by Tistory.