Languages/Javascript

[Javascript]동기와 비동기의 이해 콜 스택(Call Stack) 이해하기

MoonSta 2023. 4. 10. 11:48

최근 Javascript에 대한 관심이 커지면서 문법적인 부분을 먼저 공부하였다. 기본적인 문법을 익히고 나서는 Javascript의 동작 방식에 대해 궁금증이 생겼고, 가장 자주 쓰이며 꼭 알아야 할 지식인 동기(Synchronous)와 비동기(asynchronous)에 대해 공부를 하게 되었다. 


 

Javascript는 기본적인 싱글 스레드 언어! 

이 글을 보는 사람 중에 저처럼 입문한 지 얼마 안 되신 분은 싱글 스레드란 말이 생소할 수도 있다. 쉽게 말하자 Javascript는 기본적으로 두 가지 일을 동시에 하지 못한다. 즉 한 개의 함수가 동작하고 있으면 다른 함수는 동작하지 않는다는 의미이다.

 


 

동기란(Synchronous)란?

 앞서 말한 Javascript의 기본적인 동작 방식은 동기 형태로 동작한다. 우선 동기(Synchronous) 의 사전적인 의미는 동시에 일어난다는 의미이다. 즉 한 가지 동작이 실행되면 동작의 결과를 얻을 때까지 다른 일을 할 수 없다는 것이다. 예를 들면 인터넷으로 옷을 주문한 후에 옷을 받을 때까지 아무 일도 하지 못한다는 뜻이다. 하지만 일하지 못하는 시간 동안 해야 할 일이 있을 수도 있다. 

 


 

비동기(asynchronous)의 등장? - 비동기적 처리가 필요한 이유

앞서 말한 동기(Synchronous)에 방식을 설명하면서 나왔었던 문제처럼 Javascript에서의 동시성의 문제는 풀어야 할 문제였다. 사전적인 뜻은 동기(Synchronous)에 반대되는 말로 동시에 일어나지 않는 것을 의미한다. 즉 비동기(asynchronous)의 동작 방식을 사용하면 응답받는 시간 동안 다른 일을 처리할 수 있다.  자세한 설명에 앞서 이해를 돕기 위해 Javascript의 engine에 대한 이해가 필요하다. 

 

 


 

Javascript Engine이란?

Javascript Engine은 Call Stack과 Memory heap를 통해 Javascript의 코드의 실행을 관리하는 역할을 한다. 

  • Memory heap : 메모리의 할당이 이루어진다.                       -참조타입과 데이터 저장
  • Call Stack : 코드의 실행 순서에 대한 기록이 쌓이는 곳      - Javascript코드의 실행 순서가 저장

마무리

 Call Stack에 코드의 실행 순서가 쌓이게 되고 한 개씩 실행하다 보면 시간이 오래 걸리는 순서가 있을 것이다. 이러한 긴 시간을 요구하는 작업이 있으면 기다리는 시간 동안 다음의 실행 순서가 실행한다면 총 실행 시간이 줄 수 있을 것이다.  실행을 순서대로 할 수 있는 동기 방식은 직관적이며 설계하는 것이 쉬웠지만, 실행 순서에 대한 제약이 있었다. 이러한 문제를 해결하기 위해 비동기 동작 방식에 대해 알아보았지만 설계를 하는 데 있어서 더 복잡하다고 생각하였다. 효율적으로 프로그래밍하기 위해 적재적소에 맞는 동작 방식을 사용해야 할 것이다.