Elice SW 2/TIL

DAY 21 - TIL

자이구 2022. 5. 3. 23:41

Node.js 등장 배경

web 1.0(단방향 통신 위주)   ->  web 2.0(사용자의 상호작용)  ->  V8 엔진 등장(고성능의 JS)  

JS를 브라우저 외부에서 사용하기 위해 Node.js 탄생

 

Browser JS는 브라우저에서 실행하고 웹 내부 제한된 동작

Node JS는 크로스 플랫폼 실행하고 제한 없는 동작

 

Node.js 특징

  • 싱글 쓰레드
  • 비동기
  • 이벤트 기반 

쓰레드

명령을 실행하는 단위, 한개의 쓰레드는 한 번에 한 가지 동작만 실행 가능

 

싱글 쓰레드 - 한 번에 한가지 동작만 수행

멀티 쓰레드 - 동시에 여러 동작 수행 가능

 

싱글 쓰레드 장점 : 쓰레드가 늘어나지 않기 때문에 리소스 관리에 효율적

      ""        단점 : 쓰레드 기반의 작업들의 효율이 떨어집 Ex)CPU 연산 작업

 

Node.js는 싱글 쓰레드 방식/비동기 동작으로 쓰레드 기반의 작업을 최소화

 

비동기

동작을 실행한 후 완료가 되길 기다리지 않는 방식

동작의 완료를 기다리지 않기 때문에 다른 동작을 바로 실행 가능

 

이벤트 기반

비동기 동작의 완료를 처리하는 방법

비동기 방식은 특정 동작을 실행한 후, 해당 동작을 전혀 신경쓰지 않음

대신 해당 동작이 완료될 경우 실행할 함수를 미리 등록함

비동기 동작이 완료가 되면 미리 동록된 함수를 실행

 

Node.js 시작하기

LTS

Long-Term Support 버전(Node.js의 안정적이고, 오래 지원하는 버전명)

 

ES6

ECMAScript 버전 6 이후를 통틀어 일반적으로 ES6라고 부름

현대적인 문법은 생산성 향상에 도움을 줌

Node.js는 ES6의 모든 문법을 지원하지는 않음, 자주 사용되는 유용한 ES6문법 지원

 

  • let, const
  • Template String ``
  • arrow function
  • class
  • destructing
  • promise, async - awiit

 

ECMAScript 

계속해서 발전해가는 JS 표준문법(2015년,ECMAScript 버전 6 이후로 많은 현대적인 문법이 추가됨)

 

 

비동기 코딩

  • Callback : 전통적인 JS의 이벤트 기반 코딩 방식
  • Promise : callback의 단점을 보완한 비동기 코딩 방식
  • Async - Await : promise의 단점을 보완한 비동기 코딩 방식

Callback 

콜백지옥

db.getUsers((err, users) => {
	if (err) { 
    	…
    	return;
	}
	async1(users, (r1) => {
		async2(r1, (r2) => {
			async3(r2, (r3) => { 
            	…
            });
		});
	});
});

Promise 

콜백 지옥 해결책 

db.getUsersPromise()
	.then((users) => {
		return promise1(users);
	})
	.then(r1 => promise2(r1))
	.catch(…);

프로미스 지옥

promise1()
	.then(r1 => {
		return promise2(r1)
	.then(r2 => promise3(r1, r2))
});

Async - Await

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)
});

Promise의 병렬 실행 -  동시에 실행시키고 등록된 모든 함수가 마무리되면 결과값을 한꺼번에 반환

async function sync() {
	const r1 = await promise1();
	const r2 = await promise2();
	console.log(r1, r2);
}
---
async function parallel() {
	const [r1, r2] = await Promise.all([
		promise1(),
		promise2(),
		]);	
	console.log(r1, r2);
}

 

이벤트 루프

  • 이벤트를 처리하는 반복되는 동작 
  • Node.js가 비동기 - 이벤트 동작을 처리하는 일련의 반복 동작
  • 브라우저와 Node.js의 이벤트 루프는 기본적인 동작방식에 큰 차이가 없음

Call Stack

작성된 함수들이 등록되는 LIFO 스택

이벤트 루프는 콜스택이 비어 있을 때까지 스택의 함수를 실행

 

Message Queue

setTimeout 같은 지연실행 함수를 등록하는 FIFO 큐

정해진 timing이 끝나고, 콜 스택이 비어있을 경우

등록된 함수를 콜스택에 추가

 

Job Queue

Promise에 등록 된 콜백을 등록하는 FIFO 큐

상위 함수가 종료되기 전에 콜스택이 비어있지 않더라도

잡큐에 등록된 콜백을 콜 스택에 추가