관리 메뉴

정골라코딩

[JS] Node.js 와 MongDB I 본문

JavaScript

[JS] Node.js 와 MongDB I

정골라 2022. 10. 10. 21:54

Node.js 이해

  • Node.js의 등장 배경

  • Node.js의 탄생

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

 

  • Node.js vs Browser

  • Node.js로 할 수 있는 것들

Node.js의 특징

Node.js 특징 한 줄 요약 =>싱글 스레드-비동기-이벤트 기반

 

  • 스레드란? : 명령을 실행하는 단위; 한 개의 스레드는 한 번에 한 가지 동작만 실행 가능
  • 싱글 스레드와 멀티 스레드의 차이점

  • 그렇다면 싱글 스레드는 안 좋은 것 아닌가요?

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

단점) 스레드 기반의 작업들의 효율이 떨어짐 ex) CPU 연산 작업

 

그래서 Node.js는 비동기 동작으로 스레드 기반의 작업을 최소화합니다.

  • 비동기란?

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

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

-Node.js는 싱글 스레드이기 때문에 비동기 방식을 사용함

 

  • 동기와 비동기의 차이

  • 이벤트 기반이란?

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

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

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

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

  • Node.js 의 특징 요약

-싱글 스레드이기 때문에 비동기 동작 필요

-비동기 동작을 구현하기 위해 이벤트 기반

 

Node.js 시작하기

  • 어떤 버전으로 시작해야 할까?

Node.js는 빠르게 개발 중

~보안 이슈 및 버그 수정, 최신 기술 빠르게 적용

~급변하는 기술은 가장 안정적인 최신 버전을 선택하는 것이 최선

 

LTS

~Long-Term Support 버전

~Node.js의 안정적이고, 오래 지원하는 버전 명

ES6

  • ES6란?

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

  • ECMAScript

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

  • ES6를 사용하는 이유?

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

-Node.js 는 빠르게 최신 ECMAScript를 지원 중

-자주 사용되는 유용한 문법을 익히고 필요한 부분에 적절하게 활용하는 것이 중요

  • Node.js 와 ES6

-Node.js는 ES6의 모든 문법을 지원하지는 않음

-Node.js로 자주 사용되는 유용한 ES6 문법의 코드를 실행해보며 Node.js 와 친숙해지는 시간을 가져 봅시다.

  • 자주 사용되는 문법 1 - let, const

  • 자주 사용되는 문법 2 - Template String

  • 자주 사용되는 문법 3 - arrow function

  • 자주 사용되는 문법 4 - class

  • 자주 사용되는 문법 5 - destructing

  • 자주 사용되는 문법 6 - promise, async-await
  • ES6 적용 결과

-복잡하거나 직관적이지 않던 방법을 보기 좋게 만들고 간결하게 표현할 수 있게 됨.

-현대적인 문법은 처음 접할 땐 어색하지만, 익숙해지면 좋은 코드를 작성할 수 있게 됨.

비동기 코딩

  • 비동기 코딩의 세가지 방법

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

Promise: callback의 단점을 보완한 비동기 코딩 방식

Async-Await: promise의 단점을 보완한 비동기 코딩 방식

 

  • Callback

 

 

 

 

비동기 동작

: db.getUsers 함수는 데이터베이스에서 유저 목록을 찾아오는 비동기 동작을 수행

 

이벤트 등록/실행

: 쿼리가 완료되면 오류가 있는지, 혹은 유저 목록의 결과로 미리 등록된 callback 함수를 실행

 

참고-callback 의 표준

: 에러와 결과를 같이 전달하는 것이 표준으로 자리 잡혀 있음

 

 

  • 콜백 지옥

 

 

 

 

 

 

async1, async2, async3... 를 동기적으로 실행해야 할 경우?

Node.js는 기본적으로 비동기 동작을 callback으로 처리하기 때문에 계속해서 callback의 callback의 callback의 callback...

-->좋은 코드가 아님!

 

 

 

 

 

 

  • Promise의 등장



 

 

 

Promise 함수는 동작이 완료되면 then 에 등록된 callback 실행.

 

오류가 발생한 경우 catch에 등록된 callback 실행.

 

chaining을 사용해 코드를 간결하게.

short-hand 표현 방법으로 더욱 간결하게.

 

1. Return 생략 가능

2. 인자가 하나인 경우 () 생략 가능

 

 

 

 

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

 

 

 

 

Promise 는 resolve, reject 두 가지 함수를 가짐.

 

async1 함수의 실행 결과에 따라 resolve, reject로 분리

 

reject는 catch에 등록된 callback 실행

 

resolve는 then에 등록된 callback 실행

 

 

 

  • 프로미스 지옥

 

 

 

 

 

 

promise3 함수가 promise1 와 promise2의 결과값을 같이 사용하고 싶다면?

 

직관적으로 생각한다면 위와 같은 콜백 지옥과 유사한 해결책이 생각남

 

 

 

 

 

 

 

  • Async-Await의 등장

 

 

 

 

async-await 은 promise의 다른 문법

 

async 함수 내에서 promise 함수의 결과는 await 으로 받을 수 있음.

 

await 한 promise 함수가 완료될 때 까지 다음 라인으로 넘어가지 않음.

 

순차적 프로그래밍처럼 작성 가능.

 

async 함수는 return 은 promise

 

 

 

  • Async 함수의 오류처리

  • Promise의 병렬 실행

 

 

 

promise1 과 promise2 는 각 1초, 2초가 소요되는 비동기 함수

 

sync 예제에서는 3초의 시간이 소요.

 

parallel 예제에서는 2초의 시간이 소요.

 

Promise.all은 Promise 함수를 동시에 실행시키고 등록된 모든 함수가 마무리되면 결과값을 한꺼번에 반환.

 

 

 

 

  • 비동기 코딩 정리

callback 지옥 -> promise chaining 으로 해결

promise 지옥 -> async-await 으로 해결

 

현대 JavaScript 에서는 대부분 가독성이 좋은 async-await 을 지향하지만, 특정 상황에 맞는 비동기 코딩 방법들을 구사할 줄 알아야 함.

 

심화-이벤트 루프

 

  • 이벤트 루프란?

: 이벤트(event)를 처리하는 반복되는 동작 (loop); 즉, Node.js가 비동기-이벤트 동작을 처리하는 일련의 반복 동작. 

  비동기 코딩이 어떤 순서로 수행되는지에 대해 이해할 수 있음.

  • 브라우저와 Node.js의 이벤트 루프

: 이벤트 루프는 Node.js 만의 특징은 아님. JavaScript 의 일반적인 동작 방식으로, 브라우저에도 있음. 브라우저와 Node.js의 이벤트 루프는 기본적인 동작 방식에 큰 차이가 없음. 이벤트 루프의 기본적인 동작 원리를 이해하는 것이 중요.

  • 이벤트 루프-구성 요소

  • 이벤트 루프 - 콜스택 작동 순서 (콜스택이 비어있을 때까지 스택의 함수를 실행)

  • 이벤트 루프-메시지큐의 작동 순서 (콜스택이 비어있을 경우 등록된 함수를 콜스택에 추가)

  • 이벤트 루프 -잡큐의 작동 순서 (콜스택이 비어있을 경우 등록된 함수를 콜스택에 추가)

  • 이벤트 루프 정리

-이벤트 루프는 비동기 동작의 실행 타이밍을 이해하는 것이 중요

-setTimeout 은 콜스택이 비어있을 때 실행 됨

-Promise 는 상위 함수가 종료되기 전에 실행 됨

'JavaScript' 카테고리의 다른 글

[JS] Node.js 와 MongoDB II  (0) 2022.10.20
[JS] Node.js (2)  (0) 2022.10.13
[JavaScript] 비동기 (2)  (0) 2022.10.06
[JS] 자료구조와 에러처리  (0) 2022.10.05
[JS] 비동기  (0) 2022.10.04