콜백(callback) 사용하기 비동기 JavaScript 프로그램의 기본 단위는 콜백(callback)입니다. 콜백은 평범한 함수이며, 다른 함수의 인수 형태로 전달됩니다. 동기 프로그램처럼 특정 함수가 고유한 동작(네트워크 요청 등)을 완료하면 호출자가 건넨 콜백 함수를 호출합니다. 비동기 코드가 호출하는 콜백은 보통의 함수라서 비동기로 호출됨을 알리는 전용 타입 시그니처는 존재하지 않습니다. fs.readFile(디스크의 파일 내용을 비동기로 읽을 때 사용), dns.resolveCname(비동기적으로 CNAME 레코드를 해석할 때 사용) 같은 NodeJS 네이티브 API는 콜백의 첫 번째 매개변수가 에러 또는 null이고 두 번째 매개변수는 결과 또는 null이라는 규칙을 사용합니다. 다음은 re..
async와 await Promise는 비동기 코드를 다루는 강력한 추상 개념입니다. 이 패턴이 유명세를 떨치면서 결국 JavaScript도 async와 await라는 형태로 이를 지원하기 시작했습니다. 따라서 자연스럽게 TypeScript도 지원합니다. 이 문법을 이용하면 마치 동기 작업을 다루듯 비동기 작업을 처리할 수 있습니다. await는 .then에 해당하는 언어 수준 문법으로 생각할 수 있습니다. Promise에 await 하려면 반드시 async 블록 안에 있어야 합니다. .catch 대신엔 await를 일반적인 try/catch 블록으로 감싸면 됩니다. 아래와 같이 Promise가 있다고 가정해 보겠습니다. function getMember() { getMemberID(20) .then(u..
비동기 프로그래밍, 동시성과 병렬성 실무의 응용 프로그램에선 네트워크 요청을 보내고 데이터베이스 및 파일 시스템과 상호 작용하며, 사용자의 동작에 응답하고, CPU를 많이 소비하는 작업을 별도의 스레드에서 수행해야 하므로 콜백(callback), 프로미스(promise), 스트림(stream) 등 다양한 비동기 API를 사용하게 됩니다. JavaScript는 이런 비동기 작업을 처리할 때 위력을 발휘하며, 멀티스레드를 지원하는 자바나 C++ 등의 다른 주류 언어와 비교하기 어려울 정도의 차별성을 보입니다. V8, SpiderMonkey 같은 유명한 JavaScript 엔진은 태스크 멀티플렉싱 기법을 영리하게 이용하여, 여러 스레드를 이용하던 기존 방식과 달리 스레드 하나로 비동기 작업을 처리합니다. 스레..
Option 타입 특수 목적 데이터 타입을 사용해 예외를 표현하는 방법도 있습니다. 이 방식은 값과 에러의 유니온을 반환하는 방법에 비해 단점이 있지만, 에러가 발생할 수 있는 계산에 여러 연산을 연쇄적으로 수행할 수 있게 됩니다. 가장 많이 사용되는 세 가지로 Try, Option, Either 타입이 있습니다. Try, Option, Either 데이터 타입은 Array, Error, Map, Promise 등과는 달리 JavaScript가 기본적으로 제공하지 않습니다. 따라서 이 타입들을 사용하려면 NPM에서 찾아 설치하거나 직접 구현해야 합니다. Option 타입은 하스켈, 오캐멀, 스칼라, 러스트(Rust) 등의 언어에서 가져온 개념입니다. 어떤 특정 값을 반환하는 대신 값을 포함하거나 포함하지..