또 자바스크립트 ㅠ
Node.js랑 Spring이랑 고민하다가 Node.js가 더 가볍다 생각해서 먼저 공부하기로 했다.
Node.js는 서버나 프레임워크가 아닌, 자바스크립트의 런타임이다.
기본적으로 웹 브라우저에는 js를 구동시킬 수 있는 엔진이 내장되어있는데, Node.js를 설치하게 되면
웹 브라우저 밖에서도 js를 구동시킬 수 있게 된다.
Node.js의 기본적인 동작 방식
우선 모든 처리를 비동기(Asynchronous)적으로 진행한다.
어떤 요청들이 들어왔을 때, 요청들을 동기적으로 처리하는게 아닌
마치 농구 게임을 하듯 비동기적으로 처리하게 된다.
오락실이나 게임장에 자주 있는 농구게임을 하다 보면
내가 던진 공이 들어갔는지는 중요하지 않고
바로바로 밑에서 농구공을 주워서 골대에 던지듯이 말이다.
그럼 골이 들어갔는지, 아니면 링 밖으로 팅겨져 나왔는지는 어떻게 알까?
위의 여자분은 계속 링을 보고있긴 하지만 너무 심취해서 못본다고 가정해보자
아마 가장 쉽게 알 수 있는 방법은 골이 들어갔다는 소리(콜백)를 듣는것이다.
아까 던진 공이 3점이었는지, 2점이었는지, 0점이었는지는 기계가 처리할때마다 알려준다.
Node.js도 이러한 방식으로 동작하게 되는데,
이를 도식화하면 다음과 같다.
Client가 Request(공이 굴러 들어옴)를 보내면,
Node.js가 가지고 있는 이벤트 루프에서 이를 받아 비동기적으로 작업자에게
요청을 처리해달라는 작업을 할당한다(공 던지기). 이때 작업이 완료됐을 때 실행되는 Callback(소리 내줘)을 같이 보내면
작업자는 자기 작업이 끝나고 난 후 받았던 Callback(소리 내기)을 실행시키면서 이벤트 루프에게 제어권을 넘긴다.
제어권을 넘겨받은 이벤트 루프는 다시 Request를 보냈던 Client에게 Response를 보내는 방식으로 Node.js는 실행된다.
자바스크립트의 비동기 처리
Node.js는 자바스크립트를 사용하므로, 비동기 처리를 하려면
자바스크립트의 비동기 처리 방식을 알아야 한다.
1. Promise
Promise 객체를 생성하면서 resolve, reject 함수를 콜백으로 넘겨주면 된다.
resolve는 제대로 동작이 완료됐을 때,
reject는 제대로 동작이 완료되지 않았을 때 호출되는 callback이다.
function workP(sec) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(new Date().toISOString());
}, sec * 1000);
});
}
workP(1).then((result) => {
console.log('첫 번째 작업', result);
return workP(1);
}).then((result) => {
console.log('두 번째 작업', result);
});
console.log('진짜 첫 번째 작업');
'첫 번째 작업'을 출력하는 작업은 1초가 지난후에,
'두 번째 작업'을 출력하는 작업은 2초가 지난후에,
그리고 '진짜 첫 번째 작업'을 출력하는 작업은
Promise객체를 생성한다음 동기적으로 처리되기 때문에
0초뒤에 실행되게 된다.
Promise를 이용하면 .then 메소드를 이용해 Chaning을 쉽게 할 수 있는데,
말 그대로 그 다음에 실행될 내용을 적어주면 된다.
비동기들 사이에서도 순서가 강제되어야 하는 작업 목록이 있으면 then 메소드를 이용해 체인을 걸어주면 된다.
2. async / await
async / await는 Promise의 진화버전인데,
다른 언어들에서도 많이 쓰이는 비동기 표준방식이다.
fuction workP(sec) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('workP function');
}, sec * 1000);
});
}
async function asyncFunc() {
const result_workP = await workP(3);
console.log(result_workP);
return 'async function';
}
asyncFunc().then((result => {
console.log(result);
});
async 키워드는 비동기 처리를 하는 함수 앞에 붙여주고,
await 키워드는 async 함수안에서 비실제 비동기 처리가 되는 부분에 붙여주면 된다.
async 함수 안에서, await 키워드를 만나게 되면 밑에 코드는 실행하지 않고
Promise가 resolve할때까지 기다렸다가 resolve 되면 밑에 코드를 실행하게 된다.
즉, 더 이상 then 메소드로 체이닝을 하지 않고 await 키워드 하나로 순서를 강제 할 수 있게 되었다!
참고
https://book.naver.com/bookdb/book_detail.naver?bid=21139328
'etc > Node.js' 카테고리의 다른 글
[Node.js] 미들웨어와 쿠키 및 세션 (0) | 2022.03.08 |
---|