본문 바로가기
Node.js

[Node.js] 노드의 주요 특징

by yonikim 2024. 1. 16.
728x90

 

Node.js 는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임 환경으로, 주로 서버 사이드 애플리케이션 개발에 사용되는 소프트웨어 플랫폼이다. 

 

Node.js 주요 특징 


1. 비동기 I/O

Node.js 는 비동기식 I/O 를 사용하여 빠른 성능을 제공한다. 이는 여러 작업을 동시에 처리하고, 블로킹되지 않고 다음 작업으로 계속 진행할 수 있도록 한다. 이는 높은 동시성을 가능하게 하며, 특히 입출력이 빈번한 작업에서 높은 성능을 제공한다.

 

2. 이벤트 주도 아키텍처

Node.js 는 이벤트 기반의 비동기적인 아키텍처를 사옹하여 작업이 완료되었을 때 콜백 함수를 호출하도록 한다. 이를 통해 비동기 작업을 처리하고, 효율적으로 이벤트를 관리할 수 있다.

 

3. 단일 쓰레드 모델

Node.js 는 단일 쓰레드 이벤트 루프를 사용하여 여러 요청을 도잇에 할 수 있게 하면서도 쓰레드 관리를 간소화한다. 하지만 이는 CPU-bound 작업에 취약할 수 있다.

 

4. 모듈 시스템

Node.js 는 CommonJS 를 기반으로 하는 모듈 시스템을 사용하여 코드를 모듈화하고 관리할 수 있다. 이는 코드의 가독성과 유지보수성을 높이는데 도움을 준다.

 

5. 빠른 실행 속도 

V8 엔진을 사용하여 JavaScript 코드를 빠르게 실행할 수 있다.

V8 엔진은 구글에서 개발한 엔진으로, Just-In-Time 컴파일을 통해 코드를 기계어로 변환하고 최적화하여 실행 속도를 향상시킬 뿐만 아니라 높은 성능을 제공한다.

 

6. 크로스 플랫폼

Node.js 는 크로스 플랫폼 지원을 제공하며, Windows, MacOS, Linux 등 다양한 운영 체제에서 실행될 수 있다.

 

 


더 나아가기

동기? 비동기? 블로킹? 논블로킹?


 

동기/비동기와 블로킹/논블로킹 은 유사하지만 엄연히 다른 개념이다

동기/비동기는 요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 수행할지 아닌지에 대한 관점으로 출력 순서와 관련된 개념이고, 

블로킹/논블로킹 은 단어 그대로 현재 작업이 block(차단, 대기) 되느냐 아니냐 에 따라 다른 작업을 수행할 수 있는지에 대한 관점으로 병렬 실행과 관련된 개념이다.

 

1. 동기(Synchronous)

동기는 작업이 순차적으로 진행되는 방식을 의미한다.

한 작업이 시작되면 그 작업이 완료될 때까까지 다음 작업이 시작되지 않는다. 코드는 위에서부터 아래로 순차적으로 실행된다.

 

2. 비동기(Asynchronous)

비동기는 작업이 병렬적으로 진행되는 방식을 의미한다.

한 작업이 시작되면 그 작업이 완료될 때까지 기다리지 않고 즉시 다음 작업이 시작된다. 비동기 작업은 주로 콜백 함수, 프로미스, async/await 등을 사용하여 결과를 처리한다.

한 작업이 시작되면 그 작업이 완료될 때까지 

 

3. 블로킹(Blocking)

블로킹은 어떤 작업이 완료될 때까지 제어가 다른 코드로 전달되지 않는 방식을 의미한다.

블로킹 작업이 실행되면 해당 작업이 완료될 때까지 프로그램의 제어가 다른 코드로 넘어가지 않는다. 다른 작업들은 해당 작업이 완료될 때까지 기다려야 한다.

 

4. 논블로킹(Non-Blocking)

논블로킹은 작업이 완료되지 않아도 제어가 다른 코드로 전달되는 방식을 의미한다.

논블로킹 작업이 실행되면 해당 작업이 완료되지 않더라도 다음 코드로 제어가 즉시 전달된다. 이는 다른 작업들이 블로킹되지 않고 계속 진행될 수 있도록 한다. 

 

 

▶ 파일을 동기적으로 읽는 경우:

const fs = require('fs');

// 동기적인 파일 읽기
const data = fs.readFileSync('file.txt');

console.log(data); // 파일을 읽은 후에 실행

 

readFileSync 함수는 파일을 동기적으로 읽기 때문에, 파일을 읽을 때까지 코드가 블로킹된다.

 

 파일을 비동기적으로 읽는 경우:

const fs = require('fs');

// 비동기적인 파일 읽기
fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data); // 파일을 읽은 후에 실행
});

console.log('Reading file...'); // 파일을 읽는 동안 여기서 코드가 계속 실행됨

readFile 함수는 파일을 비동기적으로 읽기 때문에, 파일을 읽는 동안 다음 코드가 실행되고, 파일 읽기가 완료되면 콜백 함수가 호출되어 결과를 처리한다. 이는 논블로킹 작업으로 볼 수 있다.

 

 

Node.js 에서는 주로 비동기&논블로킹 방식을 사용하여 작업이 완료될 때까지 다른 작업을 수행할 수 있도록 하거나, 동기&블로킹 방식을 사용하여 코드 실행 시점을 늦춰주거나 순차적인 의존성이 있는 작업을 처리한다. 

 

동기/비동기와 블로킹/논블래킹의 개념을 이해하고 적절한 조합을 선택하는 것이 중요하다

 


 

Node.js 의 장점


1. 높은 성능

비동기 I/O 와 이벤트 주도 아키텍처를 통해 높은 성능을 제공한다. 특히, 동시적인 요청 및 빠른 응답을 처리하는데 강점이 있어 대량의 동시 접속자를 처리하는 서버 애플리케이션에 적합하다. 

 

2. 빠른 실행 속도 

V8 JavaScript 엔진을 사용하므로 JavaScript 코드를 빠르게 실행할 수 있다.

 

3. 단일 언어 사용

JavaScript 를 서버와 클라이언트 측에서 모두 사용할 수 있기 때문에, 개발자들은 통일된 언어를 사용하여 개발할 수 있다. 이는 코드의 재사용성을 높이고 전체 개발팀 간의 협업을 용이하게 한다.

 

4. NPM 

NPM 은 Node.js 의 패키지 관리자로서, 수많은 오픈소스 모듈을 포함하고 있기 때문에 다양한 패키지들을 쉽게 설치하고 관리할 수 있다.

 

5. 확장성 

이벤트 기반의 비동기적인 아키텍처로 확장성이 용이하다. 수많은 동시 연결을 다루는 서버 애플리케이션을 구축할 때 유용하며, 클러스터링 등의 방법으로 쉽게 확장이 가능하다.

 

6. 커뮤니티 및 지원

활발한 개발자 커뮤니티와 다양한 오픈소스 모듈들이 존재하기 때문에, 문제 발생 시 빠른 해결과 새로운 기능의 도입을 지원한다.

 

Node.js 의 단점


1. 단일 쓰레드

Node.js 는 단일 쓰레드로 동작하기 때문에 멀티코어 시스템에서의 활용이 제한될 수 있고 CPU 집약적인 작업에는 적합하지 않기 때문에 CPU 사용량이 높은 작업에서는 성능이 떨어질 수 있다. 이러한 문제들은 클러스터링 등의 기술을 사용하여 해결할 수 있지만 복잡성이 증가할 수 있다.

 

2. 콜백 지옥 (Callback Hell)

비동기 콜백 함수를 중첩해서 사용할 때 발생할 수 있는 가독성 문제를 "콜백 지옥" 이라고 한다. 이를 해결하기 위해 Promise 나 async/await 과 같은 패턴을 사용할 수 있지만 코드의 복잡도가 증가할 수 있다.

 

3. 학습 곡선 (Learning Curve)

비동기 프로그래밍과 이벤트 기반의 아키텍처는 초보자에게는 학습 곡선이 높을 수 있다. 

 

 

References

https://inpa.tistory.com/entry/👩‍💻-동기비동기-블로킹논블로킹-개념-정리

https://wildeveloperetrain.tistory.com/104

 

728x90