1. 비동기 프로그래밍이란?
- 프로그램이 어떠한 동작을 하고 있을 때 그것을 기다리는 것이 아니라 그동안 발생하는 다른 이벤트에도 모두 반응할 수 있게만드는 기법을 의미
2. 자바스크립트의 비동기
흔히들 "자바스크립트는 비동기로 동작한다"라고 하는 말은 엄밀히 말하자면 올바른 말은 아니다. 자바스크립트는 단지 언어일 뿐 이를 어떻게 동작시키는지는 자바스크립트를 해석하고 실행하는 환경에 달려있다. 다만 현재 대표적인 자바스크립트의 실행환경인 브라우저 및 노드가 비동기적으로 자바스크립트를 실행하고 처리하기에 "자바스크립트는 비동기로 동작한다"라는 말도 결과적으로 성립하게 된 것이다.
3. 비동기의 필요성
노드는 브라우저에서 쓰이던 자바스크립트를 그 외의 환경에서 실행하기 위해서 만들어진 실행환경이기에 기본적으로 브라우저와 유사한 방식을 채택했고, 비동기로 동작하도록 설계되었다. 그렇다면 브라우저는 왜 비동기 방식을 선택했을까?
비동기의 필요성에 대한 이해를 통해 그 이유를 알아보자.
현대의 소프트웨어는 기본적으로 여러 동작을 동시에 수행할 수 있게 설계되고, 현대 프로그램에서 여러 동작을 동시에 수행하는 "동시성"은 굉장히 중요하면서 필수적이다. 이러한 동시성을 구현하기 위해서 각 프로그래밍 언어들은 자기만의 전략을 가지고 있는데 가장 대표적인 전략이 "멀티 쓰레딩"이다.
3-1. 멀티 스레딩 (Multi threading)
- 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미한다. 쉽게 말해 프로그램이 연산을 처리할 수 있도록 일꾼(스레드)을 더 고용하는 것
- 일꾼을 추가로 2명, 3명, 4명씩 고용해서 필요한 계산들을 각 일꾼들에 분배해서 수행하도록 하는 전략, 즉 동시에 여러가지 작업을 효율적으로 수행할 수 있기에 기본적으로 프로그래밍 언어에서 가장 많이 사용하는 전략
- 대표적으로 Java가 이러한 멀티 쓰레딩 전략을 취하고 있으며, Go는 쓰레드를 만들고 관리하기가 편하다는 장점으로 유명세를 얻었다.
- 복잡한 연산들을 동시에 처리할 수 있다는 이점이 있다면 단점은?
- 여러명의 일꾼을 고용한다는 것은 그만큼 그들을 잘 관리하기 위한 리소스가 많이 든다는 것
Ex) 여러명의 일꾼이 같이 일을 할 때 발생할 수 있는 문제점 중 기본적으로 같은 리소스에 두명의 일꾼이 접근해서 발생하는 문제가 생길 수 있다. 가령 "계약서"라는 서류가 있는데 A라는 일꾼과 B라는 일꾼이 둘다 이 계약서가 필요하고 이를 수정한다고 했을 때 이 계약서를 필요한 순간에 맞춰서 적절하게 서로 잘 넘겨주도록 만들어야 할 것이며 특정한 상황에서는 A가 수정한 계약서의 내용때문에 B가 할 작업이 잘못되거나 영향을 받을수도 있다. 그리고, 만약 A와 B가 협업을 해야 한다고 했을 때 A가 특정한 작업을하고 B에게 넘겨주고, B가 다시 작업 후 A에 넘겨주고, A가 작업 후 B에 넘겨주고 이런 과정들이 반복적으로 많이 필요한 협업이라고 가정할때는 서로 작업물을 기다리고, 넘겨가면서 작업하는것보다 오히려 한명의 작업자가 전체 과정을 한번에 해버리는게 더 효율적일수도 있다. 이런 환경에서 효율적으로 작업을 조율하기 위해서는 매니저(개발자)는 각 일꾼들을 관리하고 조율하는데 많은 노력을 기울여야 한다. - 멀티스레딩 방식으로 동작하는 프로그램을 구현하기 위해서는 개발자가 멀티스레드 환경하에서 문제가 발생하지 않고 효율적으로 돌아갈 수 있도록 코드 작성단계에서부터 많은 주의를 기울어야하며, 이로 인해 프로그램의 복잡성이 올라간다는 단점이 있다.
- 자바스크립트는 싱글스레드로서 동작하도록 설계되었다.
자바스크립트 탄생의 시초는 브라우저에서 실행되는 간단한 스크립트 언어였기 때문에 멀티스레드와 같은 복잡성을 가지는 것은 적절하지 않았다. 하지만 싱글스레드인 자바스크립트는 멀티스레드가 없을 때 발생할 수 있는 "A라는 동작을 하는 동안 B라는 동작을 하지 못하게 된다." 라는 문제가 남아있다.
결국 자바스크립트는 싱글 스레드의 단순함을 유지하면서도 동시성을 지원하기 위해서 비동기 프로그래밍 방식을 채택하게 되었다.
3-2. 자바스크립트의 비동기 방식
- 일꾼(스레드)은 한명이지만, 이 일꾼이 쉽게 말해 외주업체를 사용할 수 있게 만든 방식
비동기 프로그래밍은
- 자바스크립트에서 일꾼은 한명이다.
- 다소 시간이 오래걸릴 것 같은 작업이 일꾼에게 주어지면, 일꾼은 외주업체에 이 작업을 맡긴다.
- 이 작업이 완료되었을 때 해야 할 일을 기록해둔다.
- 일꾼은 다시 필요한 일들을 수행하다가 외주업체에서 작업을 완료했다는 연락을 받으면, 미리 기록해 둔 해야 할 일을 처리한다.
위와 같은 방식으로 애플리케이션을 설계하는 방법을 비동기 프로그래밍이라고 부른다.
자바스크립트는 아래와 같은 방식을 통해서 시간이 오래걸리는 작업들(HTTP, 유저의 카메라 접근, 유저의 파일에 접근) 등의 동작을 수행하면서도 유저가 발생시키는 클릭, 타이핑등의 이벤트에 정상적으로 반응할 수 있게 만들어졌다.
- 외주업체를 통해서 동시에 일을 처리하긴 하지만, 이 외주업체가 어떤 방식으로 일을 하는지는 직접 관리하지 않는다.
- 이미 신뢰도가 높다고 평가되었기때문에 그저 믿고 일을 맡긴 후 결과만 받아오는 방식으로 일을 한다.
- 이런 방식을 통해서 매니저가 해야 할 일은 오로지 단 한명의 일꾼만 관리해주면 되기 때문에 신경써야 할 부분이 현저히 줄어든다.
'Language > JavaScript' 카테고리의 다른 글
Promise & Async Await (0) | 2022.11.10 |
---|---|
[JavaScript] 비동기를 구현하는 방법 (Event loop & Callback) (0) | 2022.11.09 |
Iterator & Generator (0) | 2022.10.29 |
Javascript ES6 전체적으로 살펴보기 (0) | 2022.06.27 |
[JavaScript] 유사 배열 객체(Array-like objects) (0) | 2022.03.23 |