Node.js란 무엇인가요?
자바스크립트를 브라우저 밖에서 실행할 수 있게 해주는 런타임 환경
프론트엔드 개발자라면 기본적으로 갖추고 있어야 할 기술 스택이 자바스크립트입니다.
자바스크립트는 원래 브라우저에서 실행을 위해 개발된 언어인데요.
웹 개발의 생태계가 진화함에 따라, 자바스크립트는 브라우저를 넘어 서버 사이드에서도 활용될 수 있게 되었습니다.
이러한 변화를 가져온 것이 바로 Node.js입니다.
Node.js는 브라우저 밖에서 자바스크립트를 실행할 수 있게 해주는 런타임 환경으로,
프론트엔드 개발자들에게 풀스택 개발의 문을 열어주었다고 해도 과언이 아닙니다.
이번 포스트에서는 Node.js의 기본적인 개념과 특징에 대해 알아보도록 하겠습니다.
Node.js의 특징
1. 오픈 소스
Node.js의 모든 소스코드는 오픈 소스로 공개되어 있습니다.
저장소 레포지토리에서 소스코드를 확인할 수 있습니다.
오픈 소스이므로 자유롭게 기여할 수 있고, 버그를 발견하면 이슈를 남겨 수정할 수 있습니다.
2. 크로스 플랫폼
Node.js는 윈도우, 맥, 리눅스 환경 모든 운영체제에서 실행할 수 있습니다.
대부분의 서버는 리눅스 기반이지만, Node.js는 모든 운영체제에서 실행할 수 있으므로 개발, 배포를 쉽게 할 수 있습니다.
3. 자바스크립트 런타임
Node.js는 자바스크립트 런타임으로, 자바스크립트 코드를 실행할 수 있는 환경을 제공합니다.
브라우저 외부에서 자바스크립트를 실행할 수 있게 해줍니다.
Node.js의 역사
Node.js는 2009년 라이언 달(Ryan Dahl)이 처음 발표한 혁신적인 프로젝트입니다. 자바스크립트를 브라우저 밖에서 실행할 수 있게 해주는 런타임 환경으로, 웹 개발 생태계에 큰 변화를 가져왔습니다.
주요 발전 과정은 다음과 같습니다:
- 2009년: Node.js 최초 발표
- 2010년: 패키지 관리자 npm 출시
- 2010년: Express 웹 프레임워크 출시
- 2011년: Uber, LinkedIn 등 주요 기업들이 Node.js 도입 시작
- 이후 Koa, IO.js 등 다양한 프레임워크가 등장했지만, 현재까지 가장 인기 있는 프레임워크는 여전히 Express입니다.
자바스크립트는 인터프리터 언어입니다.
언어에는 크게 두 가지 타입이 있습니다.
컴파일 언어 | 인터프리터 언어 |
---|---|
프로그램 실행 전 컴파일 과정을 거친다 | 프로그램 실행 중 코드를 한줄씩 번역하면서 실행한다 |
실행 과정이 빠르다 | 실행 과정이 비교적 느리다 |
코드 변경 시 오랜 시간 컴파일을 해야한다 | 코드 변경 시 매번 전체 컴파일을 할 필요가 없다 |
타겟 플랫폼에서 직접 컴파일을 진행한다 | 코드를 실행하는 인터프리터가 존재한다 |
JIT (Just In Time Compilation)
JIT은 컴파일 방식과 인터프리터 방식의 장점을 결합한 형태입니다.
자바스크립트 엔진인 V8(Node.js와 Chrome에서 사용)도 JIT 컴파일러를 사용하여 성능을 최적화합니다.
자주 실행되는 코드를 식별하여 컴파일하고 최적화함으로써 실행 속도를 크게 향상시킵니다.
Node.js의 싱글 스레드 모델과 이벤트 루프
Node.js는 기본적으로 싱글 스레드 모델을 사용하지만, 비동기 I/O 작업을 통해 높은 동시성을 달성합니다. 이 모델은 이벤트 루프를 중심으로 작동합니다
비동기(Non-blocking) 작업의 처리 과정
- 클라이언트로부터 요청이 들어오면 이벤트 큐에 추가됩니다
- 이벤트 루프는 이벤트 큐에서 이벤트를 하나씩 가져와 처리합니다
- 간단한 계산이나 빠른 작업은 메인 스레드에서 즉시 처리됩니다
- 처리가 완료되면 결과를 클라이언트에 반환합니다
동기(Blocking) 작업의 처리 과정
- 파일 I/O, 네트워크 요청 등 시간이 오래 걸리는 작업이 요청되면
- 이벤트 루프는 이 작업을 libuv의 스레드 풀로 위임합니다
- 작업이 스레드 풀에서 처리되는 동안, 이벤트 루프는 멈추지 않고 다음 이벤트를 처리합니다
- 작업이 완료되면 콜백 함수가 이벤트 큐에 추가되고, 차례가 되면 실행됩니다
Node.js의 핵심은 메인 스레드인 이벤트 루프가 절대 차단되지 않도록 유지하는 것입니다.
이를 통해 싱글 스레드임에도 불구하고 수많은 동시 연결을 효율적으로 처리할 수 있습니다.
이러한 비동기 이벤트 기반 아키텍처는 I/O 작업이 많은 웹 애플리케이션에 특히 효과적이며,
Node.js가 높은 확장성을 가질 수 있는 핵심 요소입니다.