Framework & Library/node.js

[Node.js] Node.js를 위한 기본 개념 (서버, 클라이언트, 런타임, 이벤트, 동기/비동기, 블록킹/논블록킹, 프로세스/스레드)

코찔이_suj 2021. 3. 23. 19:15
728x90

이번에 들어간 교내 동아리에서 백엔드 부분을 맡게 되면서 서버 파트를 공부하게 되었어요!

아래 책으로 다같이 스터디 하는 형식으로 공부해 나갈 것 같은데

나중에 보더라도 보기 쉽게 정리해두면 좋을 것 같아서

제가 이해한 내용을 바탕으로 몇 가지 훗날 필요할 거라 생각된 내용들을 정리해보려고 해요!

모든 내용을 다루지도 않을 거고 여기 저기서 몰랐던 내용은 검색해보며 공부한 거라서

자세히 알고싶은 분들은 꼭 구매하셔서 봐주셨으면 합니다.

생각보다 알차고 알기 쉽게 알려주셔서 재미있게 공부할 수 있어요!!

 

Node.js 교과서 : 기본기에 충실한 노드제이에스 14 입문서(개정2판) - 조현영  (http://www.yes24.com/Product/Goods/91213376 #yes24book)

오늘은 첫 장인 1장에서 기억하고 싶은 내용을 정리해보겠습니다.

1장은 기본 개념을 위주로 다루고 있고 노드 설치와 vs code 설치에 대해 다루고 있더라고요!

노드 설치와 vs code는 따로 기입할 필요 없이 다른 분들도 많이 다뤄주시고 있길래 제외하고

node.js를 이해하기 위한 기본 개념을 한번 정리해볼까해요~

그럼 이제 한번 정리해보도록... 하겠습니다!!

 

 

1. Node.js는 무엇인가?

 

노드는 서버와 런타임 용도로 많이 사용됩니다.

자세한 설명을 위해 서버와 런타임에 대해 알아보고 오겠습니다.

 

1) 서버(Server)

- 서버의 정의

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

클라이언트 : 요청을 보내는 주체 

               ex. 브라우저, 데스크톱 프로그램, 모바일 앱, 다른 서버에 요청을 보내는 서버

 

=> 노드 : 자바스크립트 프로그램이 서버로서 기능하기 위한 툴을 제공 (= 서버 역할을 수행)

- 서버의 역할

   * 생성된 데이터를 저장

   * 클라이언트로 정보나 서비스를 제공

   * 클라이언트의 요청에 대해 응답

 

   EX1. website의 방문 (주소에 해당하는 컴퓨터 - 주소를 입력한 브라우저)

 

     웹사이트 주소를 입력 (웹사이트 데이터 요청

 |

     주소에 해당하는 컴퓨터의 위치를 파악 

|

     해당 컴퓨터로부터 웹사이트 페이지를 받아와 클라이언트에 페이지를 띄움.(응답)

 

 

   EX2. 모바일 앱 설치 (구글 서버 - 구글 플레이스토어)

 

     구글 플레이 스토어에서 앱 설치 버튼을 클릭(앱 데이터 요청

|

구글 서버로부터 데이터를 받아서 내려받기가 시작됨.(응답)

 

 

 

2) 런타임(Runtime)

- 런타임의 정의

런타임 : 특정 언어로 만든 프로그램들을 실행할 수 있는 환경

=> 노드 : 자바스크립트 프로그램을 실행할 수 있는 환경 (= 자바스크립트 실행기)

 

 

3) Node.js

공식 사이트가 정의한 node.js(a.k.a 노드)는 다음과 같습니다.

 

"node.js는 Chrome v8 javascript 엔진으로 빌드된 javascript 런타임이다."

 

- Chrome v8 javascript 엔진은 기존에는 자바스크립트 프로그램을 웹 브라우저 위에서만 실행할 수 있었는데,

구글이 다른 엔진과 달리 매우 빠르고 오픈소스로 공개한 v8 엔진을 사용하여 크롬을 출시하면서 v8 엔진 기반의 노드 프로젝트가 시작되었습니다.

 

- 노드는 v8(자바스크립트 엔진)과 liubuv(비동기 I/O)라는 라이브러리를 사용하고, C와 C++로 구현되어있습니다.

 

이를 총 정리하면 "Node.js는 자바스크립트 프로그램이 서버로서 기능하기 위한 도구를 제공하고,

자바스크립트 프로그램이 동작하는 환경" 을 의미합니다.

 

4) 노드의 기본 개념

이벤트 (Event) : 클릭이나 네트워크 요청과 같은 상태를 변화시키는 작업

 

이벤트 드리븐(Event-driven) : 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식

 

이벤트 리스너(Event Listener) :  이벤트가 발생했을 때 그 처리를 담당하는 함수

// 이벤트 리스너에 콜백함수를 등록한다 = 특정 이벤트가 발생할 떄 무엇을 할지 미리 등록해두는 것.

 

호출 스택(Call Stack) : 자바스크립트 코드의 맨 위부터 한 줄씩 실행하다가 함수 호출 부분을 발견하면 함수를 호출 스택에 넣음. (함수는 실행되는 동안 호출 스택에 머물다 실행이 완료되면 호출 스택에서 지워짐.)

     * 호출 스택에 함수들이 너무 많이 들어 있으면 타이머에서 지정된 시간이 지난 후에도 지정한 함수가 실행되지 않         을 수 있음.

 

이벤트 루프(Event Loop) : 콜백함수 관리(호출함수 관리 + 실행 순서 결정) + 노드 종료까지 이벤트 처리 작업 반복

     * 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지 판단

     * 호출 스택이 비어있으면 테스크 큐에서 함수를 하나씩 가져와 호출 스택에 넣고 실행함.

 

백그라운드(Background) : 타이머나 이벤트 리스너들이 대기하는 곳

     * 자바스크립트가 아닌 다른 언어로 작성된 프로그램

     * 여러 작업이 동시에 실행될 수 있음.

 

테스크 큐(Task Queue, Callback Queue) : 이벤트 발생 후 백그라운드로 부터 타이머나 이벤트리스너의 콜백 함수를 받음.

     * 정해진 순서대로 줄을 서 있어 Callback Queue라고도 불림. (특정 경우에는 순서가 바뀌기도 함.) 

     * 실제로는 여러 개의 큐로 이뤄져 있음.

 

- 코드의 실행 과정

console.log("시작");

setTimeout(run, 3000);

console.log("종료");

 

위의 코드를 실행하면 다음과 같은 순서를 밟습니다.

5) 기타 기본 개념

동기와 비동기 : 백그라운드 작업 완료 확인 여부

      * 동기 : 요청과 응답이 동시에 진행 O

       - 한 프로세스가 끝나야 다음 프로세스가 실행되기에 비효율적

       - 비동기보다 비교적 쉬움.

         ex. A시작 -> A끝 -> B시작 -> B끝 -> C시작 -> C끝

 

      * 비동기 : 요청과 응답이 동시에 진행 X

       - 한 프로세스가 진행중이어도 다음 프로세스가 실행되기에 효율적

       - 동기보다 비교적 어렵고 복잡함.

         ex. A시작 -> B시작 -> A끝 -> C시작 -> B끝 -> C끝

 

블록킹과 논블록킹 : 함수가 바로 리턴되는지 여부

      * 블록킹 : 이전 작업이 끝나야만 다음 작업을 수행

       - 동기와 비슷하다. (-> 동기-블록킹 방식으로 사용이 많음.) 

 

      * 논블록킹 : 이전 작업이 완료될 때까지 대기하지않고 다음 작업을 수행 

       - 작업들이 모두 동시에 처리될 수 있어야 함.

       - setTimeout(콜백함수 , 0) 으로 노드에서 논 블록킹을 할 수 있다.

       - 실행 순서를 변경해 줌으로써 오래걸리는 작업이 끝날 때까지 기다려야하는 문제를 해결할 수 있다.

       - 비동기와 비슷하다. (-> 비동기-논블록킹 방식으로 사용이 많음.)

 

      * 동기- 블록킹 방식 : 백그라운드 작업 완료 여부를 계속 확인하며 호출한 함수가 바로 리턴되지 않고 백그라운드                                    작업이 끝나야 리턴됨.

      * 동기- 논블록킹 방식 : 호출한 함수가 바로 리턴되어 다음 작업으로 넘어가고 백그라운드 작업 완료 여부는

                                       신경쓰지 않다가 백그라운드가 알람을 주면 그제야 처리함.

 

프로세스와 스레드 

      * 프로세스 : 운영체제에서 할당하는 작업의 단위

       - 메모리 공유 X

 

      * 스레드 : 프로세스 내의 실행되는 플로우 단위

       - 메모리 공유 O

     

      * 싱글 스레드 : 하나의 스레드로 작업

      * 멀티 스레딩 : 여러 개의 스레드로 작업

      * 스레드풀(Thread pool) : 노드가 특정 동작을 수행 시 멀티 스레드를 사용 ex. 암호화, 파일 입출력, 압축

      * 스레드 : 노드에 얼마 전 안정화된 멀티 스레드를 가능하게 하는 기능. CPU연산 많을 때 용이하다

     

      // 기본적으로 노드는 싱글스레드 + 논블록킹모델을 사용. -> 네트워크, DB, 디스크 작업과 같은 IO작업에 특화

멀티 스레딩과 멀티 프로세싱

멀티 스레딩 멀티 프로세싱
1 process n thread n process
cpu 작업에 용이(계산작업 많은 경우) IO작업에 용이
프로그래밍 어려움 프로그래밍 쉬움