개발스토리

노드의 개요 본문

node.js

노드의 개요

무루뭉 2020. 12. 1. 00:52

서버

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

    • 클라이언트 : 요청을 보내는 주체로 브라우저, 데스크톱 프로그램, 모바일 앱 등 다양하다.

    • 서버라고 해서 요청에 대한 응답만 하는 것은 아니다. 다른 서버에 요청을 보낼 수도 있다.

      이 때는, 서버가 클라이언트 역할을 한다.

  • 정리

    • 서버는 클라이언트 요청에 대해 응답을 한다. 응답으로 수락을 할 수도 거절을 할 수도 있다.
    • 노드 또한 자바스크립트 프로그램이 서버로서 기능하기 위한 도구를 제공하므로 서버 역할을 수행 가능하다.

자바스크립트 런타임

  • 런타임이란 특정 언어로 만든 프로그램들을 실행할 수 있는 환경이다.

  • 노드는 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 작업을 백그라운드로 넘겨 동시에 처리하곤 한다. 따라서 동시에 처리될 수 있는 작업들은 최대한 묶어서 백그라운드로 넘겨야 시간을 절약할 수 있다.

  • 후에 나올, 노드에서의 동기는 블로킹과 유사하고 비동기는 논 블로킹과 유사하다.

! 논 블로킹과 동시는 같은 의미가 아니다. 동시성은 동시 처리가 가능한 작업을 논 블로킹 처리해야 얻는다.


싱글 스레드

  • 프로세스 : 운영체제에서 할당하는 작업의 단위, 프로세스 간에는 자원을 공유하지 않는다. 현재 실행중인 프로그램이라고 이해하면 된다.

  • 스레드 : 프로세스 내에서 실행되는 흐름의 단위, 여러 개의 스레드(멀티 스레드)를 생성해서 여러 작업 동시 수행이 가능하다. 자원을 공유 한다. 스레드는 프로세스 보다 작은 단위의 개념이다.

  • 싱글 스레드는 말 그대로 스레드가 하나라는 것이다. 그래서 우리가 작성한 자바스크립트 코드가 동시에 실행될 수 없는 이유이다.

  • 사실 노드는 싱글 스레드로 동작하지는 않는다. 노드를 실행하면 먼저 프로세스가 하나 생성이 되고, 내부적으로 여러 개의 스레드를 생성한다. 하지만, 그 중에서 직접 제어할 수 있는 스레드는 하나 뿐인 것이다.

    ! 노드가 싱글 스레드로 동작하지 않는 경우가 두 가지 있다.

  1. 스레드 풀(Thread pool) : 노드가 특정 동작을 수행할 때 스스로 멀티 스레드를 사용한다. ex)암호화, 압축 등
  2. 워커 스레드(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
Comments