비동기만이 콜백을 쓰는 것은 아님. 동기도 콜백을 사용할 수 있기 때문에 명세를 확인해야함
직접 작성한 함수는 비동기 처리가 없다면 event loop의 동작을 막는다.
1. Node.js
- Chromium 프로젝트의 V8엔진을 활용해서 만든 server-side JS runtime
- V8엔진, libuv(event loop), Node bindings로 이루어짐
- 다른 runtime과 다르게 비동기 실행방식(event loop와 OS커널에서 지원하는 low-level IO API를 활용)을 기본적으로 지원하여 IO관련 작업 시 최고의 성능을 보여줌
- 브라우저가 아닌 머신 환경에서 실행되기 때문에 브라우저의 Web API와는 다른 라이브러리들이 포함됨(fs, path, crypto, Stream, zlib 등)
1.1 기본 생태계
1.1.1 패키지 매니저
- node.js 프로젝트의 의존성 관리, 테스크 작성, npm registry배포, 프로젝트에 관련된 메타데이터 작성 등을 담당
- 서드 파티 라이브러리/모듈을 npm registry로부터 다운 받아서 개발중인 프로젝트에서 사용할 수 있도록 해주거나 개발한 라이브러리/모듈을 업로드 할 수 있다.
- package.json이라는 프로젝트 명세 파일에 따라 기능을 수행함
npm init
1.1.2 NPM registry
- Node.js/Vanila JS로 작성한 서드 파티 라이브러리/모듈을 업로드하는 공간
- Public registry는 누구나 접근 가능한 공간, Private registry는 제한된 공간
개발자들은 registry로부터 필요한 서드 파티 라이브러리/모듈을 받아 본인 코드에서 사용할 수 있다.
2. 자바스크립트 실행 환경
- 자바스크립트 엔진
- 자바스크립트 코드를 읽어서 해석하고 작업을 수행하는 역할
- 엔진은 작업을 수행만 할 뿐 비동기/동기와는 관계가 없음
- 비동기 흐름
1) 먼저 외부API를 호출해 비동기 작업을 수행한다.
2) 비동기 작업이 완료되면 개발자가 넘겨준 콜백 함수를 큐에 등록한다.
3) event loop가 큐에서 콜백 함수를 꺼내 call stack에 넘겨준다
- 여기서 알 수 있는 점은 비동기 작업의 결과를 콜백 함수를 통해 처리한다는 것이다. 다만 비동기만 콜백 함수를 사용하는 것은 아니기 때문에 콜백 함수 사용 => 비동기 함수라고 단정지어서는 안된다.
- 콜백 지옥
- 콜백 지옥에서 벗어나고 promise chaining에서 벗어나게 해준 것이 async, await이다.