ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js 란?
    Javascript/Node.js 2020. 1. 21. 17:32

    서버

    클라이언트에게 서비스를 제공하는 컴퓨터 또는 프로그램이다. 노드는 서버로도 사용할 수 있는 것이다. 명심하자.

     

    자바스크립트 런타임

    런타임이란 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻한다. 이 말은 즉, 자바스크립트 프로그램을 실행할 수 있게 해준다는 것이다. 구글에서 만든 V8 엔진은 다른 엔진에 비해 속도가 매우 빨라서 노트 프로젝트가 진행된 것이다. 노드는 V8과 libuv 라는 라이브러리를 사용한다. 둘 다 C, C++로 구현했으나 자동으로 V8, libuv에 자동으로 연결해주므로 C, C++을 따로 공부할 필요는 없다.

     

    이벤트 기반

    이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다. (네트워크 요청, 클릭 등) 이것을 event listener에 callback 함수를 등록한다고 표현한다. 예를 들어, 버튼을 눌러 클릭 이벤트가 발생하면 경고 창을 띄우는 콜백 함수가 실행된다. 이벤트 기반 모델에서는 event loop 라는 개념이 등장한다. 여러 이벤트가 발생할 때, 어떤 순서로 콜백 함수를 호출할지는 event loop가 판단한다. 

    event loop : 호출할 콜백 함수들을 관리하고, 실행 순서를 결정하는 역할

    callback queue : 호출되어야 할 콜백 함수들이 기다리는 공간, event loop가 정한대로 줄 서있다.

    background : 타이머, I/O 작업 또는 이벤트 리스터들이 대기하는 곳이다.

     

    non-blocking I/O

    오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 그 함수가 다시 callback queue를 거쳐 호출 스택으로 올라오기를 기다리는 방식이다. 즉, 어떤 작업을 요청만 해놓고 다른 일을 하면서 기다리는 것이다.

     

    싱글 스레드

    node는 싱글 스레드이므로 주어진 작업을 혼자서 처리한다. 하지만 개발자가 직접 제어할 수 있는 스레드가 1개 뿐인 것이지 내부적으로 다여러 스레드들도 갖고있다(해시 같은 CPU를 많이 사용하는 작업을 이 스레드에 따로 맡긴다.). 노드는 스레드를 늘리는 대신, 프로세스 자체를 복사해 여러 작업을 동시에 처리하는 멀티 프로세싱 방식을 채택했다. pm2 패키지를 이용해 멀티 프로세싱을 가능하게 할 수 있다.

     

    장점 

    - 싱글 스레드이기 때문에 컴퓨터 자원을 적게 사용한다. 

    - I/O 가 많은 작업에 적합하다. libuv 라이브러리를 사용해 I/O 작업을 non-blocking 방식으로 처리해준다. 따라서 스레드 하나가 많은 수의 I/O를 감당할 수 있다.

    - 웹 서버가 내장되어 있어 WAS를 추가로 설치할 필요가 없다. 하지만 서버 규모가 커지면 nginx 등의 웹 서버를 노드 서버와 연결해야한다.

     

    단점

    - 싱글 스레드이기 때문에 CPU 코어를 하나밖에 사용하지 못한다.

    - 코드에 있는 모든 연산은 싱글 스레드 하나에서 처리하기 때문에 CPU 부하가 큰 작업에는 적합하지 않다.

     

    REPL

    노드에서 제공하는 콘솔이다. 입력한 코드를 읽고(Read), 해석하고(Eval), 반환하고(Print), 종료할 때 까지 반복(Loop)한다고 해서 지어진 이름이다. 터미널에 'node' 라고 치면 나오고 짧은 코드에 사용하기 좋다.

     

    모듈화

    노드는 코드를 모듈로 만들 수 있다는 점에서 브라우저 자바스크립트와는 다르다. 모듈이란 특정한 기능을 하는 함수나 변수들의 집합이다. 모듈로 만들어두면 여러 프로그램에서 재사용할 수 있다. module.exports 를 이용해 다른 파일에서 재사용할 수 있다.

     

    global 객체

    브라우저의 window와 같은 전역 객체이다. console(), setTimeout() 등을 기본적으로 제공해준다.

     

    fs 모듈

    파일 시스템에 접근하는 모듈이다. 파일을 생성하거나 삭제할 수 있다. 여기서 데이터를 불러올 때, buffer 라는 형식으로 제공된다. 이것을 읽을 수 있게 하려면 .toString()을 사용하면 된다. 

    버퍼 : 노드는 파일을 읽을 때 메모리에 파일 크기만큼 공간을 마련해두고, 파일 데이터를 메모리에 저장한 뒤 사용자가 조작할 수 있도록 해준다. 이 메모리에 저장된 데이터가 버퍼이다.

    스트림 : 버퍼의 크기를 작게 만들어서 여러 번 나눠 보내는 방식이 등장했는데 이를 편리하게 만든 것이 스트림이다.

     

    'Javascript > Node.js' 카테고리의 다른 글

    npm  (0) 2020.01.21
    cookie & session  (0) 2020.01.21
    Passport  (0) 2020.01.15
    Single Thread  (0) 2020.01.06
    비동기  (0) 2020.01.06
Designed by Tistory.