1. Node.js의 등장
단방향 통신의 WEB 1.0에서 상호작용하는 WEB 2.0으로 변경되면서
고성능의 JavaScript가 필요했다. 따라서 V8 엔진이 등장하게 된다.
이 JavaScript를 브라우저의 외부 환경에서 사용하기 위하여 Node.js가 탄생하게 되었다.
2. Node.js의 특징
Node.js의 큰 특징은 싱글 쓰레드 / 비동기 / 이벤트 기반
총 3가지로 나누어 볼 수 있다.
1) 싱글 쓰레드
쓰레드란 명령을 실행하는 단위이고 한 개의 쓰레드는 한 개의 명령만 실행이 가능하다.
장점 : 쓰레드가 늘어나지 않기 때문에 리소스 관리가 효율적이다.
단점 : 쓰레드 기반의 작업들의 효율이 떨어진다. (CPU연산 작업)
2) 비동기
따라서 Node.js에서는 비동기 동작을 이용하여 쓰레드 기반의 작업을 최소화 하게 된다.
3) 이벤트 기반
비동기 동작의 완료 처리를 하는 방법으로 특정 동작을 실행한 후, 해당 동작을 전혀 신경 쓰지 않는다.
대신 해당 동작이 완료될 경우 실행할 함수를 미리 등록한다. (WEB API로 가서 카운팅 하게 된다.)
따라서 비동기 동작이 완료되면 미리 등록된 함수가 실행 된다. (Call Back 함수)
Extra) ES6
ECMAScript 버전 6 이후를 통틀어 일반적으로 ES6이라고 부른다.
(ECMAScript : 자바스크립트의 표준 문법)
ES6의 특징은 var의 변수 선언이 아닌 const변수 선언으로 변경할 수 없는 변수로 지정이 가능하다.
3. Node.js에서의 비동기 코딩
db.getUsers((err, users) => {
console.log(users);
});
db.getUsers 함수는 데이터베이스에서 유저 목록을 찾아오는 비동기 동작을 수행한다.
db.getUsersPromise() // Promise
.then((users) => {
return promise1(users);
})
.then(r1 => promise2(r1))
.catch(...)
Promise함수는 동작이 완료되면 then에 등록된 callback 함수를 실행한다.
오류가 발생한 경우 catch에 등록된 callback 함수를 실행한다.
function getUsersPromise(params) { // Promise
return new Promise((resolve, reject) => {
getUsers(params, (err, users) => {
if (err) {
reject(err);
return;
}
resolve(users);
});
});
}
Promise는 resolve, reject 두 가지 값을 가지게 되는데
getUsers함수의 실행 결과에 따라 resolve, reject로 분리가 된다.
이때 reject는 catch에 등록된 callback을 실행하고
resolve는 then에 등록된 callback을 실행하게 된다.
async function doSomething() => { // async
const r1 = await promise1();
const r2 = await promise2(r1);
const r4 = await promise3(r1, r2);
...
return r3;
});
doSomething().then(r3 => {console.log(r3);});
async function doSomething(msg) { // async 2
try {
const r = await promise();
console.log(r);
} catch(e) {
console.erroe(e);
}
}
async-await는 promise의 다른 문법으로
async 함수 내에서 promise 함수의 결과를 await로 받을 수 있다.
await한 promise함수가 완료될 때 까지 다른 라인으로 넘어가지 않는다.
따라서 순차적인 프로그래밍처럼 작성이 가능하며,
async함수의 return은 Promise이다.
async function sync() {
const r1 = await promise1();
const r2 = await promise2();
console.log(r1, r2);
}
---
asunc function parallel() {
const [r1, r2] = await Promise.all([
promise1(),
promise2(),
]);
console.log(r1,r2);
}
위와같이 Promise.all로 실행하면 모든 Promise 함수를 동시에 실행시키고 등록된 모든 함수가 마무리되면 결과값을 한번에 반환한다.
'ELICE AI6 > Node.js' 카테고리의 다른 글
Elice) Express.js (0) | 2023.01.07 |
---|---|
Elice) NPM 2 (0) | 2023.01.05 |
Elice) NPM (0) | 2022.12.31 |