01 Node.js 이해하기
Node.js 이해
- Node.js는 자바스크립트를 어느 환경에서나 실행해주는 실행기
- 크로스 플랫폼 실행
- 제한 없는 동작
- 다양한 어플리케이션 개발
Node.js 특징
Node.js의 특징 한 줄 요약
쓰레드란?
- 쓰레드란 명령을 실행하는 단위
한 개의 쓰레드는 한 번에 한 가지 동작만 실행 가능
싱글 쓰레드와 멀티 쓰레드의 차이점

싱글 쓰레드 장단점
- 장점 : 쓰레드가 늘어나지 않기 때문에 리소스 관리에 효율적
- 단점 : 쓰레드 기반의 작업들의 효율이 떨어짐 Ex) CPU 연산 작업
그래서 Node.js는 비동기 동작으로 쓰레드 기반의 작업을 최소화합니다.
이벤트 기반이란?
- 비동기 동작의 완료를 처리하는 방법
- 비동기 방식은 특정 동작을 실행한 후, 해당 동작을 전혀 신경 쓰지 않는다.
- 대신 해당 동작이 완료될 경우 실행할 함수를 미리 등록한다.
- 비동기 동작이 완료가 되면 미리 등록된 함수를 실행한다.
요약
- 싱글 쓰레드이기 때문에 비동기 동작이 필요
- 비동기 동작을 구현하기 위해 이벤트 기반
ES6
ES6란?
- ECMAScript 버전 6 이후를 통틀어 일반적으로 ES6라고 부름
- ECMAScript란 계속해서 발전해가는 자바스크립트의 표준 문법
Node.js와 ES6
- Node.js는 ES6의 모든 문법을 지원하지는 않는다.
자주 사용되는 문법 1 - let, const

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

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

자주 사용되는 문법 4 - class

자주 사용되는 문법 5 - destructing

- 기존 문법에서는 값을 꺼내기 위해선 하나씩 지정해서 변수에 저장했어야 했음
- ES6에서는 object와 배열의 값을 쉽게 꺼낼 수 있음
비동기 코딩
비동기 코딩이란?
- 비동기-이벤트 기반 동작을 코드로 구현하는 방법
Node.js에서 비동기 동작을 구현하는 세 가지 방법을 학습
비동기 코딩의 세가지 방법
- Callback : 전통적인 자바스크립트의 이벤트 기반 코딩 방식
- Promise : callback의 단점을 보완한 비동기 코딩 방식
- Async-Awati : promise의 단점을 보완한 비동기 코딩 방식
Callback

- getUsers의 인자로 전달되는 함수가 getUsers를 실행할 때 등록되는 이벤트 함수
콜백 지옥

Promise의 등장

- Promise는 then에 등록되는 콜백함수의 반환값으로 다시 Promise를 사용하면, 같은 레벨로 비동기 동작을 동기적으로 실행할 수 있게 되므로, 이를 이용해 callback 지옥에서 탈출할 수 있음
- getUsersPromise의 결과값으로 then의 users로 받을 수 있다.
- 다시 then에 등록된 콜백함수의 return값으로 promise1을 사용하면
promise1의 결과값은 같은 레벨의 then으로 처리된 콜백함수로 전달된다.
callback 기반 함수를 Promise 함수로 변경하는 방법

Async-Await의 등장

Async함수의 오류처리

Promise의 병렬 실행

심화 - 이벤트 루프
이벤트 루프란?
- 이벤트(event)를 처리하는 반복되는 동작(loop)
이벤트 루프 - 구성요소

이벤트 루프 - 콜스택 작동 순서

- A함수가 실행 => 그 안에서 B함수 실행 => 그 안에서 C함수 실행 => C함수 마무리 => B함수 마무리 => D함수 실행 => D함수 마무리 => A함수 마무리
이벤트 루프 - 메시지큐의 작동 순서

- C 함수가 타임아웃으로 등록된 지연실행 함수라고 가정
- A함수 실행 => B함수 실행 => C함수의 차례지만 타임아웃에 등록된 C함수는 바로 실행되지 않고 메시지큐로 넘어감 => B함수 마무리 => D함수 실행 => D함수 마무리 =>A함수 마무리 => 콜스택이 비어있는 것을 확인한 후 메시지큐는 콜스택에 C함수를 전달
이벤트 루프 - 잡큐의 작동 순서

- C 함수가 Promise
- C 함수는 Promise기 때문에 바로 실행되지 않고 잡 큐에 전달
- B 함수가 종료될 순서지만 B함수가 종료되기 전에 C함수는 B함수를 상위함수로 갖고 있기 때문에 잡큐는 콜스택에 C함수를 전달하고 실행
이벤트 루프 정리
- 이벤트 루프는 비동기 동작의 실행 타이밍을 이해하는 것이 중요
- setTimeout은 콜스택이 비어있을 때 실행 됨
- Promise는 상위함수가 종료되기 전에 실행 됨
NPM과 모듈
NPM 이해하기
NPM이란?
- Node Package Manager
- Node.js 프로젝트를 관리하는 필수적인 도구
- 온라인 저장소 + 커맨드라인 도구
NPM 온라인 저장소
- 수많은 오픈소스 라이브러리와 도구들이 업로드 되는 저장소
- 거대한 생태계 보유
- 필요한 라이브러리나 도구를 손쉽게 검색 가능
커맨드라인 도구
NPM 사용해 보기
NPM을 사용한다는 것은?
- NPM 커맨드라인 도구의 사용법을 익히는 것
- 프로젝트의 생성부터 다양한 기능을 사용하는 법까지 학습
프로젝트 생성하기


package.json
- 프로젝트 관련 정보들이 저장되는 파일
- 이 파일을 직접 수정하거나 npm 명령어를 사용하여 프로젝트 정보를 수정할 수 있음

의존성 관리하기
- 프로젝트 내에서 사용하는 라이브러리를 관리하는 방법
- 프로젝트가 실행되기 위해 라이브러리에 의존하기 때문에 이러한 라이브러리들을 dependency(의존성)라고 이야기함
라이브러리란?
- 특정 기능을 수행하는 코드의 묶음
- Node.js에서는 패키지라고 부르기도함
npm install 명령어

프로젝트에 의존성 추가하기

dependencies와 devDependencies

프로젝트에 의존성 내려받기

개발용 의존성을 제외하고 내려받기

의존성 버전 표기법

- ~를 사용하면 가장 오른쪽에 있는 버전을 제외하고 앞은 항상 고정
- ^은 가장 왼쪽의 0이 아닌 버전을 고정
- 아무것도 없으면 해당 버전만 설치
pacakge-lock.json
- 프로젝트에 의존성을 추가하면 package-lock.json이라는 파일이 생성된다.
- 프로젝트에 의존성을 추가하면 자동으로 '^최신버전'으로 추가가 되는데,
의존성 버전이 갑자기 변경되지 않도록, 설치된 버전을 고정하는 역할을 한다.
전역 패키지 추가

로컬 패키지와 전역 패키지
- 로컬 패키지 : package.json에 선언되어 있고, node_modules에 저장된 패키지
- 전역 패키지 : npm install -g를 통해 내려받아, 전역 패키지 저장소에 저장된 패키지
- 전역 패키지도 프로젝트에서 사용할 수 있으나, 프로젝트의 의존성이 package.json 내에 명시적으로 선언되어 있는 것이
프로젝트 관리의 좋은 방향
의존성 삭제하기

스크립트 실행하기
- 스크립트란 간단한 동작을 수행하는 코드
- package.json의 scripts에 선언된 스크립트를
npm run [script-name] 명령어로 실행할 수 있다.

npm script를 사용하는 이유

자주 사용되는 스크립트
- npm 스크립트엔 run을 제외하고 사용할 수 있는 주요 스크립트들이 있다.
- test : 코드 유닛 테스트 등에 사용
- start : 프로젝트 실행
- stop : 프로젝트 종료
- run을 제외하고 사용할 수 있을 뿐, npm 내부적으로 코드를 제공해 주는 것은 아님
NPM 요약

NPX
NPX란?

- napm 패키지를 설치하지 않고 사용할 수 있게 해주는 도구
- 프로젝트에 추가하거나 전역 패키지로 추가하지 않고, npx를 이용하여 바로 실행할 수 있음
- 자주 사용되지 않지만 한 번씩 사용해야하는 npm 패키지들은 npx로 쉽고 빠르게 이용 가능
NPX - Node.js 특정 버전으로 실행

NPX - github gist 코드 실행

Node.js의 모듈
모듈이란?
- 프로젝트가 커지면 기능에 맞게 코드를 분리하는 것이 중요
- 모듈은 코드를 분리하기 위한 방법
모듈 사용 예

모듈과 패키지
- Node.js에서 패키지는 모듈의 모음이라고 생각해도 무방
- npm 패키지들은 많은 모듈을 포함하고 있는 코드 모음
Node.js의 기본 제공 모듈 - console
- 브라우저에서 제공되는 console과 유사한 디버깅 도구
- log, warn, error 함수로 로그 레벨 표시
- time, timeLog, timeENd 함수로 시간 추적
Node.js의 기본 제공 모듈 - process
- 현재 실행포르세스 관련 기능 제공
- arch, argv, env 등 실행 환경 및 변수 관련 값 제공
- abort, kill, exit 등 프로세스 동작 관련 함수 제공
Node.js의 기본 제공 모듈 - fs
- 파일 입출력을 하기 위해 사용
- readFile, writeFile 함수로 **파일 읽기, 쓰기
- Sync 함수 제공. 동기 동작
- watch로 파일/디렉터리 변경 이벤트 감지
#### Node.js의 기본 제공 모듈 - http
- http 서버, 클라이언트를 위해 사용
- createServer 함수로 서버 생성
- Request 함수로 http 요청 생성
모듈의 작성과 사용
모듈의 기본적인 작성법


변수명으로 export하는 모듈 작성법


함수를 export하는 모듈 작성법


모듈의 사용 방법
- require 함수를 통해 모듈을 load 할 수 있음
- C에서 include, Java에서 import와 유사
- 의존성 패키지, 직접 작성한 모듈 사용 가능
모듈의 사용 방법 - require 동작의 이해
- requre 할 때 모듈 코드가 실행된다.
- Node.js의 모듈은 첫 require 시에 cache, 두 번 실행하지 않는다.(메모리에 캐시된 모듈을 가져다 씀)
- 모듈 코드를 **여러 번 실행하기 위해선 함수 모듈로 작성
모듈의 사용 방법 - npm 패키지

모듈의 사용 방법 - 직접 작성한 모듈

모듈의 사용 방법 - 함수형 모듈

모듈의 사용 방법 - json 파일

모듈의 작성과 사용 요약
- module.exports를 사용하여 모듈을 작성할 수 있음
- require를 사용하여 의존성 패키지, 모듈, json 파일을 사용할 수 있음
- 모듈은 첫 require 시에만 실행하고 cache 되므로
여러 번 실행할 모듈은 함수형으로 작성해야함
심화 - ES Module
ES Module

ES Module과 commonjs

어떤 모듈을 사용해야 할까
