[ 백엔드 공부하기 : 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는 작업을 수행할 때,
해당 코드의 실행이 다른 코드의 실행을 막지 않기 위해 코드가 순서대로 실행되지 않습니다.
'Back_End > Node.js' 카테고리의 다른 글
[ 백엔드 공부하기 : Node.js ] NodeJS의 NPM이란? (0) | 2024.12.07 |
---|---|
[ 백엔드 공부하기 : Node.js ] NodeJS의 기본 동작 원리와 이벤트 루프, 브라우저 환경을 벗어난 JS 실행. (1) | 2024.12.06 |
[ 백엔드 공부하기 : Node.js ] NodeJS에 활용되는 JavaScript의 기본 동작 원리와 V8엔진. (2) | 2024.12.05 |
[ 백엔드 공부하기 : Node.js ] Node.js는 서버단에서 어떻게 JS를 실행할까. (0) | 2024.11.24 |
[ 백엔드 공부하기 : Node.js ] Node의 역할. (0) | 2024.11.17 |