정골라코딩
[JS] Node.js 와 MongDB I 본문
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 |