개발스토리
노드의 개요 본문
서버
-
네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말한다.
-
클라이언트 : 요청을 보내는 주체로 브라우저, 데스크톱 프로그램, 모바일 앱 등 다양하다.
-
서버라고 해서 요청에 대한 응답만 하는 것은 아니다. 다른 서버에 요청을 보낼 수도 있다.
이 때는, 서버가 클라이언트 역할을 한다.
-
-
정리
- 서버는 클라이언트 요청에 대해 응답을 한다. 응답으로 수락을 할 수도 거절을 할 수도 있다.
- 노드 또한 자바스크립트 프로그램이 서버로서 기능하기 위한 도구를 제공하므로 서버 역할을 수행 가능하다.
자바스크립트 런타임
-
런타임이란 특정 언어로 만든 프로그램들을 실행할 수 있는 환경이다.
-
노드는 V8, libuv 라이브러리를 사용한다.
- V8과 libuv는 c, c++로 구현되었지만, 우리가 작성한 코드를 노드가 알아서 V8과 libuv에 연결해주므로 c,c++을 몰라도 된다.
- libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.
이벤트 기반
- 이벤트 기반(event-driven)이란, 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식이다.
- 예를들어, 이벤트는 클릭이나 네트워크 요청 등이 있다.
- 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할 지 미리 등록해두어야 한다. 이를 이벤트 리스너에 콜백 함수를 등록한다고 표현한다.
- 이벤트 루프(event loop)란, 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 판단한다.
- 이벤트 방생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할 담당
- 백그라운드란, setTimeout같은 타이머나 이벤트 리스너들이 대기하는 곳이다. 여러 작업이 동시에 실행될 수 있다.
- 태스크 큐란, 이벤트 발생 후 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보낸다. 정해진 순서가 있으므로 콜백 큐라고 생각해도 된다. 특정한 경우에는 순서가 바뀌기도 한다.
논 블로킹 I/O
-
작업에는 두 가지 종류가 있다. 하나는 동시에 실행될 수 있는 작업, 나머지 하나는 동시에 실행될 수 없는 작업이다. 우리가 작성한 자바스크립트 코드는 후자에 해당한다. 하지만 자바스크립트상에서 돌아가는 것이 아닌 I/O 작업 같은 것은 동시에 처리될 수 있다.
-
노드는 I/O 작업을 할 때, 논 블로킹 방식으로 처리하는 방법을 제공한다.
- 논 블로킹이란, 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행함을 뜻한다.
- 블로킹은 반대로 이전 작업이 끝나야 다음 작업을 수행하는 것을 뜻한다.
- 생각 해보면 당연히 논 블로킹 방식이 같은 작업을 더 짧은 시간에 처리할 수 있을 것이다. (다만, 작업들이 모두 동시에 처리될 수 있는 작업이라는 가정하에)
-
노드는 I/O 작업을 백그라운드로 넘겨 동시에 처리하곤 한다. 따라서 동시에 처리될 수 있는 작업들은 최대한 묶어서 백그라운드로 넘겨야 시간을 절약할 수 있다.
-
후에 나올, 노드에서의 동기는 블로킹과 유사하고 비동기는 논 블로킹과 유사하다.
! 논 블로킹과 동시는 같은 의미가 아니다. 동시성은 동시 처리가 가능한 작업을 논 블로킹 처리해야 얻는다.
싱글 스레드
-
프로세스 : 운영체제에서 할당하는 작업의 단위, 프로세스 간에는 자원을 공유하지 않는다. 현재 실행중인 프로그램이라고 이해하면 된다.
-
스레드 : 프로세스 내에서 실행되는 흐름의 단위, 여러 개의 스레드(멀티 스레드)를 생성해서 여러 작업 동시 수행이 가능하다. 자원을 공유 한다. 스레드는 프로세스 보다 작은 단위의 개념이다.
-
싱글 스레드는 말 그대로 스레드가 하나라는 것이다. 그래서 우리가 작성한 자바스크립트 코드가 동시에 실행될 수 없는 이유이다.
-
사실 노드는 싱글 스레드로 동작하지는 않는다. 노드를 실행하면 먼저 프로세스가 하나 생성이 되고, 내부적으로 여러 개의 스레드를 생성한다. 하지만, 그 중에서 직접 제어할 수 있는 스레드는 하나 뿐인 것이다.
! 노드가 싱글 스레드로 동작하지 않는 경우가 두 가지 있다.
- 스레드 풀(Thread pool) : 노드가 특정 동작을 수행할 때 스스로 멀티 스레드를 사용한다. ex)암호화, 압축 등
- 워커 스레드(Worker Thread) : 노드 12버전 부터 노드도 사용자가 직접 멀티 스레드를 다룰 수 있다.
멀티 스레딩 | 멀티 프로세싱 |
---|---|
하나의 프로세스 안에서 여러 개의 스레드 사용 | 여러 개의 프로세스 사용 |
cpu 작업이 많을 때 사용 | I/O 요청이 많을 때 사용 |
프로그래밍이 어려움 | 프로그래밍이 비교적 쉬움 |
본 내용은 Node.js 교과서 (길벗 출판사) 개정 2판의 내용을 기반으로 작성되었습니다.
'node.js' 카테고리의 다른 글
ES6 (0) | 2020.12.03 |
---|---|
서버로서의 노드 (0) | 2020.12.02 |
Node.js , Mongoose 이용한 간단한 CRUD 사이트 (0) | 2020.10.02 |
코딩 일기_객체 지향 프로그래밍 (2) | 2020.07.07 |
코딩 일기_객체 지향 프로그래밍 개요 (0) | 2020.07.06 |