IT/WEB

Node.js를 사용하는 이유

개발자 두더지 2022. 10. 6. 22:55
728x90

일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다. 
 

기초 : JavaScript의 특징


 먼저 JavaScript와 다른 프로그래밍 언어의 차이에 대해서 알아 둘 필요가 있으므로 해설하도록 하겠다. JavaScript는 Chrome이나 Firefox와 같은 "브라우저" 위에서 동작하는 프로그래밍 언어이다. 그에 반해 Python이나 Ruby와 같은 일반적인 프로그래밍 언어는 보통 "컴퓨터" 위에서 움직인다.

 이러한 차이가 발생하는 이유는 OS의 기능에 액세스할 수 있는가 없는가이다. 여기서 "OS의 기능"이란 예를 들어 파일의 읽고 쓰기나, 네트워크 통신 등의 기능을 의미한다. 컴퓨터 위에서 동작하는 어플리케이션(Python이나 Ruby등을 포함)에서는 이러한 기능을 다룰 수 있다. 

 그에 반해 브라우저 위에서 동작하는 프로그램(JavaScript)가 OS의 기능에 액세스할 수 있게 되면 유저의 입장에서 그리 즐거운 것은 아니다. 어떤 사이트에 액세스했을 뿐인데 마음대로 컴퓨터 위에 파일을 읽어 들이거나, 컴퓨터 위의 파일을 일부 삭제하는 가능성이 있기 때문이다. 따라서 브라우저 상에서 움직이는 JavaScript는 OS의 기능에 액세스하지 않도록 되어 있다.
  그러나 OS 기능 전부 액세스할 수 없도록 하는 것은 불편하므로, 브라우저가 한정적으로 OS의 기능에 액세스를 중개해주고 있다. 최근에는 카메라나 마이크에 액세스 중개를 해주므로, 브라우저에서 Web 회의가 가능하게 됐다.
 
 

그래서 Node.js가 뭘까?


  브라우저 위라는 제한된 환경에서만 움직이던 JavaScript를 Python이나 Ruby와 같이 브라우저 위에서 움직이도록 해주는 것이 Node.js이다.
  오해받는 경우가 많지만, Node.js는 Web 서버도 아니며, Ralis나 Django와 같은 Web 프레임 워크도 아니다. JavaScript 실행 환경일 뿐이다.
 Windows에 Python을 설치하면 python.exe가 생기는 것 처럼, Node.js를 설치하면 node.exe가 생긴다. python.exe가 Python 코드를 실행하는 어플리케이션인 것처럼 node.exe는 JavaScript 코드를 실행할 어플리케이션(즉 JavaScript 실행 환경)이다.
 Node.js에서는 JavaScript으로 OS의 기능에 액세스하는 프로그램을 짤 수 있다. 즉, 브라우저에서 동작하고 있을 때는 되지 않았던 자유로운 파일의 읽기 쓰기나 네트워크 통신 등의 OS의 기능을 다룰 수 있다.

 결과적으로 Python이나 Ruby 등과 같이 Web 어플리케이션을 작성할 수 있지만, Node.js는 Web 어플리케이션만을 위한 것은 아니다.  
 
 

Node.js는 서버 사이드의 JavaScript 실행환경인가?


 Node.js는 "서버 사이드의 JavaScript실행환경"이라고 자주 소개된다. 이것은 Node.js 성장과정에서 유래한 것이다.
 Node.js는 원래 대량의 동기 접속 네트워크 어플리케이션의 구축을 목적으로 설계된 JavaScript 환경이다. 이 "JavaScript로 Web 어플리케이션(Web서버)을 만들 수 있다"는 특징에서 "Node.js는 서버 사이드의 JavaScript실행환경"이라고 소개되는 것이다. 
 그런데, 현재, Node.js는 클라이언트 사이드 JavaScript의 개발환경으로 넓게 이용되고 있다. 자세한 내용은 뒤에서 설명하겠지만, Babel이나 webpack등을 이용한 "브라우저로 실행하는 JavaScript"를 개발하기 위한 환경에도 Node.js가 사용되고 있다.
 이것은 Node.js의 "컴퓨터(OS) 위에 JavaScript를 실행할 수 있다"는 특징에 꽂힌 개발자에 의해 점점 클라이언트 사이드 JavaScript의 개발에 편리한 라이브러리가 생긴 결과이다.
 경위가 어찌됐든, 현재로써는 "Node.js는 서버 사이드의 JavaScript 실행한경으로도 클라이언트 사이드 JavaScript의 개발 환경에서도 이용"되는 실태이다.
 
 

그럼 npm은 무엇인가?


 잠시 이이야기가 딴길로 새지만 npm에 대해서 설명하고자 한다. npm은 Node.js의 패키지 관리 툴이다. Python의 pip, Ruby의 gem, Debian의 apt, Mac의 Homebrew, Rust의 cargo와 같은 것이다.
 가끔씩 yarn이 등장하지만 npm과 동일한 것이 된다고 생각하면 된다. "패키지"이라는 것은 라이브러리나 프레임워크과 같은 것이다. 즉 Vue나 React, webpack, jQuery등과 같은 것이다.
 Node.js에서 사용하고 싶은 라이브러리가 있는 경우 js 파일을 다운로드받아와서 <script src="xxx.js"></script>라고 쓰지 않고 npm을 사용하여 설치한다.
 
 

Node.js가 뭐길래 모두 사용하는 것일까?


 Node.js덕분에 족쇄를 푼 JavaScript는 다양한 것이 가능하게 됐다. 그 용도가 다양하지만, 현재 Node.js를 사용하고 있는 사람들의 목적은 다음의 세 가지로 나눌 수 있다.

  • 새로운 사양의 JavaScript 혹은 TypeScript로 클라이언트 사이드의 프로그램을 쓰고 싶은 경우
  • Web어플리케이션을 만들고 싶은 경우
  • 모바일/데스크톱용 어플리케이션을 만들고 싶은 경우
  • 그 외....

 

1. 새로운 사양의 JavaScript혹은 TypeScript로 클라이언트 사이드의 프로그램을 쓰고 싶은 경우

 새로운 사양의 JavaScript의 상세나 경위는  다양한 곳에서 언급되고 있으므로 여기서는 짤막하게 설명하도록 하겠다. TypeScript에 대한 설명은 스킵한다.
 JavaScript는 매년 사양이 갱신되어 점점 새로운 기능이 늘고 있다. 특히 ES2015이라는 버전은 지금까지 없었던 편리한 기능이 매우 많이 생겼다. 그러나 JavaScript의 사양을 새롭게 해도 기존의 브라우저가 그 사양을 추가해주지 않는 문제가 발생한다.
 이것을 해결하기 위해 등장한 것이 "새로운 사양으로 작성한 JavaScript 파일"을 기계적으로 이전 버전의 JavaScript 파일로 변환"하는 방법이다.
 이 변환 툴의 주요 흐름은 Babel으로, 이것을 움직이기 위한 환경으로 지금 자주 선택되는 것이 Node.js이다.
 

2. Web 어플리케이션을 만들고 싶은 경우

 Ruby + Rails이나 Python + Django 등으로 만들만한 Web 어플리케이션을 Node.js로 만드는 것도 가능하다. 대응하는 것을 표로 만들면 다음과 같다.

실행환경언어Web 프레임워크
RubyRubyRuby on Rails등
PythonPythonDjango등
Node.jsJavaScriptExpress등

 또한 Node.js의 특징으로 "Web서버의 역할도 Node.js가 한다"라는 점이다(그래도 Node.js의 목적을 생각하면 Web서버의 역할이 메인이다).
 원래 Node.js는 대량의 동기 접속을 위한 네트워크 어플리케이션 구축하는 것을 지원하기 위해 설계된 것이다. 따라서 Web서버로써 기능으로 일관되게 Node.js가 맡아 효율적인 처리가 가능하게 되어 있다. 
 요약하자면 보통 사용되는 Apache나 nginx와 같은 Web 서버의 대신에 Node.js가 직접 HTTP 리퀘스트를 받거나 처리해준다(실제로 Node.js만으로 Web서버를 구축하면 조금 부족한 기능들이 있으므로, 그 단계에서 Apache나 nginx를 리버시 프록시로 두는 구성이 많은 것 같다). 

 

3. 모바일/데스크톱용 어플리케이션을 만들고 싶은 경우

 Node.js에서는 모바일 어플리케이션이나 데스크탑용 어플리케이션의 개발이 가능하다. 프레임워크는 모바일 어플리케이션의 경우 React Native이며, 데스크톱용 어플리케이션이라면 Electron 사용하는 경우가 많다.
 React Native는 사용한 적이 없기에 여기선 Electron에 대해서만 설명하도록 하겠다. Electron은 JavaScript+HTML+CSS를 사용하여 데스크톱 어플리케이션을 만들기 위한 프레임워크이다.

 JavaScript는 원래 웹 사이트용 언어이므로 UI의 조작에 사용되는 경우가 많으니까, UI계의 라이브러리나 프레임워크가 세련되고 발전되어 있다. 
 이러한 재산을 이용하여 Web사이트와 동일하게 UI를 구축할 수있다는 점이 큰 메리트이다. 더욱이 OS의 기능을 다룬 어플리케이션을 만들 수 있으므로, 브라우저의 JavaScript에 비교하여 되는 폭이 넓다. 
 또한, Electron에서는 동일한 코드로 Windows/Mac/Linux의 어플리케이션이 만들 수 있다는 것도 하나의 특징이다. Visual Studio Code, Slack, Discord, Twich, Skype와 같은 데스톱 어플리케이션이 이 Electron으로 될 수 있다.
 

4. 그 외...

 그 외에도 웹 사이트의 에셋 번들(webpack) 하기 위해서 Node.js를 사용하거나 Sass를 CSS로 변환(node-ass)하기 위해 Node.js를 사용하거나, 테스트 툴(Jset)이나 코드 검증 툴(ESLint)를 사용하기 위해 Node.js를 사용하거나, 개발용의 간이 Web서버(webpack-dev-server)를 로컬에 세우기 위해 사용하거나, 정적 사이트의 빌드(Gatsby)를 위해 사용하는 등 정말 다양한 용도로 이용되고 있다.


참고자료
https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb
 

728x90