모스카토

Node.js 기초 본문

엘리스 ai트랙

Node.js 기초

라리라밤 2022. 2. 16. 13:54

1. Node.js 이해하기

Node.js 등장 배경

web 2.0에서 사용자와 상호작용이 증가하면서 구글에서 v8 엔진(오픈소스) 개발 -> 자바스크립트 실행 속도가 빨라짐 -> v8 엔진을 사용해 Node.js가 개발됨.

  Node.js   는 자바스크립트를 어느 환경에서나 실행할 수 있게 해주는 실행기이다.

기존에는 JavaScript를 브라우저에서만 실행할 수 있었다. 웹 프론트 개발자의 언어로 사용됐다.

Node.js로 인해 크로스 플랫폼(어느 환경에서든) 실행 가능해졌다. 동작의 제한이 거의 없어서 다양한 어플리케이션을 개발할 수 있게 됐다.

 

2. Node.js 특징

싱글 쓰레드의 한계를 대체하기 위해 비동기 방식을 사용하고, 비동기 구현을 위해 이벤트 기반의 동작 방식을 사용한다.

1. 싱글 쓰레드

* 쓰레드 : 명령을 실행하는 단위

① 쓰레드에 cpu 리소스를 낭비하지 않는다.

② 싱글 쓰레드는 한번에 한가지 동작만 수행가능하다.

③ 쓰레드 기반의 작업 효율이 떨어진다.

→  비동기 동작으로 쓰레드 기반 작업을 최소화한다.

 

2. 비동기

: 동작을 실행한 후 완료될 때까지 기다리지 않는 코드 실행 방식.

→  다른 동작을 바로 실행할 수 있다.

 

3. 이벤트 기반

비동기 동작을 실행 -> 그 동작이 완료되면 실행할 함수를 미리 등록 -> 완료 후 등록된 함수를 실행.

이벤트 : 완료되면 실행할 함수

 

 

3. Node.js 시작하기

빠르게 변화하고 있어서 가장 최신의 LTS 버전을 사용하는 것이 좋다.

lts : long term support, 안정적으로 오래 지원하는 버전.

 

4. ES6

= ECMAScript 버전 6 이후를 통틀어서 es6라고 부른다.

ECMAScript : ECMA에서 발표하는 JavaScript의 표준 문법

버전 6 이후에 현대적인 문법들이 많이 추가되어서 6 이후를 통틀어 es6라고 한다.

node.js는 빠르게 최신 ECMAScript를 지원한다. 하지만 모든 문법을 지원하지는 않는다.

 

ES6 문법

① let, const : 상수와 변수 구분

② Template string : 백틱 ( ` ) 으로 문자열 사이에 변수 삽입과 줄바꿈이 가능해짐.

let number = 10

let sentence = `My number is ${ number }`

console.log(sentence)

③ arrow function : 기존의 function 키워드 없이 그냥 변수처럼 함수를 선언 가능.

const add = (a,b) => return a+b

④ class

⑤ destructing : object나 배열에서 값을 꺼내고 넣을 때 여러 변수를 나열하여 한번에 꺼낼 수 있다.

let obj = {name: 'elice', age: 20}

let {name, age} = obj

let arr = ['A', 'B', 'C']

let [f, s, t] = arr

5. 비동기 코딩

Node.js에서 비동기 동작을 구현하는 세가지 방법에 Callback Promise Async/Await 가 있다.

① Callback : 전통적인 JavaScript 이벤트 기반 코딩 방식

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

② Promise : callback의 단점을 보완

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

Promise.all( [ promise1( ),  promise2( ) ] )  : promise함수를 동시에 실행시키고, 등록된 모든 함수가 마무리되면 결과값을 한번에 반환한다. -> 소요시간이 줄어든다.

 

③ Async/Await  : Promise의 단점을 보완

async function doSomething() => {
	const r1 = await promise1();
    const r2 = await promise2(r1);
    const r3 = await promise3(r1, r2);
    ...
    return r3;
}

doSomething().then(r3 => {
	console.log(r3)
})

 

try catch를 사용할 수 있다.

async function doSomething(msg){
	try{
    	const r = await promise1();
        console.log(r)
    } catch(e){
    	console.error(e);
    }
}

 

* callback 기반 함수를 Promise 함수로 변경하는 방법

function getUsersPromise(params){
	return new Promise((resolve, reject) => {     
    	getUsers(params, (err, users) => {
        	if(err) {
            	reject(err);
                return;   
            }
            resolve(users); 
        }); 
    }); 
}

① 반환값을 Promise객체로 생성

② Promise객체 생성시, resolve, reject를 인자로 받는 함수를 등록.

③ 해당 함수 안에서 콜백기반 비동기 함수를 실행

④ 콜백함수의 결과는 resolve, 에러는 reject로 전달.

 


6. 이벤트 루프

: 이벤트를 처리하는 loop

브라우저와 Node.js 모두 이벤트 루프를 사용한다.

이벤트 루프 구성

Call Stack : 작성된 함수들이 순차적으로 등록되는 스택. 

② Message Queue : setTimeout 같은 지연실행 함수를 등록하는 큐.

정해진 timing이 끝나고  콜스택이 비어있을 때  콜스택에 등록된 함수를 추가한다.

③ Job Queue : Promise에 등록된 콜백함수를 등록하는 큐.

 콜스택이 비어있지 않아도  상위함수가 종료되기 전에   콜스택에 함수를 추가한다. 

'엘리스 ai트랙' 카테고리의 다른 글

익스프레스 시작하기  (0) 2022.02.18
NPM과 모듈  (0) 2022.02.16
Axios API 사용하기  (0) 2022.02.12
sql로 데이터 다루기2  (0) 2022.02.11
async / await 와 API  (0) 2022.02.10
Comments