Back_End/Node.js

[ 백엔드 공부하기 : Node.js ] Node.js의 기초 정리.

안다미로 : APP & Web3 & D.S 2024. 11. 17. 14:08

 

 

 

 

[ 백엔드 공부하기 : Node.js ] Node.js의 기초 정리. 

 


 

∇ Node.js 기초 정리.

목  차

1. Node.js란
2. Node.js의 구조.

 


 

Ⅰ. Node.js란?


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

 

           ● " JavaScript " 를 서버측면에서도 사용가능하도록 만든 프로그램.

 

           ●  " V8 " 이라는 "JavaScript" 엔진 위에서 동작하는 자바슼릡트 런타임(환경) 입니다.

 

           ●  서버사이드 스크립트 언어가 아닌, 프로그램(환경)입니다.

 

           ●  ' Non-blocking I/O '  와 '단일 스레드 이벤트 루프 ' 를 통한 높은 처리 성능을 가지고 있습니다.

 

           ● 내장 HTTP 서버 라이브러리를 포함하고 있기 때문에,

              웹 서버에서 아파치 등의 별도 소프트웨어 없이 동작하는 것이 가능합니다.

 

 


   ◎ 이벤트 기반.

 

            ○ 이벤트가 발생할 때   "미리 지정해둔 작업" 을 수행하는 방식을 의미합니다.

 

            ○ Node.js 는   "이벤트 리스너" 에 등록해둔 "콜백함수"를 실행하는 방식으로 동작합니다.

 

            ○ 추후에, 이벤트 발생 시  '리스너'에 등록해둔  '콜백함수'를 호출하며,

                             이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기합니다.

router.get('/', (req,res,next) => {
  // router.get 이벤트에 대한 콜백함수 로직
}
* 흔히 사용하고 있는 router도 이벤트 기반으로 동작

 

            ○ "이벤트 루프"  == 이벤트에 따라 호출되는 콜백함수를 관리하는 것

 

 

 

   ◎ 이벤트 루프.

 

            ○ 여러 이벤트가 동시에 발생했을 때,  

                   어떤 순서로 '콜백 함수'를 호출할지를 "이벤트 루프가 판단"합니다.

 

            ○ Node는 이벤트가 종료되는 시점까지, 이벤트 처리를 위한 작업을 반복하므로 루프(loop)라고 부릅니다.

 

            ○ 즉 이벤트 루프는 " Node.js " 가 비동기 작업을 관리하기 위한 구현체입니다.

 

            ○ "비동기 작업" 들을 모아서 관리하고, 순서대로 실행할 수 있게 해주는 도구입니다.

 

 

 

   ◎ 런타임.

 

            ○ 프로그래밍 언어가 구동되는 환경

                  == 어떤 프로그램이 동작할 때, "프로그램이 동작하는 장소" !

 

            ○ JavaScript의 런타임은 대표적으로 '웹 브라우저' 였음.

                    -> Node.js라는 새로운 " 자바스크립트-런타임 "의 등장으로 브라우저가 아닌 곳에서도 실행 가능해졌습니다.

 

 

 

   ◎ 콜백함수 ( CallBack Function ).

                       

         ○  함수를 Parameter(파라미터)로 만들어 전달할 수 있는데, 이 넘겨주는 함수(파라미터)를 "콜백함수"라고 합니다.

 

         ○  내가 함수를 실행시키는 것이 아닌,  "파라미터로 보낸 함수가 실행 되는 것 ! "

 

         ○  함수가 실행되는 중간에 호출되어서,  

              상태 정보를 전달하거나 결과 값을 처리하는데 사용됩니다.

 

 


 

Ⅱ. Node.js의 구조.


 

   @ Node.js 는 C++을 베이스로 작성된 런타임 환경이고, 내부에는 V8 엔진을 가지고 있습니다.

               - > 덕분에, 크롬같은 브라우저에만 실행 가능하던 JS를 로컬에서도 실행가능하게 됨.

 


 

 

                 ++ 여기서 중요하게 봐야하는 것  == "libuv" 라는 라이브러리!

 

 

※ libuv.

 

        § "libuv"란,  C++로 작성된 Node.js가 사용하는 비동기 I/O 라이브러리입니다.

 

           √ "libuv"는 운영체제의 "커널"을 추상화한 라이브러리로, 커널이 어떤 비동기 API를 지원하는지 알고 있습니다.

 

           √ 우리가 "libuv" 에게 파일 읽기와 같은 "비동기 작업"을 요청하면,

                           "libuv"는 이 작업을 커널이 지원하는지 확인합니다.

 

               => 만약 지원한다면? : "libuv"가 대신 커널에게 비동기적으로 요청했다가 응답이 오면 우리에게 전달

 

               => 만약 요청한 작업을 '커널'이 지원하지 않느다면 자신만의 워커 스레드가 담긴, "스레드 풀"을 사용

 

 

☆ 결론.

 

       =   " Node.js " 는  " I/O 작업 " 을 자신의 메인 스레드가 아닌,

                 다른 스레드에 위임하여 싱글 스레드로 논 블로킹 I/O를 지원합니다.

 

        ==  " Node.js " 는 " I/O 작업 "을 libuv에게 위임하여  ' 논 블로킹 I/O '를 지원하고,

                그 기반에는 이벤트 루프가 있습니다. 

 

          *I/O작업이란

               : 입력(input) 과 출력(output)을 의미하는 것으로,  프로그램이 외부와 데이터를 주고받는 모든 과정.

 

          *논 블로킹 I/O작업이란

               : I/O작업을 요청할 때 해당 작업의 완료 여부와 상관없이, 즉시 제어권을 반환하는 방식.

 

 


 

※ 논 블로킹 I / O

 

         + 논 블로킹 I/O를 알아보기 전,  동기-비동기에 대해서도 알아야 합니다.

 

              ○ 동기(Sync) / 비동기(Async)의 차이점은  - >> "코드의 순서" 와 "실행 순서" 가 일치하는가?

              ○ 블로킹/ 논블로킹의  차이점은  - >> "코드의 실행" 이 "다른 코드"의 실행을 막는가??

 

                      ● 동기(Synchronous) : 코드가 순서대로 실행됩니다.

                      ● 비동기(Asynchronous) : 코드가 순서대로 실행되지 않습니다.

 

                      ● 블록킹(Blocking) : 코드의 실행이 다른 코드의 실행을 막습니다.

                      ● 논블록킹(Non-Blocking) : 코드의 실행이 다른 코드의 실행을 막지 않습니다.

 

 

      Async와 Non-Blocking이 주로 짝지어지고 Sync와 Blocking이 주로 짝지어지지만,

     이 둘은 완전히 동일한 개념은 아닙니다.

 

      Sync하면서 Non-Blocking할 수도 있고 Async하면서 Blocking할 수도 있지만,

      비효율적이고 부자연스럽기 때문에 그렇게 쓰이지 않을 뿐입니다.

 

 

☆ 즉, Node.js는 작업을 수행할 때, 

      해당 코드의 실행이 다른 코드의 실행을 막지 않기 위해 코드가 순서대로 실행되지 않습니다.