1장. 노드 시작하기

Doozuu·2023년 4월 17일
0

Node.js

목록 보기
1/6

1.1 핵심 개념 이해하기

Node.js란?

Chrome V8 Javascript 엔진으로 빌드된 자바스크립트 런타임이다.


노드의 용도

노드를 서버로 실행할 수도 있고, 서버 외의 자바스크립트 프로그램을 실행하는 런타임으로 사용할 수도 있다.

서버란?

네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 뜻한다. 클라이언트는 요청을 보내는 주체로 브라우저일 수도 있고, 데스크톱 프로그램일 수도 있고, 모바일 앱일 수도 있고, 다른 서버에 요청을 보내는 서버일 수도 있다.

런타임이란?

특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻한다.
기존에는 자바스크립트 프로그램을 웹 브라우저 위에서만 실행할 수 있었다. (브라우저가 자바스크립트 런타임을 내장하고 있기 때문) 브라우저 외의 환경에서 자바스크립트를 실행하기 위한 시도들이 있었으나 속도 문제때문에 큰 호응을 받지 못했는데, Chrome V8 엔진이 나오면서 속도 문제가 개선되었다.


노드는 V8과 더불어 libuv 라이브러리를 사용한다.

libuv 라이브러리는 노드의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현한다.

이벤트 기반이란?

이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.
이벤트로는 클릭이나 네트워크 요청 등이 있을 수 있다.
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해둬야 한다. 이를 이벤트 리스너에 콜백 함수를 등록한다고 표현한다.

이벤트 기반 모델에서는 이벤트 루프라는 개념이 등장한다.
여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 이벤트 루프가 판단한다. 이벤트 루프는 호출 스택이 비어 있을 때만 태스크 큐에 있는 함수를 호출 스택으로 가져온다. 이것이 setTimeout의 시간이 정확하지 않을 수도 있는 이유다.

논블로킹 I/O이란?

작업에는 두 가지 종류가 있는데, 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업이 있다.

  • 기본적으로 자바스크립트 코드는 동시에 실행될 수 없지만, 자바스크립트상에서 돌아가는 것이 아닌 I/O 작업 같은 것은 동시에 처리될 수 있다.
    I/O에서 I는 Input, O는 Output을 의미한다. 파일 시스템 접근이나 네트워크를 통한 요청 같은 작업이 I/O의 일종이다.

  • 이러한 작업을 할 때 노드는 논블로킹 방식으로 처리하는 방법을 제공한다.
    논블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미한다. 반대로 블로킹은 이전 작업이 끝나야만 다음 작업을 수행하는 것을 의미한다.
    따라서 논블로킹 방식을 이용해 동시에 처리될 수 있는 작업들은 최대한 묶어서 백그라운드로 넘기면 시간을 절약할 수 있다.(성능 개선 효과)
  • setTimeout(콜백, 0)은 코드를 논블로킹으로 만들기 위해 사용하는 기법 중 하나이다. 동시 처리가 가능한 I/O 작업이 있을 때 논블로킹 처리하여 효율적으로 작업할 수 있다.

이벤트 기반, 논블로킹 모델과 더불어 노드를 설명할 때 자주 나오는 용어로 싱글 스레드가 있다.

싱글 스레드

싱글 스레드란 스레드가 하나뿐이라는 것을 의미한다.
스레드를 이해하기 위해서는 프로세스부터 알아야 한다.

  • 프로세스 : 운영체제에서 할당하는 작업의 단위.
    프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다.
  • 스레드 : 프로세스 내에서 실행되는 흐름의 단위.
    작업을 처리하는 일손으로 표현하기도 한다.

노드 프로세스의 내부에는 여러 스레드가 있지만, 그중에서 우리가 직접 제어할 수 있는 스레드는 하나뿐이기 때문에 노드가 싱글 스레드라고 여겨진다.



1.2 서버로서의 노드

노드는 기본적으로 싱글 스레드, 논블로킹 모델을 사용하므로 노드 서버 또한 동일한 모델일 수밖에 없다.

  • 노드는 libuv 라이브러리를 사용해 I/O 작업을 논블로킹 방식으로 처리한다. 따라서 스레드 하나가 많은 수의 I/O를 혼자서도 감당할 수 있다.
  • 노드는 CPU 부하가 큰 작업에는 적합하지 않다. 작성한 코드가 모두 스레드 하나에서 처리되기 때문에 코드가 CPU 연산을 많이 요구하면 스레드 하나가 혼자서 감당하기 어렵다.

이와 같은 특성 때문으로 인해 노드는 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는 데 적합하다.
ex. 실시간 채팅 애플리케이션, 주식 차트, JSON 데이터를 제공하는 API 서버

싱글 스레드 방식의 프로그래밍은 멀티 스레드 방식보다 상대적으로 쉬우므로 서버 프로그래밍에 익숙하지 않은 사람도 쉽게 입문할 수 있다.
다만, 싱글 스레드 방식으로 서버를 운영할 때는 하나뿐인 스레드가 에러로 인해 멈추지 않도록 잘 관리해야 한다. 에러를 잘 처리하지 못하면 하나뿐인 스레드가 죽게 되어 서버 전체가 멈추기 때문이다.


노드의 장단점

장점 : 자바스크립트를 언어로 사용하기 때문에 하나의 언어로 웹 사이트를 개발할 수 있다는 장점이 있다. 개발 생산성이 높아진다.
단점 : 다른 웹 서버에 비해 속도가 느리다.



1.3 서버 외의 노드

처음에는 노드를 대부분 서버로 사용했지만, 노드는 자바스크립트 런타임이므로 용도가 서버로만 국한되지 않는다. 사용 범위가 점점 확장되서 웹, 모바일, 데스크톱 애플리케이션 개발에도 사용되기 시작했다.

노드 기반으로 돌아가는 대표적인 웹 프레임워크로는 Angular, React, Vue 등이 있다.



1.4 설치(Mac)

노드 공식 사이트에서 Current 버전으로 설치한다.
터미널에서 아래 명령어를 입력해 잘 설치되었는지 확인한다.

node -v
npm -v

터미널을 통해 노드를 설치하고 싶으면 Homebrew를 사용하면 된다.

profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글