Node.js는 자바스크립트를 어느 환경에서나 실행할 수 있게 해주는 실행기다.
Node.js의 특징
싱글 쓰레드이기 때문에 비동기 동작이 필요하고, 비동기 동작을 구현하기 위해 이벤트 기반으로 동작한다.
싱글 쓰레드
- 쓰레드 : 명령을 실행하는 단위
- 한 번에 한가지 동작만 수행
- 장점 : 쓰레드가 늘어나지 않으므로 리소스 관리에 효율적
- 단점 : 쓰레드 기반의 작업들의 효율이 떨어짐 (ex: CPU 연산 작업)
비동기
- 동작 실행 후 완료되길 기다리지 않는 방식
- 다른 동작 바로 실행 가능
- 비동기 동작으로 싱글 쓰레드 기반의 작업을 최소화함
이벤트 기반
- 비동기 동작의 완료를 처리하는 방법
- 비동기로 실행한 특정 동작이 완료될 경우 실행할 함수를 미리 등록
비동기 코딩
비동기 - 이벤트 기반 동작을 코드로 구현하는 방법이다.
callback
- db.getUsers => 데이터베이스에서 유저 목록을 찾아오는 비동기 동작 수행
- 이벤트 등록 및 실행 => 쿼리 완료 후 오류가 있는지 or 유저 목록의 결과로 미리 등록된 콜백 함수를 실행
- callback의 표준 : 에러와 결과를 같이 전달
db.getUsers((err, users) => {
console.log(users);
});
Promise
- Promise 함수 동작 완료 후 then에 등록된 callback 실행
(오류 발생 시 catch에 등록된 callback 실행)
- 체이닝으로 코드 간결화
db.getUsersPromise()
.then((users) => {
return promise1(users);
})
.then(r1 => promise2(r1))
.catch(…);
async-await
- async 함수 내에서 promise 함수의 결과를 await 로 받을 수 있음
- await 한 promise 함수가 완료될 때까지 다음 라인으로 넘어가지X
- 순차적 프로그래밍처럼 작성 가능
- async 함수의 return 결과는 Promise
async function doSomething() => {
cosnt r1 = await promise1();
const r2 = await promise2(r1);
const r3 = await promise3(r1, r2);
…
return r3;
});
doSomething().then(r3 => {
console.log(r3)
});
=> 현대 JavaScript에서는 대부분 가독성이 좋은 async-await 사용을 지향하고 있다.