Node.js

babypig·2022년 8월 31일
1

Node.js

목록 보기
1/12

Node.js

Node.js 공식 사이트에서는 이처럼 설명하고 있습니다.

Node.js®는 Chrome *V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다.
- V8 이란? 크롬에 탑재된 자바스크립트 엔진

  • Node.js 는 대용량 서비스를 위해 Ryan Lienhart Dahl 이 개발하였다.
  • Node.js 는 웹서버가 아니며 Node 자체로는 아무것도 하지 않음.
  • Node.js 는 그저 코드를 실행할 수 있는 하나의 방법에 불과한 *JavaScript 런타임이다.
    - JavaScript 런타임 이란 자바스크립트가 구동되는 환경을 말한다.
  • Node.js 는 웹서버와 같이 확장성 있는 네트워크 프로그램을 제작하기 위해 만들어졌다.

Node.js는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용하며 논블로킹(Non-blocking)I/O와 단일 스레드 *이벤트 루프를 통한 높은 처리 성능을 가지고 있다.

이벤트 루프(Envet Loop) 는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출할지를 이벤트 루프가 판단하며 Node.js는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 Loop라고 부른다

내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도의 소프트웨어 없이 동작하는 것이 가능하며 이를 통해 웹 서버의 동작에 있어 더 많은 통제를 가능케 한다.

📍 Node.js 특징

  1. Event Driven 아키텍처
  2. Single Thread 기반
  3. Non Blocking I/O 모델

Single Thread 기반인데 어떻게 Non Blocking I/O를 제공할 수 있나 ❓

  • 그 해답은 Event Loop를 추상화하여 제공하는 libuv 라는 library에 있다.
    libuv는 *비동기 입출력, 이벤트 기반에 초점을 맞춘 라이브러리이며,
    비동기, 논블로킹 스타일을 사용한다.
    -비동기란 이전 작업이 완료될 때까지 대기하지 않고 동시에 작업을 수행한다.
    -반대로 동기는 이전 작업이 끝나야만 다음 작업을 수행한다.

✅ Event Driven

-이벤트 기반(Event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.

  • 즉, 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수를 등록한다.
  • 이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하며, 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기한다.

✅ Single Thread

  • 자바스크립트 코드는 동시에 실행될 수 없는데 그 이유는 Node.js가 싱글 스레드 기반이기 때문이다.
  • Node.js는 싱글스레드, 논 블로킹 모델로 싱글 스레드가 혼자서 일을 처리하지만 들어오는 요청 순서가 아닌 논 블로킹 방식으로 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행한다.
  • 프로세스: 운영체제에서 할당하는 작업의 단위이다. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스이다. 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.
  • 스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위이다. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유한다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.

✅ 논블로킹(Non-blocking)I/O

  • 이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있다.
  • 작업에는 두 가지 종류가 있는데 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업이다.
  • 특히 파일 시스템 접근, 네트워크를 통한 요청 작업은 입력(Input)/출력(Output)의 일종이며, 이러한 작업을 할 때 노드는 비동기 방식으로 블로킹을 만들지 않게 끔(논 블로킹) 처리한다.
  • 즉 함수 호출 시 당장 실행하는 것이 아니라(동기→블로킹) 일단 어느 곳에 쌓아 놓고 동시에 요청을 처리하고(비동기→논 블로킹) 요청이 완료된 순서대로처리(스택 이용) 한다는 말이다.

📝 정리

노드는 기본적으로 싱글 스레드, 논 블로킹 모델을 채용하므로 I/O 요청이 많이 발생하면 노드를 서버로 사용하는 것이 좋다. 하지만 노드는 CPU 부하가 큰 작업에는 적합하지 않다.
우리가 작성하는 코드는 모두 스레드 하나에서 처리되기 때문에 코드가 CPU 연산을 많이 요구하면 스레드 하나가 혼자서 감당하기 어렵다.
즉, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는데 노드는 적합하다. 예를 들어 네트워트나 데이터베이스, 디스크 작업 같은 I/O에 특화되어있다. 실시간 채팅 애플리케이션, 주식 차트도 포함된다.

👍 장점

  1. 멀티 스레드 방식에 비해 적은 컴퓨터 자원을 사용한다
  2. I/O 작업이 많은 서버로 적합하다
  3. 웹 서버가 내장되어 있어 별도의 웹서버를 설치할 필요가 없다
  4. 자바스크립트를 사용하기 때문에 JSON 형식과 쉽게 호환된다.

Node.js 가 어울리는 웹서비스

  • 간단한 로직.

  • 대용량(동시에 여러 request를 처리)

  • 빠른 응답시간 요구

  • 빠른 개발 요구

  • 비동기방식에 어울리는 서비스(네트워크 스트리밍 서비스, 채팅 서비스 등)


👎 단점

  1. 하나의 작업이 시간이 많이 걸리면 전체 시스템의 성능이 급격하게 떨어진다.
  2. 스크립트 언어의 특성 상 해당 언어가 수행되어야 에러가 나는지 확인할 수 있고, 에러가 날 경우 프로세스가 종료된다.
  3. 이벤트 기반 비동기방식이라 서버단 로직이 복잡한 경우 콜백함수의 늪에 빠질 수 있다.

Node.js 가 어울리는 않는 웹서비스

  • 단일 처리가 오래 걸리는 경우 : 싱글 쓰레드이기 때문

  • 서버 체크로직이 많은 경우 : 비동기방식이기 때문에 CallBack Hell에 빠지지 않기 위해

  • 업무 복잡도/난이도가 높은 경우 : 에러가 나면 서버가 죽기 때문에 코드 품질 중요


profile
babypig

0개의 댓글