05-01 Node.js 기초

.·2022년 2월 14일

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

어떤 모듈을 사용해야 할까

0개의 댓글