2022. 8. 15. 23:50ㆍ간단한 컴퓨터 이론/우아한테코톡
본 포스팅은 우아한Tech의 테코톡 유세지님의 Node.js 영상을 정리한 내용입니다.
Node.js의 간단한 특징과 내부 구조 등을 위주로 정리했습니다.
Node.js
Node.js란?
자바스크립트를 실행시키는 런타임 환경
cf) 자바의 JRE와 비슷한 역할을 한다.
Node.js의 등장 배경
자바스크립트는 브라우저에 종속적이었다. 이렇게 실행될 경우에는 속도가 느렸다. 이때 구글에서는 V8 엔진을 크롬 브라우저에 탑재해 이를 출시했다. 크롬브라우저는 빠르게 자바스크립트를 처리할 수 있게 됐고, V8 엔진 또한 오픈소스로 공개가 되었다. 라이언 달은 V8 엔진을 기반으로 해 Node.js를 출시했다.
Node.js의 첫번째 특징
비동기 이벤트 주도 JavaScript 런타임으로써
Node.js는 확장성 있는 네트워크 애플리케이션을 만들 수 있도록 설계되었다.
- Node.js 공식 문서 발췌
비동기 이벤트 주도를 통해 Node.js는 콜백을 기반으로 한 비동기 함수를 컨트롤 할 수 있다. Node js는 이벤트가 발생하면 지정한 작업이 수행되도록 했다. 이를테면 카페에 직원이 있고, 그 직원은 손님의 주문을 받으면 음료를 만든다. 이때 주문은 Event, 음료를 만드는 것은 Action이라할 수 있다. 즉, 요청에 따라 작업이 수행되는 것을 의미한다.
왜 비동기 이벤트 주도를 선택했을까?
운영체제는 쓰레드 기반의 동시성 모델을 사용한다. 하나의 작업을 수행하는 주체가 쓰레드인데, 자원의 수만큼 쓰레드에 할당한다. 하지만 이는 자원의 낭비가 발생하고, 데드락이라고 하는 교착상태가 발생하기도 한다. Node.js는 싱글 쓰레드를 효율적으로 사용할 수 있는 Event Loop를 선택했다.
Event Loop
각 단계마다 시간을 할당해서 시간만큼 작업을 처리하는 라운드 로빈 방식에 따라 처리한다. 만약 각 단계가 가지는 콜백을 모두 실행한 경우에는 다음 단계로 넘어간다. 이때 단계가 바뀌는 것은 Tick이라 한다. 각 단계는 서로 다른 종류의 콜백을 담당하기에 어떤 동작을 가진 콜백을 이벤트 루프에 넣을지를 정해 콜백의 실행 시점을 조절할 수 있게된다.
콜백 종류
- Timer: 타이머 함수로 스케줄한 콜백이 들어간다.
- Pending: 이전 루프에서 마무리되지 못한 I/O 콜백들이 실행된다. ex) Connection Error
- idle, prepare: 내부의 작업 수행, I/O 폴링 사전 준비가 일어난다. 개발자가 이 단계의 작업을 지정하는 경우는 거의 없다.
- poll: 새로운 I/O 이벤트를 가져와서 실행된다.
- check: node api 중 하나인 setImmediate()로 스케줄링된 콜백을 실행한다.
- close: close 콜백 실행한다.
Node.js Event Loop vs Browser Event Loop
두 개의 이벤트 루프는 개념적으로는 동일하지만 세부적인 내용에서 차이점을 보인다. 예를 들어 setImmediate는 노드만 존재하고 일반적인 브라우저에는 존재하지 않다.
노드의 두번째 특징(논 블로킹)
Node.js에서 I/O를 직접 수행하는 함수는 거의 없으므로 프로세스는 블로킹되지 않습니다.
그러므로 Node.js에서는 확장성있는 시스템을 개발하는게 아주 자연스럽습니다.
- Node.js 공식 문서
자바스크립트는 싱글 쓰레드 언어이기에 하나에 한번의 작업만 가능하다. Blocking이 가능한 경우에는 작업이 완료될 때까지 다른 작업이 불가능하게 된다. 자바스크립트는 비동기 작업들로 수행되기에 앞선 작업이 막혀도 다른 동작이 수행되기에 더 효율적으로 동작한다. 따라서 Node.js는 싱글쓰레드 언어인 자바스크립트의 특성을 고려하고 이벤트 주도 방식과 논 블로킹 방식을 수행한다. 이때 비동기 작업은 Event Loop로 간다.
Node.js의 내부구조
libuv
libuv는 비동기 작업을 포함해 다양한 작업을 수행하는 C 기반의 라이브러리이다. 네트워크 I/O와 File I/O 등 I/O에 대한 api와 기타 작업을 위한 쓰레드 풀을 가지고 있다. 기본적으로는 네개의 쓰레드를 가지고 있다.
Event Loop에 건져진 비동기 작업은 시스템 커널에서 수행된다. 커널에서는 수많은 비동기 api를 지원하기에 libuv는 interface 역할을 한다. 시스템이 처리할 수 있는 작업은 시스템에 위임해서 처리하고 그 외엔 쓰레드 풀에서 처리한다. 대표적으로 네트워크, 소켓 작업은 시스템이, 파일입출력은 쓰레드 풀이 한다. 이러한 위임과 분리 덕분에 싱글 쓰레드 기반의 이벤트 루프도 다양한 비동기 작업을 효율적으로 사용될 수 있다.
'간단한 컴퓨터 이론 > 우아한테코톡' 카테고리의 다른 글
우아한테코톡(8), Process vs Thread (0) | 2022.08.22 |
---|---|
우아한 테코톡(7), 상속과 조합 (0) | 2022.08.18 |
우아한 테코톡 (5), API vs Library vs Framework (0) | 2022.08.11 |
우아한 테코톡(4), Flux Architecture (0) | 2022.08.10 |
우아한 테코톡 (3), Web Server vs WAS (0) | 2022.08.08 |