[Node.js] 기초 정리

곽우현·2022년 4월 26일
0

Node.js

목록 보기
1/1

Node.js란

비동기 이벤트 주도 기반의 JavaScript 런타임

  • JavaScript를 서버에서도 사용할 수 있도록 만든 프로그램
  • V8이라는 JavaScript 엔진 위에서 동작하는 자바스크립트 런타임(환경)이다.
  • 서버사이드 스크립트 언어가 아닌 프로그램(환경) 이다.
  • Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.
  • 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도 소프트웨어 없이 동작하는 것이 가능하다.

이벤트 기반

  • 이벤트가 발생할때 미리 지정해둔 작업을 수행하는 방식을 의미
  • Node.js이벤트 리스너에 등록해둔 콜백함수를 실행하는 방식으로 동작
  • 이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하며, 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기한다.
    router.get('/', (req,res,next) => {
      // router.get 이벤트에 대한 콜백함수 로직
    }
    * 흔히 사용하고 있는 router도 이벤트 기반으로 동작
  • 이벤트에 따라 호출되는 콜백함수를 관리하는 것을 이벤트 루프라고한다.

이벤트 루프

  • 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단한다.
  • 노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loop)라고 부른다.
  • 즉 이벤트 루프는 Node.js가 비동기 작업을 관리하기 위한 구현체이다.
  • 비동기 작업들을 모아서 관리하고 순서대로 실행할 수 있게 해주는 도구이다.

런타임

  • 프로그래밍 언어가 구동되는 환경, 즉 어떤 프로그램이 동작할 때 프로그램이 동작하는 장소이다.
  • JavaScript의 런타임은 대표적으로 웹 브라우저가 있다. Node.js라는 새로운 자바스크립트 런타임의 등장으로 브라우저가 아닌 곳에서도 실행될 수 있게 되었다.

콜백함수(CallBack Function)

  • 함수를 파라미터로 만들어 전달할 수 있는데, 이 넘겨주는 함수(파라미터)를 콜백함수 이라고 한다.
  • 내가 함수를 실행시키는 것이 아니라, 파라미터로 보낸 함수가 실행 되는것
  • 함수가 실행되는 중간에 호출되어 상태 정보를 전달하거나 결과 값을 처리하는데 사용된다.

Node.js의 구조

Node.jsC++로 작성된 런타임이고 그 내부에 V8 EnGine을 가지고 있다. 그 덕분에 크롬과 같은 브라우저에서 실행하던 JavaScript를 로컬에서 실행할 수 있다. 여기서 중요하게 봐야하는 것은 libuv라는 라이브러리이다.

libuv

libuvC++로 작성된 Node.js가 사용하는 비동기 I/O 라이브러리이다. libuv는 운영체제의 커널을 추상화한 라이브러리로 커널이 어떤 비동기 API를 지원하는지 알고있다.
우리가 libuv에게 파일 읽기와 같은 비동기 작업을 요청하면 libuv는 이 작업을 커널이 지원하는지 확인한다. 만약 지원한다면 libuv가 대신 커널에게 비동기적으로 요청했다가 응답이 오면 우리에게 전달해준다.
만약 요청한 작업을 커널이 지원하지 않는다면 자신만의 워커 스레드가 담긴 스레드 풀을 사용한다.
libuv에 대하여 자세하게 설명되어있는 블로그를 참고했다. 이곳에 정말 자세하게 잘 설명해주셨다.
결론은 Node.jsI/O 작업을 자신의 메인 스레드가 아닌 다른 스레드에 위임하여 싱글 스레드로 논 블로킹 I/O를 지원한다. 즉 Node.jsI/O 작업libuv에게 위임하여 논 블로킹 I/O를 지원하고 그 기반에는 이벤트 루프가 있다.

논 블로킹 I/O

블로그에 설명이 되게 잘 나와있다.
논블로킹 I/O를 알아보기 전에 동기 비동기에 대해서도 알아야 한다고 생각한다. 간단하게 비교하자면
동기(Sync) / 비동기(Async)의 차이점은 -> 코드의 순서실행 순서일치하는가?
블로킹 / 논블로킹의 차이점은 -> 코드의 실행다른 코드실행막는가?

  • 동기(Synchronous) : 코드가 순서대로 실행된다.
  • 비동기(Asyncronous) : 코드가 순서대로 실행되지 않는다.
  • 블록킹(Blocking) : 코드의 실행이 다른 코드의 실행을 막는다.
  • 논블록킹(Non-Blocking) : 코드의 실행이 다른 코드의 실행을 막지 않는다.

Async와 Non-Blocking이 주로 짝지어지고 Sync와 Blocking이 주로 짝지어지지만, 이 둘은 완전히 동일한 개념은 아니다. Sync하면서 Non-Blocking할 수도 있고 Async하면서 Blocking할 수도 있지만, 비효율적이고 부자연스럽기 때문에 그렇게 쓰이지 않을 뿐이다.

즉, Node.js는 작업을 수행할때, 해당 코드의 실행이 다른 코드의 실행을 막지 않기 위해 코드가 순서대로 실행되지 않는다.

싱글 스레드

Node.js는 싱글스레드, 논 블로킹 모델로 싱글 스레드가 혼자서 일을 처리하지만 들어오는 요청 순서가 아닌 논 블로킹 방식으로 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행한다.

참고자료
https://velog.io/@tok1324/Linux-%ED%95%99%EC%8A%B5-node.js-Runtime%EC%9D%98-%EA%B0%9C%EB%85%90
https://medium.com/@vdongbin/node-js-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC-single-thread-event-driven-non-blocking-i-o-event-loop-ce97e58a8e21
https://hanamon.kr/nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/
https://www.korecmblog.com/node-js-event-loop/

profile
주니어 Java 개발자

0개의 댓글