Node.js는 비동기 이벤트 기반의 JavaScript 런타임으로, 확장 가능한 네트워크 애플리케이션을 구축하도록 설계되었습니다. 다음의 "hello world" 예제에서는 많은 연결을 동시에 처리할 수 있습니다. 각 연결마다 콜백이 호출되지만, 할 일이 없으면 Node.js는 대기 상태가 됩니다.이는 운영 체제 스레드를 사용하는 오늘날의 더 일반적인 동시성 모델과 대조됩니다. 스레드 기반 네트워킹은 상대적으로 비효율적이며 사용하기도 매우 어렵습니다. 또한, Node.js 사용자는 락(lock)이 없기 때문에 프로세스가 데드락에 걸릴 걱정을 할 필요가 없습니다. Node.js의 거의 모든 함수는 직접 I/O를 수행하지 않으므로, Node.js 표준 라이브러리의 동기 메서드를 사용하여 I/O를 수행하는 경우를 제외하고는 프로세스가 차단되지 않습니다. 이처럼 차단이 발생하지 않기 때문에 Node.js에서는 확장 가능한 시스템을 개발하는 것이 매우 적합합니다. -Node.js 공식 홈페이지
Node.js — Node.js®에 대하여
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
nodejs.org
즉 Node.js는 서버 사이드에서 JavaScript를 실행할 수 있는 오픈 소스 런타임 환경이다. 브라우저에서만 실행되던 JavaScript를 서버에서도 사용할수 있도록 만들어졌으며, 비동기 이벤트 기반 프로그래밍 V8 JavaScript 엔진을 활용해 빠르고 확장성 있는 네트워크 애플리케이션을 구축할 수 있도록 설계되었다.
Node.js의 주요 특징
1. 비동기 이벤트 기반(Non-blocking I/O)
Node.js는 작업이 완료될 때까지 기다리지 않고 다음 작업을 수행한다.
비동기 작업의 결과는 이벤트를 통해 처리되므로 대규모 네트워크 요청을 효율적으로 처리할 수 있다.
2. 싱글 스레드 아키텍처
Node.js는 싱글 스레드를 사용하지만, 내부적으로 스레드 풀을 이용하여 비동기 작업(파일 읽기/쓰기, 데이터베이스 쿼리)을 처리한다.
높은 동시성을 지원하면서도 단일 스레드로 동작해 리소스 사용이 효율적이다.
3. 빠른 실행 속도
Google의 V8 JavaScript 엔진을 기반으로 JavaScript 코드를 기계어로 빠르게 변환하여 실행된다.
4. npm(Node Package Manager)
Node.js의 강력한 생태계로, 수백만 개의 오픈 소스 라이브러리와 모듈을 쉽게 설치하고 관리할 수 있다.
5. 크로스 플랫폼
Window, macOS, Linux등 다양한 운영체제에서 실행할 수 있다.
Node.js 작동 방식
1. 작업 요청
- 클라이언트 요청(HTTP 요청, 파일 읽기/쓰기, 데이터베이스 쿼리 등)이 Node.js 서버로 전달된다.
- Node.js는 요청을 받아 이벤트 루프에서 처리할지, 백그라운드 작업으로 보낼지를 결정한다.
2. 이벤트 루프(Event Loop)
Node.js는 싱글 스레드에서 동작하며, 이벤트 루프는 모든 작업을 관리한다.
이벤트 루프는 요청을 다음과 같이 처리한다:
1. 간단한 작업(예: 계산, 변수 설정 등)은 즉시 실행.
2. 시간이 걸리는 작업(예: 파일 I/O, 네트워크 요청 등)은 libuv의 스레드 풀로 보냄.
3. 비동기 작업이 완료되면, 콜백 함수가 콜백 큐(Callback Queue)에 추가됨.
4. 이벤트 루프는 콜백 큐에서 작업을 가져와 처리.
3. 스레드 풀(Thread Pool)
- libuv는 시간이 많이 걸리는 작업(파일 읽기/쓰기, 네트워크 요청 등)을 Node.js의 스레드 풀에서 처리한다.
- 스레드 풀은 기본적으로 4개의 스레드로 구성되며, 각 스레드가 작업을 병렬로 수행한다.
4. 콜백 큐(Callback Queue)
- 작업이 완료되면 해당 콜백 함수가 큐에 추가된다.
- 이벤트 루프는 메인 스레드가 비어 있는 경우에만 콜백 큐에서 작업을 꺼내 실행한다.
5. 비동기 작업 완료
- 작업이 완료되면 콜백 함수가 실행되고, 클라이언트에게 응답을 반환하거나 후속 작업을 수행한다.
Node.js의 주요 사용 사례
1. 웹 서버
Express.js 같은 프레임워크를 사용해 Restful API나 웹 애플리케이션 서버를 구축한다.
2. 실시간 애플리케이션
Wevsocket 기반의 실시간 채팅, 온라인 게임, 협업 도구 등을 개발할 때 사용된다.
3. 마이크로서비스
작은 독립적 서비스를 구축하는 데 적합하여, 확장성과 유지보수성이 뛰어난다.
4. 데이터 스트리밍 애플리케이션
Nefilx와 같은 서비스에서 대규모 데이터를 스트리밍하는 데 활용된다.
5. CLI 도구 개발
Gulp, Webpack등 개발 자동화 도구를 만드는 데 자주 사용된다.
Node.js의 장점
1. 높은 성능과 확장성
비동기 I/O와 이벤트 기반 모델을 사용해 처리량과 동시성을 제공합니다.
2. 풀스택 자바스크립트
프론트엔드와 백엔드 모드 JavaScript로 개발할 수 있어 코드 재사용성과 생산성이 높아진다.
3. 활발한 커뮤니티와 풍부한 모듈
npm에서 제공하는 다양한 오픈 소스 모듈로 개발 속도를 크게 향상시킬 수 있다.
4. 빠른 개발 주기
가볍고 빠르게 애플리케이션을 개발하고 배포할 수 있다.
Node.js의 단점
1. CPU집약적인 작업에 부적합
싱글 스레드 구조로 인해 복잡한 계산 작업이나 CPU 사용이 높은 작업에는 적합하지 않는다.
2. 콜백 지옥
비동기 작업이 많아질 경우 콜백 함수가 중첩되는 문제가 발생할 수 있다.(Promise와 async/await로 해결 가능)
3. 의존성 관리 문제
npm 패키지의 수명이 짧거나 업데이트가 잦아 의존성 관리가 어려울 수 있다.
'Node.js' 카테고리의 다른 글
Survey 저장중 발생하는 지연현상에 대한 최적화(비동기 처리) (2) | 2025.01.02 |
---|