본문 바로가기
JavaScript 이론/비동기프로그래밍(Asynchronous)

# 1 비동기 프로그래밍 개념

by 혀닙 2022. 3. 7.

목차

  1. 코드의 동기적 실행과 비동기 개념
  2. blocking 현상
  3. 쓰레드
  4. 자바스크립트는 싱글쓰레드이다.
  5. 비동기적 코드

 

# 1. 코드의 동기적 실행과 비동기 개념

일반적으로, 프로그램 코드는 좌측 상단에서 부터 순차적으로 실행되며, 한번에 하나씩 실행된다. (코드의 동기적 실행)

만약 어떤 함수가 다른 함수의 결과에 의존하게 된다면, 그 함수는 다른 함수가 끝나고 결과가 반환될 때까지 기다려야 할 것이다.

또한 유저의 관점에서 그동안은 모든 프로그램 동작이 멈춘 것처럼 보일 것이다.

 

이러한 당황스러운 경험에 대한 대안으로 비동기 프로그래밍이라는 개념이 있다.

컴퓨터 사용에서, 비동기라는 단어는 두개의 주요 맥락에서 사용된다.

 

#1-1. Networking과 통신

비동기 통신은 메세지를 받은 후 즉시 처리가 아닌, 처리 가능한 시점에 처리하는 형태로, 둘 또는 그 이상의 당사자간 메세지를 교환하는 방식이다.

 

소프트웨어가 비동기적으로 통신할때, 프로그램은 서버와 같은 다른 소프트웨어에 정보를 요청할 수도 있으며, 응답을 기다리는 동안 다른 작업들을 계속할 수 있다.

 

예를 들어 AJAX 프로그래밍 기술은 HTTP를 사용하여서버에 비교적 적은 양의 데이터를 요청하며, 결과의 반환이 즉각적인 것이 아니라 가능한 시점에 반환되는 방법이다.

 

#1-2. 소프트웨어 디자인

비동기 소프트웨어 설계는 하나의 프로그램이 태스크가 완수될때까지 기다리지 않고 기존의 태스크와 별개로 수행되도록 하는 코드를 작성함으로써 그 개념을 확장한다. 별개로 수행되는 태스크가 완수된 경우, 기존의 태스크는 사전에 정한 알림 방법에 의해 작업이 완료되었으며, 필요하다면 그 작업의 결과를 이용할 수 있음을 알게 된다.

 

 

#2. 코드 blocking

코드의 비동기적 실행은 특히나 웹 프로그래밍에서 유용하다.

웹 어플리케이션이 다량의 코드를 한꺼번에 실행하는동안 브라우저에게 컨트롤을 돌려주지 않는다면,  유저의 입장에서는 브라우저가 멈춘 것처럼 보일 수도 있을 것이다.

이 멈춘 것처럼 보이는 상태를 blocking이라고 한다.

 

블록킹이란?

웹 어플리케이션이 유저의 요청을 처리하느라 브라우저에게 프로세스에 대한 컨트롤을 반환하지 않음으로써 브라우저가 멈춘 것처럼 보이는 현상.

 

#3. Threads(쓰레드)

쓰레드는 기본적으로 프로그램이 일을 완수하기 위해 사용하는 단일 프로세스이다.

각각의 쓰레드는 한번에 오직 하나의 일만 수행할 수 있다.

태스크 A --> 태스크 B --> 태스크 C

각각의 태스크들은 순차적으로 실행된다.

즉 하나의 태스크과 완료된 이후에 다음 차례의 태스크가 시작된다.

 

오늘날 많은 컴퓨터들이 멀티 코어를 가지고 있기 때문에, 한번에 여러 가지 일을 수행할 수 있다.

멀티 쓰레드를 지원하는 프로그래밍 언어들은 멀티 코어를 사용하여, 아래와 같이 여러 태스크들을 동시에 수행할 수 있다.

 

Thread 1 : Task A --> Task B
Thread 2 : Task C --> Task D

 

#4. 자바스크립트는 싱글 쓰레드이다

자바스크립트는 싱글 쓰레드이다.

멀티 코어를 가지고 있는 컴퓨터라 할 지라도 자바스크립트는 오직, main thread라고 불리는 단일의 쓰레드에서 작업을 실행한다.

 

단일쓰레드로 인해 발생한 blocking현상 등의 문제를 해결하기 위하여 자바스크립트는 몇 가지 툴을 도입하였다.

Web workers API는 처리해야 하는 몇몇 자바스크립트 태크스를 worker라고 불리는 분리된 쓰레드로 보내어, 동시에 다중의 자바스크립트 코드를 실행 가능하게 한다.

 

Main thread : TaskA --> Task B
Worker thread : Expensive TaskB

시간이 오래 걸리는 프로세스들을 워커 쓰레드가 실행함으로써 메인쓰레드는 블로킹되지 않을 것이다.

 

 

#5. 비동기적 코드(Asynchronous code)

5-1. Web worker의 한계

-DOM에 접근 불가능 > worker에게 UI 관련 지시 불가

-blocking은 발생하지 않지만 코드 실행이 동기적

 

5-2. 극복 방법 - 코드의 비동기적 실행

코드 실행이 동기적이라는 Web work의 한계는 코드 실행을 동기적으로 바꾸어주어 극복 가능하다.

이를 위해 사용되는 객체가 바로 Promise객체이다.

프로미스 객체에 대해서는 차후에 천천히 알아보도록 하자.

댓글