본문 바로가기

node.js

[Node.js] Node.js란? 개념 및 장단점

Node.js

Node.js는 서버 측에서 JavaScript를 실행할 수 있는 런타임 환경입니다.
JavaScript는 주로 클라이언트 측 웹 브라우저에서 사용되었지만, Node.js의 등장으로 JavaScript를 서버에서도 사용할 수 있게 되었습니다.

Node.js의 편리성

1) back-end 부터 front-end까지 JavaScrpit로

기존 JavaScript는 웹 페이지의 동적인 기능을 구현하는 데 사용되었으며, 주로 프론트엔드(클라이언트 측)에서 사용되었습니다.
Node.js가 등장하기 전에는 프론트는 JavaScript로 개발하되, 백앤드의 경우 Java, C#, php등의 언어들을 사용하여 애플리케이션을 개발하였습니다. 즉, 백앤드 개발 언어와 프론트 언어 개발 언어가 상이했습니다.

Node.js의 등장으로 JavaScript를 백엔드에서도 사용할 수 있게 되어 웹 개발에서의 통일성과 효율성이 더욱 향상되었습니다.
이로 인해 웹 개발에서 전체적인 통일성이 높아지고, JavaScript로 전체 웹 애플리케이션을 구축하는 것이 가능해졌습니다.

2) 비동기성과 Non-blocking I/O

Node.js는 비동기성, Non-blocking I/O 모델을 사용합니다.

* 비동기성 (Asynchronous)

비동기성은 Node.js가 하나의 요청이 완료될 때까지 기다리지 않고 다른 작업을 처리할 수 있는 능력을 의미합니다. 즉, 요청을 처리하는 동안 다른 작업을 실행할 수 있으므로, 블로킹이 발생하지 않고 다른 요청들을 동시에 처리할 수 있습니다.

예를 들어, 파일을 읽거나 네트워크 요청을 보내는 작업은 시간이 오래 걸릴 수 있습니다. 기존의 동기적인 방식에서는 이러한 작업을 기다려야 하지만, 비동기적인 방식에서는 요청을 보낸 후에도 다른 작업을 수행하며, 해당 작업이 완료되면 콜백 함수를 호출하여 결과를 처리합니다.

* Non-blocking I/O 모델

Node.js는 Non-blocking I/O 모델을 채택하여 입출력 작업을 비동기적으로 처리합니다.

I/O 작업은 파일 시스템 액세스, 네트워크 요청, 데이터베이스 쿼리 등을 포함하는데, 

기존의 블로킹 I/O 모델에서는 입출력 작업이 완료될 때까지 해당 스레드가 블로킹되어 다른 작업을 수행할 수 없게 됩니다. 이러한 방식은 대용량 요청 처리에 적합하지 않고, 많은 스레드를 필요로 하여 메모리 사용량이 늘어나는 단점이 있습니다.

하지만 Node.js의 Non-blocking I/O 모델에서는 입출력 작업이 요청되면 해당 작업을 백그라운드에서 비동기적으로 처리하고, 다음 작업으로 넘어가며 기다리지 않습니다. 작업이 완료되면 이벤트 루프를 통해 결과를 처리합니다.

 

이를 통해 Node.js는 단일 스레드로 많은 요청을 동시에 처리할 수 있으며, 높은 성능을 유지할 수 있습니다.

비동기성과 Non-blocking I/O 모델을 활용하여 Node.js는 높은 처리량과 확장성을 가진 웹 애플리케이션을 구축하는 데 적합한 환경을 제공합니다.

즉, 입출력 작업을 기다리지 않고도 다른 작업을 처리할 수 있게 하므로 성능이 빠릅니다.

 

여기서 Non-blocking I/O, blocking I/O 에 대해서 조금 더 알아보도록 하겠습니다.

 

=> ** Non-blocking I/O, blocking I/O 비교

<상황 가정>

1. A 요청이 먼저 들어옵니다. A 요청은 처리에 시간이 오래 걸리는 요청입니다.
2. B 요청이 그 다음에 들어옵니다. B 요청은 처리가 빨리 끝나는 요청입니다.


블로킹 I/O 동작

1. A 요청이 먼저 처리되고, I/O 작업이 완료될 때까지 다른 요청은 대기
2.  B 요청은 A 요청이 완료될 때까지 기다려야 함

Non-blocking I/O 동작

1. A 요청이 처리되는 동안, 서버는 B 요청을 기다리지 않고 동시에 처리
2. A 요청의 I/O 작업이 완료되지 않아도 B 요청은 I/O 작업이 끝나기를 기다리지 않음
=> B 요청은 A 요청과 관계없이 빠르게 처리되며, 지연 없이 결과를 반환합니다.

 

 

- 블로킹 I/O 모델에서는 하나의 I/O 작업이 끝날 때까지 다른 작업들이 기다려야 하기 때문에, 처리 시간이 긴 A 요청 때문에 다른 요청들이 블로킹되어 지연이 발생
- 반면에 Non-blocking I/O 모델에서는 I/O 작업이 끝날 때까지 기다리지 않고 다른 작업을 계속해서 처리할 수 있기 때문에, 처리 시간이 긴 A 요청이 다른 요청에 영향을 주지 않음

따라서,

Non-blocking I/O 모델은 높은 동시 접속자 수를 처리하는 상황에서 유용하며, 빠른 응답 시간과 높은 성능을 제공하는 데 도움이 됩니다. 

예) 동시다발적 요청이 매우 많은 채팅, SNS서비스 등의 처리에 적합,

      요청이 많거나 오래걸리는 요청으로 인한 부하나 요청 대기시간 발생 x

블로킹 I/O 모델은 하나의 요청이 끝날 때까지 다른 요청들이 기다려야 하기 때문에, 많은 요청을 처리하는 경우 지연과 성능 저하가 발생할 수 있습니다.

 

 

 

 

Node.js (서버) 와 기존 JavaScript(클라이언트 )의 차이점

특성 기존 JavaScript Node.js
실행 환경 클라이언트 측 웹 브라우저 서버 측 JavaScript 런타임
비동기성 동기적 비동기적
모듈 시스템 내장 모듈 시스템 없음 CommonJS 모듈 시스템 사용
파일 시스템 액세스 로컬 파일 시스템 액세스 제한 서버 측에서 파일 시스템 액세스 가능
네트워킹 클라이언트-서버 간 제약 있음 서버에서 다양한 네트워크 통신 지원

1. 실행 환경

  • 기존 JavaScript: 기존의 JavaScript는 주로 클라이언트 측 웹 브라우저에서 실행됩니다.
  • Node.js: Node.js는 서버 측에서 실행되는 JavaScript 런타임 환경입니다.

2. 비동기성

  • 기존 JavaScript: 클라이언트 측 JavaScript는 주로 동기적으로 동작합니다.
  • Node.js: Node.js는 비동기적으로 동작합니다. 즉, Non-blocking I/O 모델을 사용하여 입출력 작업을 기다리지 않고 여러 작업을 동시에 수행할 수 있습니다.

3. 모듈 시스템

  • 기존 JavaScript: 기존의 JavaScript는 모듈 시스템을 내장하고 있지 않아서 스크립트들이 전역 스코프를 공유합니다.
  • Node.js: Node.js는 CommonJS 형식의 모듈 시스템을 사용합니다. 모듈별로 자체 스코프를 가지므로, 변수와 함수가 다른 모듈들과 격리되어 이름 충돌을 피할 수 있습니다.

4. 파일 시스템 액세스

  • 기존 JavaScript: 기존 JavaScript는 클라이언트 측에서는 보안 상의 이유로 로컬 파일 시스템에 직접적인 액세스를 허용하지 않습니다.
  • Node.js: Node.js는 서버 측에서 파일 시스템에 직접 액세스할 수 있으므로, 서버 애플리케이션에서 파일 관리가 필요한 경우 유용합니다.

5. 네트워킹

  • 기존 JavaScript: 기존 JavaScript는 클라이언트-서버 간의 네트워크 통신을 담당하는데 제약이 있습니다.
  • Node.js: Node.js는 서버에서 네트워크 통신을 다루기 쉽도록 설계되어 있으며, HTTP를 비롯한 다양한 프로토콜을 지원합니다.

 

 

장점

Node.js는 아래와 같은 장점이 있습니다.

  • 하나의 언어로 클라이언트와 서버를 모두 개발할 수 있어 개발 생산성이 향상됩니다.
  • 비동기적인 특성으로 인해 확장성이 높고, 동시 접속자에 대한 처리가 용이합니다.
  • 큰 커뮤니티와 많은 라이브러리와 모듈이 제공되어 개발이 용이합니다

단점

  • 이벤트 기반 비동기방식이므로 서버단 로직이 복잡한 경우 콜백함수의 늪에 빠질 수 있습니다.
    예를 들어, 한번의 요청에 대해 DB에서 조회한 결과값에 따라 다른 로직을 처리해야 하며, 이런 로직이 여러개인 경우 콜백함수 늪 (Callback Hell) 에 빠지게됩니다.
  • 싱글 쓰레드(Single Thread)이기 때문에 하나의 작업 자체가 많이 걸리는 웹서비스에는 적합하지 않습니다.
    게시판형태와 같이 가벼운 I/O가 많은 웹서비스에 어울린다.
  • 코드가 수행되어야 코드에 에러가 있는지 알 수 있습니다.

 

 

오늘은 기본적인 Node.js의 개념과 장단점에 대해서 알아보았습니다.

다음 포스팅에서는 Node.js와 함께 서버 구축에 사용되는 프레임워크, express에 대해 포스팅하겠습니다.

 

 

 

Reference

https://hanamon.kr/nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/\

 

Node.js 노드 개념 이해하기 자바스크립트 JavaScript 런타임 이벤트

Node.js 노드 개념 이해하기 JavaScript 런타임 - 노드는 다양한 자바스크립트 애플리케이션을 실행할 수 있으며, 서버를 실행하는데 제일 많이 사용된다. 이벤트 기반 이벤트 루프 논블로킹 I/O 싱글

hanamon.kr

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

 

[Node.js 1강]node js 란? 장점, 단점, 어떤 웹서비스에 사용해야할까?

Node.js 란? Node.js는 위키백과에 아래와 같이 정의되어 있습니다. Node.js는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크

junspapa-itdev.tistory.com

+chatGPT 활용!

'node.js' 카테고리의 다른 글

[Node.js] express 설치 및 사용법  (0) 2023.07.24