1. 스레드
작업을 처리학 위해 자원을 사용하는 단위를 가리킵니다. 하나의 작업이 실행되는 최소 단위
자바스크립트에서는 이런 스레드가 하나밖에 없어서 한 번에 하나의 작업만 처리할 수 있습니다.
반면에 자바를 비롯한 대부분의 백엔드 프로그래밍 언어는 멀티 스래드 언어입니다. 스레드를 여러 개 가지고 있어서 동시에 여러 작업을 실행할 수 있습니다.
2. 블록킹I/O 과 논블록킹I/O
2.1 블록킹I/O
여기서 I/O는 Input과 Output을 나타내며 자료를 주고박은다는 의미를 가집니다. 블로킹이란 코드 실행을 중간에 막는 것으로 코드 실행이 멈춘다는 뜻입니다.
파일을 읽는 데 5초가 걸린다면 5초 동안 프로그램을 멈추고 사용자는 필요한 정보를확인할 수 없는 상태가 되는 동기 함수를 사용한다고 가정하면 블로킹, 즉 코드 실행을 막는 현상이 발생할 수 있습니다.
블로킹이 문제가 되는 것은 서버를 사용할 때 입니다. HTTP 모듈을 사용해서 서버를 만들고 라우팅 코드에 for문을 여러개 넣어 시간이 걸리는 요청을 한다면, 시간이 걸려서 탭 부분에 로딩 중을 뜻하는 아이콘이 표시되면서 이후에 다른 요청을 하더라도 모두 멈춘다는 것입니다. 흔히 우리가 말하는 서버가 뻗는 증상이 나타납니다.
// 서버에서 블로킹 I/O - 시간이 많이 걸리는 코드가 있다면?
const http = require("http");
const server = http.createServer((req,res)=> {
if(req.url === "/home"){
res.end("HOME");
}else if(req.url === "/about"){
for(let i =0; i<1000; i++){
for(let j =0; j<1000; j++){
console.log(`${i}${j}`);
}
}
res.end("ABOUT");
}else{
res.end("Not Found");
}
});
server.listen(3000, ()=>{
console.log("3000번 포트에서 서버 실행 중")
})
2.2 논블록킹I/O
코드를 작성할 때 블로킹이 생기지 않게 하려면 비동기 처리를 이용해야 합니다. 비동기 처리를 하면 코드를 실행하다가 시간이 걸리는 작업은 잠시 옆으로 빼놓고 즉시 실행해야 할 작업 먼저 처리합니다. 서버는 네트워크를 통해 클라리언트와 자료를 주고받아야 하는 작업에서 주고 받는 데이터 양도 다르고 네트워크 속도도 일정하지 않아 시간 지연을 항상 고려해야 합니다. 그래서 네트워크와 관련된 작업을 할 떄는 중간에 멈추는 일이 없도록 비동기 처리를 하는 것을 논블로킹I/O라고 합니다
3. 이벤트 루프
노드에서 콜 스택을 사용해 코드를 작성하 순서대로 실행하지만, 시간이 많이 걸리는 작업을 만나면 잠시 콜백 큐에 저장해 두었다가 콜 스택이 비면 하나씩 꺼내 와 처리하는 과정을 이벤트 루프라고 합니다.
* 아래 작업 사진은 Do IT Node.js입문 교재 p.175~p.179를 참고해주세요
3.1 콜 스택
노드는 V8 엔진을 사용해서 자바스크립트 코드를 처리합니다. V8 엔진 안에 콜 스택이라는 요소가 있어서 순서대로 작업을 가져와 처리합니다. 콜 스택은 콜이 스택형태로 모여 있다는 끗입니다. 함수를 실행할 때 ''함수를 호출한다"고 하죠?콜이란 바로 실행하려는 함수들입니다. 콜 스택은 후입선출 자료구조의 특성을 가집니다.
동기 작업이 더 있다면 작업을 하나씩 순서대로 가져와서 콜 스택에 넣고, 작업을 처리한 후 콜 스택에서 제거하는 방식입니다.
3.2 콜백 큐 ,이벤트 루프로 비동기 처리
노드에서 비동기 처리를 하는 원리가 바로 이벤트 루프입니다. V8 엔진의 콜 스택은 실행할 순서대로 함수를 가져오므로 지동기 처리를 할 수 없습니다. 그래서 V8 엔진에서 비동기를 처리할 수 있는 라이브러리 libuv를 사용합니다. libuv는 Node API와 콜백 큐라는 구성 요소를 가지고 있습니다. 콜백 큐는 콜백 함수가 큐 형태로 저장되는 공간입니다. 콜백 큐는 선입선출 자료구조의 특성을 가집니다.
콜 스택에 있는 함수가 비동기 함수라면 일단 libuv로 옮깁니다. 그럼 콜 스택이 비었으므로 다음에 처리할 작업을 콜 스택으로 가져옵니다. 콜 스택에 있는 작업을 제거하고 다시 불러올 함수가 없다면 libuv를 살펴봅니다. 비동기 함수 시간이 지나면 처리할 콜백 함수를 콜백 큐로 옮깁니다. 노드는 콜 스택이 비어 있는지 계속 체크합니다. 콜 스택이 비어 있다면, 즉 당장 실행할 작업이 없다면 그때서야 콜백 큐에 있는 콜백 함수를 콜 스택으로 옮깁니다. 이렇게 콜 스택과 콜백 큐를 번갈아 살펴보면서 처리할 순서를 결정합니다.
위 내용은 DO IT Node.JS 입문 책을 참고하여 작성되었습니다.
'Node.js' 카테고리의 다른 글
K6 성능 테스트 (0) | 2024.04.02 |
---|---|
04. 네트워크 기초 및 서버 만들기 (0) | 2024.02.12 |
03. path, File System 모듈과 스트림 (0) | 2024.02.12 |
02.자바스크립트 기초 문법과 모듈 (1) | 2024.01.31 |
[서평] Do it! Node.js 프로그래밍 입문 (0) | 2023.11.27 |