Node.js 교과서 1장 정리

·2022년 1월 1일

목록 보기
1/1

노드란?

크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임

공식홈페이지에 기재된 노드의 정의를 보면 알 수 있듯이, 보통 우리들의 생각과는 달리 '서버'가 아니라고 한다. 그렇다면 서버란 무엇이고, 런타임이란 무엇일까.

서버

네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램

여기서 클라이언트란 요청을 보내는 주체로, 데스크탑 또는 브라우저일수도 있다.
우리가 앱, 웹을 사용할 때 사용자의 데이터와 서비스의 데이터를 저장하고, 클라이언트로 받아오는 곳이 바로 서버다.

서버는 클라이언트의 요청에 응답하지만, 다른 서버에 요청을 보낼 수도 있다. 즉, 서버도 클라이언트가 될 수 있다.

그렇다면 왜 서버 공부를 하려면 다들 노드 공부를 하라고 할까?
노드는 자바스크립트 어플리케이션이 서버로서 기능하기 위한 도구를 제공함으로써 서버 역할을 수행할 수 있다.

런타임은 쉽게 말하면 특정 언어로 만든 프로그램들을 실행할 수 있게 해주는 가상 머신의 상태다.
즉, 노드는 자바스크립트 실행기로서, 서버를 만드는 자바스크립트 코드를 넣고 노드에 실행하면 서버의 기능을 해줄 수 있는 것이다. (해킹을 하는 js코드를 넣으면 해킹을 할 수 있다. 아무튼 노드 자체는 서버가 아니라, 실행기의 역할을 한 다는 것)


노드의 특징으로서는 여러가지가 있다.
그 중 하나는 노드는 이벤트 기반 방식으로 동작한다는 것이다.

이벤트 기반

이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식.
(이벤트: 클릭, 네트워크 요청, 타이머 등...)

이벤트 리스너: 이벤트를 등록하는 함수
콜백 함수: 이벤트가 발생했을 때 실행될 함수

참고로 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지 판단하는 것을 이벤트 루프라고 하는데, 이벤트 루프는 호출 수택이 비어있을 때만 태스크 큐에 있는 함수를 호출스택으로 가져온다.


두번째 특성은, 논블로킹 I/O 모델을 사용한다.
js에서 setTimeout(func,9000)이라는 명령어를 실행하기 위해 그 아래 코드들을 실행하기 위해 150분이나 기다리지 않는 것 처럼,오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행하게 되고, 그 함수가 다시 태스크 큐를 거쳐 호출 스택으로 올라오기 기다리는 방식이 논블로킹 방식이다.

블로킹: 동기. 코드가 순서대로 실행된다
논블로킹: 비동기. 코드가 순서대로 실행되지 않는다. (이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함)

자세한 설명은 3장 이후에서 한다.


얼핏 보면 논 블로킹 방식으로 모든 코드를 처리하는 것이 좋아보이나, 싱글 스레드라는 한계 때문에 시간적 이득을 볼 수 있는 작업은 한정되어있다.
주로 다른 노드 프로세스 외 다른 컴퓨팅 자원을 사용할 수 있는 I/O 작업이 주로 시간적 이득을 많이 본다.

즉, 네트워크 요청, 파일 시스템 접근 등 입출력 작업에서 노드는 논블로킹 방식으로 동작한다.

세번째, 싱글 스레드이다.

싱글 스레드

컴퓨터 작업을 처리할 수 있는 일손이나, 한 번에 한 가지 일밖에 처리하지 못함. 블로킹 방식에서는 비효율적임


노드는 싱글스레드이자 논블로킹 모델 (요청 받은 작업이 끝날 때까지 기다리지 않고 다음 작업 요청을 받아들임)을 채택하고 있다. 이는 블로킹 방식보다는 효율적이나, 어쨌든 스레드가 혼자 다 해먹어야 하는 방식이기 때문에 해당 스레드가 과부화되지 않도록 하는 것이 중요하다.

이와 대조되는 개념인 멀티 스레드는 웬만한 상황에서는 효율적이나, 프로그래밍이 어려우며 작업량이 늘어날 수록 필요한 스레드 개수도 많아진다.

프로세스란 운영 체제에서 할당하는 작업의 단위며, 스레드는 프로세스 내에서 실행되는 흐름의 단위이다.

노드는 싱글 스레드 특성을 띠고 있는 자바스크립트 언어 때문에 프로세스 자체를 복사해 여러 작업을 동시에 처리하는 멀티 프로세싱 방식을 택한다.


노드의 장단점

노드의 장점

멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용 (싱글 스레드라서)
I/O 작업이 많은 서버로 적합 (논블로킹 방식이기 때문에)
멀티 스레드 방식보다 프로그래밍이 쉬움
웹 서버가 내장되어 있음
자바스크립트를 사용함 (점유율이 높다)
JSON 형식과 호환하기 쉬움

노드의 단점

싱글 스레드라서 CPU 코어를 하나만 사용
CPU 작업이 많은 서버로서는 부적합
하나뿐인 스레드가 멈추지 않도록 관리해야 함
서버 규모가 커졌을 때 서버를 관리하기 어려움
어중간한 성능

profile
풀스택 호소인

0개의 댓글