본문 바로가기

개발몰입과정 개념스터디/1차

Node.js란?

Node.js란?

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

Node.js는 Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임이다.

  • 런타임 : 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 뜻한다.

⇒ node.js는 단일쓰레드 이벤트 루프 기반 비동기방식이다.

 

1. javascript vs node.js

javascript 스크립트 언어는 특정한 프로그램 안에서 동작하는 프로그램이기 때문에 웹 브라우저 프로그램 안에서만 동작을 한다. 즉 웹 브라우저 안에서만 실행하기 때문에 javaScript를 웹 브라우저에서 독립시킨 node.js가 나왔다.

node.js는 javaScript 문법을 사용하지만 javascript를 웹 브라우저에서 독립시킨 것으로 Node.js를 설치하게 되면 터미널 프로그램에서 브라우저 없이 바로 실행할 수 있다.

 

2. Non-blocking I/O

  • 단일쓰레드 이벤트 루프 기반 비동기방식( Non-Blocking I/O) = Asynchronous
    • 하나의 쓰레드가 request를 받으면 바로 다음 처리에 요청을 보내놓고 다른 작업을 처리하다가 먼저 요청한 작업이 끝나면 이벤트를 받아서 응답을 보낸다.
    • 동시 request가 오더라도 처리가 완료될때까지 기다리지 않아도 되기 때문에 서버 부하가 적다.
  • 쓰레드 기반 동기방식(Blocking I/O)이란? = Synchronous
    • 하나의 쓰레드가 request를 받으면 모든 처리가 완료될때까지 기다리다가 처리결과가 완료되면 다시 응답을 보낸다.
    • 요청이 오면 반드시 결과를 받은 후에 다음 로직이 처리될 수 있다.
    • 기존 업무 처리가 완료되기 전에 또다른 request가 있으면 새로운 쓰레드가 업무를 처리한다.
    • 동시 request가 많은 경우 많은 쓰레드가 필요하게 되어 서버 과부하 
      node.js는 asynchronous이지만 단일쓰레드이기 때문에 request2, response2가 없다.

 

3. 이벤트 기반

이벤트기반이란 이벤트가 일어날때 미리 정해둔 작업을 수행한다.

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

 

이벤트 루프

이벤트 루프(event loop) : 여러 이벤트가 동시에 발생했을 때 이벤트 루프가 콜백 함수 호출 순서를 판단한다.

[출처] https://hanamon.kr/nodejs-개념-이해하기/

 

 


 

node.js 장점

  • 자바스크립트를 사용해서 서버단 로직을 처리
  • 새로운 언어를 습득하지 않고 자바스크립트를 활용해 서버기술을 빨리 개발/응용
  • 개발이 빠르고 쉽다. 서버 설치부터 화면 띄우는 것까지 금방 처리 됨.
  • Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능
  • 로컬에서 서버만 켜봐도 얼마나 가볍게 돌아가는지 알 수 있다.
  • 이벤트 기반 비동기방식이라 서버 무리가 적다.
  • npm(node package manager)을 통한 다양한 모듈(패키지) 제공npm을 이용해 자신이 필요한 라이브러리와 패키지를 검색해서 설치하고 사용할 수 있기 때문에 개발속도와 효율성이 크게 향상

node.js 단점

  • 이벤트 기반 비동기방식이라 서버단 로직이 복잡한 경우 콜백함수의 늪에 빠질 수 있다.
  • 예를 들어, 한번의 요청에 대해 DB에서 조회한 결과값에 따라 다른 로직을 처리해야 하며, 이런 로직이 여러개인 경우 콜백함수 늪 (Callback Hell) 에 빠진다.
  • 코드를 순차적으로 실행하는 것이 아니라 비동기 방식으로 이벤트를 보내고, 응답(이벤트)이 오면 처리하는 방식이기 때문에 java 개발을 했던 방식(쓰레드 기반 동기방식)으로 설계하고 프로그래밍하면 큰 문제가 발생한다.
  • 단일 쓰레드(Single Thread)이기 때문에 하나의 작업 자체가 많이 걸리는 웹서비스에는 어울리지 않다. 게시판형태와 같이 가벼운 I/O가 많은 웹서비스에 어울린다.
  • 코드가 수행되어야 코드에 에러가 있는지 알 수 있으며, 에러가 날 경우 프로세스가 내려가기 때문에 테스트가 엄청 중요하다. 반드시 모든 케이스에 대해 소스코드를 검증해야 한다.

 

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

간단한 로직, 대용량 요청, 빠른 응답시간을 요구 (ex_채팅서비스, 스트리밍 서비스, 주식차트)

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

  • 단일 처리가 오래 걸리는 경우 : 싱글 쓰레드이기 때문
  • 서버 체크로직이 많은 경우 : 비동기방식이기 때문에 CallBack Hell에 빠지지 않기 위해
  • 업무 복잡도/난이도가 높은 경우 : 에러가 나면 서버가 죽기 때문에 코드 품질 중요

 

 


[참고]

https://perfectacle.github.io/2017/06/18/what-is-node-js/

https://junspapa-itdev.tistory.com/3

https://hanamon.kr/nodejs-개념-이해하기/

 

'개발몰입과정 개념스터디 > 1차' 카테고리의 다른 글

Node.js의 framework  (0) 2022.02.04
REST API란?  (0) 2022.02.04
프레임워크 vs 라이브러리  (0) 2022.02.04
정적 타입 언어 vs 동적 타입 언어  (0) 2022.02.04
NPM과 Yarn  (0) 2022.02.04