프론트 엔드 분야에서 자주 쓰이던 프로그래밍 언어 “Java Script”를 아시나요? Java script는 웹 브라우저와 애플리케이션 개발에 자주 활용되는 언어로 초급자들도 쉽게 학습할 수 있습니다. 또한, 언어 점유율이 높아 Python, Java와 함께 3대 프로그래밍 언어로 부르곤 합니다.
과거에 Java Script는 프론트 엔드 분야에서만 실행되는 언어로 취급되었지만 Node.js라는 런타임 환경이 등장함에 따라 프론트엔드와 백엔드 모두를 아우르는 언어가 되었는데요. 이와 같은 Node.js의 등장은 웹 개발 내에 혁신을 일으켰으며 생산성을 향상시키는 원동력이 되어 주었습니다.
따라서 오늘은 프론트엔드, 백엔드, 서버리스 등 여러 분야에서 사용되고 있는 프로그래밍 언어인 Java Script 기반의 런타임 환경인 Node.js에 대한 이야기를 하고자 합니다.
먼저, 공식 홈페이지에서 정의하는 Node.js란 “V8 Java Script 엔진으로 빌드 된 Java Script 런타임”입니다. Java Script는 과거 웹 브라우저에서만 동작하는 프로그래밍 언어로, 프론트엔드 분야에서 주로 사용되었습니다.
하지만 Node.js의 등장은 Java Script를 웹 브라우저로부터 독립시켜 서버 구현을 가능케 했습니다. 여기서 런타임이란, 특정 언어가 구동되는 환경을 뜻합니다. 과거 Java Script의 런타임이 웹 브라우저였다면 Node.js로 인해 서버 구현까지 가능한 새로운 런타임이 생기게 된 것입니다.
Node.js는 2005년, Google Maps의 등장으로 웹 애플리케이션 언어로서의 가능성이 확인되었습니다. 과거 Java Script를 서버 환경에서 사용하고자 하는 시도가 있었지만 속도가 매우 느렸기 때문에 사용하지 못했습니다.
하지만 Google Maps의 등장으로 Java Script로 웹 애플리케이션을 구축하려는 시도와 활용은 늘어났으며 빠르게 동작하는 Java Script 엔진에 대한 사람들의 이목이 집중되었습니다.
여기서 Java Script 엔진이란 Java Script 파일을 컴퓨터가 읽을 수 있도록 변환해주는 역할을 합니다. 이 시기에 많은 브라우저가 최고의 성능을 제공하기 위해 경쟁하였습니다.
결국, 2008년 9월 구글이 발표한 크롬의 베타버전에 탑재된 C++기반의 V8 Java Script 엔진이 출시되었고, 이 엔진은 어떤 Java Script 엔진보다 빠른 속도를 보여주었습니다.
Java Script 엔진이 강력해짐에 따라, 웹 브라우저가 아닌 곳에서도 사용할 수 있도록 해야한다는 의견이 주가 되었습니다. 이러한 흐름에 힘입어 Node.js의 창시자인 Ryan Dahl는 V8엔진을 이용하여 Node.js를 탄생시켰습니다.
Node.js의 큰 특징은 총 다섯 가지로 나누어 설명될 수 있습니다.
첫 번째, “비동기 이벤트 기반 환경”입니다. Node.js는 비동기 이벤트 기반의 환경을 제공합니다. 이벤트 기반의 비동기 처리는 입출력 작업을 기다리는 동안 다른 작업을 수행할 수 있기 때문에 CPU 자원을 효율적으로 활용할 수 있습니다.
두 번째, “단일 언어 사용”입니다. Node.js는 Java Script를 기반으로 하며 프론트엔드와 백엔드 모두에서 동일한 언어를 사용할 수 있습니다. 이는 **개발자들의 생산성을 향상시키는 주요한 특징**입니다.
세 번째, “경량화”입니다. Node.js의 환경은 매우 가벼우며 코드 구조가 모듈화되어있기 때문에 병렬 작업과 대용량 데이터를 처리하는데 높은 성능을 보장합니다. 특히 다양한 라이브러리와 패키지를 지원하기 때문에 사용이 매우 용이합니다.
네 번째, “확장성”입니다. Node.js는 새로운 모듈을 추가하거나 업데이트하는 과정이 무척 간단합니다. 특히 프로젝트를 생성하고 확장하는 과정이 매우 쉬워 초보자들도 쉽게 사용할 수 있습니다.
다섯 번째, “커뮤니티와 생태계의 다양성”입니다. Node.js는 거대하고 활발한 커뮤니티와 생태계를 보유하고 있어 다양한 모듈과 패키지가 지속적으로 발전하고 있습니다. 따라서 지속적인 혁신과 개선이 이루어질 수 있습니다.
기존의 웹 서버들 대부분은 스레드를 기반으로 입출력을 처리하였지만 Node.js는 대규모 네트워크 서비스를 개발하기 위해 고안되었기 때문에 이벤트 기반으로 처리됩니다.
여기서 스레드란, 프로세스 내에서 실제로 작업을 수행하는 주체를 의미하는데, 가령 스레드 기반 작업은 각각의 작업에 대한 스레드를 생성해 동시에 실행됩니다.
하지만 이벤트 기반에서는 각각의 작업을 준비하다가 첫 번째 작업의 이벤트가 발생하면 첫 번째 작업을 시작하고 두 번째 작업의 이벤트가 발생하면 두 번째 작업을 시작합니다.
첫 번째 작업 도중 두 번째 작업을 처리해야 한다면 두 번째 작업 이벤트를 발생시켜 첫 번째 작업을 잠시 멈추고 두 번째 작업을 실행합니다. 이러한 상황을 바로 이벤트 기반의 ‘비동기 처리’라고 할 수 있습니다.
스레드 기반 작업은 요청마다 스레드를 생상하기 때문에 메모리의 소모가 크며 스레드들이 동시에 똑같은 자원을 필요로 하는 경우 해당 자원에 대한 병목현상이 일어날 수 있습니다. 하지만 이벤트 기반의 Node.js는 비동기를 구현할 수 있으며 이 덕분에 Non-Blocking을 하나의 스레드로 수행할 수 있습니다.
Node.js는 이벤트 기반 시스템으로 구성되어 있기 때문에 스레드 환경과 달리 병렬적으로 처리되는 특징을 가지고 있습니다.
따라서 이벤트로 처리되는 작업의 시간이 짧으며 요청이 많이 들어오는 시스템, 즉 채팅 서비스나 실시간으로 데이터를 보여주는 차트를 활용한 프로젝트 등을 개발할 경우 Node.js를 사용하시는 것이 좋습니다.
또한, Java Script를 사용하기 때문에 JSON 형식의 데이터를 쉽게 처리할 수 있어 api 서버를 만드는 데 용이하게 사용될 수 있습니다.
더 나아가, Java Script라는 하나의 언어를 통해 프론트엔드와 백엔드 모두를 다룰 수 있기 때문에 생산성이 향상되어 빠르게 프로젝트를 런칭해야하는 분들에게도 유용하게 활용될 수 있습니다.
결과적으로 Node.js는 개발 환경을 구축하는데 걸리는 시간이 적으며, 사용법이 매우 간단하기 때문에 생산성이 매우 높습니다. 특히스타트업이나 새로운 서비스 구축이 필요한 기업의 경우 빠르게 최소기능의 제품을 개발하여 비즈니스 모델을 검증해야 하기 때문에 유용하게 사용될 수 있습니다.