ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JavaScript와 Node.js에 대해서
    스터디노트/Back-end 2022. 5. 27. 15:08

    요새 기업에서 백엔드를 구축할 때 사용하는 기술스택을 보면 Java 말고 Node.js도 굉장히 많은 추세이다.

    우리 팀에서도 Node.js를 사용하여 백엔드를 구축하고있다.

    단순히 JavaScript라는 언어에 익숙했기 때문에 Node.js가 어떤 것이다 Express가 어떤 것이다라는 것을 학습하면서 Node.js로 백엔드를 구축하고 있었는데 Node.js가 왜 만들어졌고 Node.js를 사용하여 서버를 만들었을 때의 장단점과 어떤 경우에 Node.js를 사용하는게 좋은지 좀 더 근본적인 이유가 궁금했고 JavaScript라는 언어 자체의 근본적인 특징에 대해서도 궁금해졌다.

    또한 우리나라 기업 백엔드 기술 스택에서 Java가 90% 이상 차지하고 있다고 생각하는데 많은 기업들이 신규 서버와 기존 서버를 Node.js로 바꾸려고 하는 이유도 궁금해졌다.

     

    1. JavaScript에 대해서

    JavaScript는 싱글 쓰레드 기반이며 콜백 큐를 사용한다. JavaScript 엔진 중 유명한건 V8이다. 엔진은 메모리 힙과 콜스택으로 구성되어있다.

     

    Memory Heap : 메모리 할당이 일어나는 곳, 동적으로 생긴 Data를 보관하는 곳.

    Call Stack : 호출 스택이 쌓이는 곳.

     

    JavaScript는 싱글 쓰레드 기반 언어이기 때문에 Call Stack이 한개다. 따라서 한번에 한 작업만 처리한다. Call Stack은 프로그램 상에서 위치를 기록하는 자료구조이다. 함수를 실행하면 해당 함수는 Call Stack 최상단에 위치하게된다. Stack은 함수가 값을 반환하게 되면 해당 함수를 호출 스택에서 삭제한다.

    Call Stack에 처리 시간이 말도 안되게 걸리는 함수가 있으면 Call Stack에서 해당 함수가 실행되는 동안 아무 작업도 못하고 대기상태에 빠지게된다. 또한 Call Stack에 많은 작업들을 처리하면 오랫동안 응답을 하지 못하게된다. 이러한 문제점들을 비동기 콜백으로 해결할 수 있다.

     

    JS 관련 학습자료 : https://ribbon-alyssum-680.notion.site/JS-eccf6543bf864d3e8ed0436aec9098d9

     

    2. Node.js 등장 배경

    2005년 Google Maps등장으로 Web Application 언어로 JavaScript의 가능성을 확인하는 계기가 되었고 더욱 빠르게 동작하는 엔진이 필요했다. 2008년에 구글에서 크롬 베타 버전을 출시 했는데 V8 JS엔진은 어떠한 JavaScript 엔진보다 빨랐다. 2009년 이후 CommonJS 표준이 발표났고 그 이후 CommonJS + V8엔진을 기반으로 라이언 라인하트 달이라는 사람이 Node.js를 개발했다.

     

    3. Node.js.란??

    Node.js는 비동기 이벤트 주도형 JavaScript 런타임이다. 웹 어플리케이션, 네이티브 앱 개발 등 다양한 분야에서 사용될 수 있다. Node.js는 V8 엔진 브라우져 외에도 JavaScript 코드로 프로그램을 실행할 수 있다.

    Node.js는 JavaScript를 실행하는 쓰레드는 단 한개만 가지고 있으므로 싱글 쓰레드라고 한다. 

    Node.js Event Driven이다. 이벤트가 발생하면 callback 함수를 통해 처리한다. Node.js에서 비동기 요청이 들어온 경우 Call Stack(LIFO방식의 동기적 처리)만으로 처리할 수 없다. 이때 이벤트 루프를 통해 비동기 처리한다.

    이벤트 루프는 받은 이벤트 발생 시 호출할 콜백 함수들을 관리하며 비동기 요청을 OS 비동기 interface나 쓰레드 풀에 할당한다.

     

    OS 비동기 interface : OS에서 비동기를 처리하기 위한 인터페이스(window, linux 등).

    쓰레드 풀 : 쓰레드를 미리 생성하여 관리하는 공간.

     

    할당한 작업이 끝나면 테스크 큐(이벤트 발생 후 콜백 함수들이 기다리는 공간)에 콜백 함수를 전달하고 Call Stack이 비게 될 경우 순차적으로 Call Stack에 넘겨 실행한다.

    따라서 이벤트 루프는 싱글 쓰레드이고 JavaScript를 처리하는 메인 쓰레드이기 때문에 Node.js는 싱글 쓰레드라고 한다.

     

    Node.js 키워드!!

    1) JavaScript Runtime

    2) 싱글 쓰레드

    3) Event Driven : 콜백으로 던져놓고 이벤트가 발생하면 그 콜백 함수를 호출하게 하는 것.

    4) Non-blocking I/O : I/O란 외부적으로 쓰고 읽는 것이다. 즉 Non-blocking I/O는 비동기적으로 읽고 쓰는 것(콜백을 던져주고 다음거 수행).

     

    4. Node.js로 서버를 만들었을 때 장점

    Traditional server의 특징은 요청이 들어오면 요청을 처리하기 위해 하나의 쓰레드를 할당한다. 즉 요청마다 그 요청을 처리할 수 있는 쓰레드를 할당한다. 허용 범위 이상의 요청이 들어올 경우 그 요청을 처리하기 위해서는 처리할 수 있는 쓰레드가 생길 때까지 기다린 후 처리를 다 하고 쓰레드 풀에 대기하고 있는 쓰레드가 있는 경우 그제서야 처리가 가능하다. 

     

    Node.js Sever의 특징은 하나의 메인 싱글 쓰레드가 있다. 요청이 들어오면 그 요청을 처리하기 위해 요청을 넘긴 후 다음 요청을 받는다. 즉 하나의 쓰레드가 요청을 받은 다음 해야할 일을 데이터베이스나 네트워크 등으로 던져놓고 데이터가 읽어진 이후에는 해당 결과를 전달하는 형식이다.

     

    하나의 쓰레드가 모든 요청을 받은 다음 각각의 요청을 처리할 수 있는 데이터베이스나 네트워크에게 위임하여 여러가지 일을 빠르게 처리할 수 있다.

     

    5. Node.js에 적합, 부적합한 환경

    적합한 환경 : 파일이나 데이터베이스를 읽고 쓰는 환경

    부적합한 환경 : CPU 사용량이 많은 환경(이미지, 비디오 처리 등 병렬처리)에 부적합하다.

     

    6. 마치며

    실무에서 Node.js를 사용하여 백엔드를 구축하고 있기 때문에 앞으로도 Node.js에 대한 근본적인 공부들을 해야한다. Node.js에서의 메모리 누수, Node.js에서 병렬처리 등도 공부하면서 구축한 서버의 퍼포먼스를 높여보고싶다. 또한 JavaScript 자체가 객체지향 언어가 아니라 프로토타입 언어이기 때문에 Java를 사용했을 때보다 아무래도 자유도가 높은거 같다. 나 혼자 개발하는 것이 아니기 때문에 디자인 패턴도 공부하고 확장성과 재사용성을 고려하여 코드를 작성하는 연습을 해야겠다.

     

    참고자료 

    https://nodejs.org/ko/docs/guides/event-loop-timers-and-nexttick/

     

    Node.js 이벤트 루프, 타이머, `process.nextTick()` | Node.js

    Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

    nodejs.org

    https://nodejs.org/ko/about/

    '스터디노트 > Back-end' 카테고리의 다른 글

    Node.js watch 기능 업데이트  (0) 2022.10.25
    Joi()로 Validation Check하기  (0) 2022.05.25
    express.Router().METHOD  (0) 2022.05.11
    Node : require() vs import  (0) 2022.04.08
    Express에서 유용한 내부, 외부 Middleware  (0) 2022.03.24
Designed by Tistory.