본문 바로가기
개발

[Node.js] 1장

by jwcs 2024. 2. 2.
728x90

1.1 핵심 개념 이해하기

 

1.1.1 서버

 

서버란 무엇일까?

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

 

1.1.2 자바스크립트 런타임

노드는 무엇인가?

 노드는 자바스크립트 런타임이다. 런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻한다. 따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있다.

 기존에는 자바스크립트 프로그램을 웹 브라우저 위에서만 실행할 수 있었다. 브라우저는 자바스크립트 런타임을 내장하고 있으므로 자바스크립트 코드를 실행할 수 있다.

 

1.1.3 이벤트 기반

이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식이다. 이벤트로는 클릭이나 네트워크 요청 등이 있을 수 있다.

 노드도 이벤트 기반 방식으로 동작하므로, 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출한다. 발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면, 노드는 다음 이벤트가 발생할 때까지 대기한다.

 

 이벤트 기반 모델에서는 이벤트 루프라는 개념이 등장한다. 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출할 지를 이벤트 루프가 판단한다.

 노드는 자바스크립트 코드의 맨 위부터 한 줄씩 실행한다. 함수 호출 부분을 발견했다면 호출한 함수를 호출 스택에 넣는다.

 콘텍스트는 함수가 호출되었을 때 생성되는 환경을 의미한다. 자바스크립트 코드는 실행 시 기본적으로 전역 콘텍스트 안에서 돌아간다. 함수는 실행되는 동안 호출 스택에 머물러 있다가 실행이 완료되면 호출 스택에서 지워진다.

 

  •  이벤트 루프: 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 부른다.
  •  백그라운드: setTimeout같은 타이머나 이벤트 리스너들이 대기하는 곳이다. 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 무방하며, 여러 작업이 동시에 실행될 수 있다.
  • 태스크 큐: 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보낸다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 한다. 콜백들은 보통 완료된 순서대로 줄을 서 있지만, 특정한 경우 순서가 바뀌기도 한다.

1.1.4 논블로킹 I/O

논블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미한다. 반대로 블로킹은 이전 작업이 끝나아만 다음 작업을 수행하는 것을 의미한다.

 

1.1.5 싱글스레드

싱글 스레드란 스레드가 하나뿐이라는 것을 의미한다.

  • 프로세스는 운영체제에서 할당하는 작업의 단위이다. 노드나 웹브라우저 같은 프로그램은 개별적인 프로세스이다. 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.
  • 스레드는 프로세스 내에서 실행되는 흐름의 단위이다. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유한다.

노드가 싱글 스레드로 동작하지 않는 두 가지 경우가 있다. 하나는 스레드 풀이고, 다른 하나는 워커 스레드이다. 스레드 풀은 노드가 특정 동작을 수행할 때 스스로 멀티 스레드를 사용한다. 대표적인 예로 암호화, 파일 입출력, 압축 등이 있다. 워커 스레드는 노드 12 버전에서 안정화된 기능으로, 이제 노드에서도 멀티 스레드를 사용할 수 있다. CPU 작업이 많은 경우 워커 스레드를 사용하면 된다.

 

1.2 서버로서의 노드

 서버에는 기본적으로 I/O 요청이 많이 발생하므로, I/O 처리를 잘하는 노드를 서버로 사용하면 좋다. 노드는 논블로킹 방식으로 I/O 작업을 처리할 수 있다. 따라서 하나의 스레드가 많은 수의 I/O를 감당할 수 있다.

 노드 12버전에서 워커 스레드 기능의 안정화로 멀티 스레드 작업을 할 수 있지만, 이를 구현하기가 상당히 어렵다. 또한 멀티 스레드 프로그래밍을 하더라도 C, C++, Rust, Go와 같은 언어에 비해 속도가 많이 느리다. 따라서 CPU를 많이 사용하는 작업을 위한 서버로는 권장하지 않는다.

 웹 브라우저도 자바스크립트를 사용하므로 서버까지 노드를 사용하면 하나의 언어로 웹 사이트를 개발할 수 있다. 이는 개발 생산성을 획기적으로 높였고, 생산성이 중요한 기업이 노드를 채택하는 이유가 되었다.

 생산성은 좋지만 Go와 같이 비동기에 강점을 보이는 언어나 nginxㅓ럼 정적 파일 제공, 로드 밸런싱에 특화된 웹 서버에 비해서는 속도가 느리다.

 요즘은 XML 대신 JSON을 사용해서 데이터를 주고받는데, JSON이 자바스크립트 형식이므로 노드에서 쉽게 처리할 수 있다. 안정성과 보안성 측면의 문제도 이미 충분히 검증되었다. 세계 유수의 기관과 기업에서 노드를 사용하고 있다.

 

1.3 서버 외의 노드

사용 범위가 점점 늘어나서 웹, 모바일, 데스크톱 애플리케이션 개발에도 사용되기 시작했다. 노드 기반으로 돌아가는 대표적인 웹 프레임워크로는 앵귤러, 리액트, 뷰 등이 있다.

 

 

728x90
반응형

'개발' 카테고리의 다른 글

[Node.js] 6장  (0) 2024.02.08
[Node.js] 5장  (0) 2024.02.07
[Node.js] 4장  (0) 2024.02.04
[Node.js] 3장  (0) 2024.02.04
[Node.js] 2장  (0) 2024.02.02