비동기 프로그래밍, 동시성과 병렬성
실무의 응용 프로그램에선 네트워크 요청을 보내고 데이터베이스 및 파일 시스템과 상호 작용하며, 사용자의 동작에 응답하고, CPU를 많이 소비하는 작업을 별도의 스레드에서 수행해야 하므로 콜백(callback), 프로미스(promise), 스트림(stream) 등 다양한 비동기 API를 사용하게 됩니다.
JavaScript는 이런 비동기 작업을 처리할 때 위력을 발휘하며, 멀티스레드를 지원하는 자바나 C++ 등의 다른 주류 언어와 비교하기 어려울 정도의 차별성을 보입니다.
V8, SpiderMonkey 같은 유명한 JavaScript 엔진은 태스크 멀티플렉싱 기법을 영리하게 이용하여, 여러 스레드를 이용하던 기존 방식과 달리 스레드 하나로 비동기 작업을 처리합니다.
스레드 하나로 비동기 작업을 처리하는 이벤트 루프가 바로 JavaScript 엔진의 표준 모델입니다.
최종 사용자 입장에선 엔진이 이벤트 루프 모델을 사용하든 멀티스레드 모델을 사용하든 별로 상관이 없지만, 개발자 입장에선 작업 처리 방식과 설계 방식에 많은 영향을 받습니다.
JavaScript는 이벤트 루프 기반의 동시성 모델을 이용해 멀티스레드 기반 프로그래밍에서 공통적으로 나타나는 문제점을 해결합니다.
공유 메모리는 스레드 간에 메시지를 보내거나 데이터를 직렬화해서 보낼 때 활용하는 일반적인 패턴이지만, JavaScript를 여러 스레드에서 실행하더라도 공유 메모리는 거의 사용하지 않습니다.
이는 Erlang, 액터 시스템, 다른 순수 함수형 동시성 모델을 연상시키는 기능이며 JavaScript 멀티스레드 프로그래밍을 안전하게 해주는 핵심입니다.
비동기 프로그래밍은 코드를 한 줄씩 머리로 따라가면서 추적할 수 없는 구조이므로 프로그램을 이해하긴 어렵습니다.
언제 실행이 멈추고 다른 곳의 실행이 진행되며, 멈추었던 실행이 언제 재개되는지 파악해야 하기 때문입니다.
TypeScript는 비동기 프로그램을 더 잘 이해할 수 있는 도구를 제공합니다.
타입을 이용하면 비동기 작업을 추적할 수 있으며, async/await 내장 기능을 이용해 비동기 프로그래밍을 동기 프로그래밍과 비슷한 관점에서 접근할 수 있습니다.
또한 멀티스레드 프로그램에서 엄격한 메시지 전달 프로토콜을 지정하도록 할 수 있습니다
'👶 TypeScript' 카테고리의 다른 글
콜백(callback) 사용하기 (0) | 2023.01.24 |
---|---|
async와 await (0) | 2023.01.23 |
에러 처리 - Option 타입 (0) | 2023.01.23 |
에러 처리 - 예외 반환 (0) | 2023.01.23 |
에러 처리 - 예외 던지기 (0) | 2023.01.23 |