본문 바로가기
Node.js

[Node.js] 노드제이에스 - 논블로킹I/O

by Seong-Jun 2024. 2. 6.
728x90
반응형
SMALL

Do it! Node.js 프로그래밍 입문 4일차 입니다.

 

노드에서는 대부분의 작업을 비동기로 처리합니다. 이것은 노드가 논블로킹I/O로 동작하기 때문입니다.

 

블로킹I/O

블로킹이란 코드 실행을 중간에 막는 것으로 코드 실행이 멈춘다는 뜻입니다. 동기함수를 사용하면 블로킹, 즉 코드 실행을 막는 현상이 발생할 수 있습니다.

const fs = require("fs")
const data = fs.readFileSync("./03/example.txt") // 블로킹
console.log(data) // 파일읽기 끝날때까지 대기
console.log("The End")

 

위에 코드는 간단해서 큰 차이를 못느낄 수도 있지만 서버를 사용할 때는 더 문제가 됩니다.

 

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('404');
})

server.listen(3000, () => {
    console.log("3000번 포트에서 실행 중")
})

 

다수의 사용자가 동시에 접속해도 현재는 문제가 없습니다. 근데 코드의 주석부분의 주석을 지우면 아래와 같은 문제가 발생합니다.

웹 브라우저는 작업을 완료하기 전까지 계속 로딩중일 것입니다. 작업이 완료되면 다시 정상으로 돌아갑니다. 서버에서 I/O가 블로킹 된다면 이런 문제가 발생합니다. 그래서 블로킹이 생기지 않게 하기 위해 비동기 처리를 해서 논블로킹으로 바꿔야 합니다.

 

비동기 처리는 시간이 걸리는 작업을 잠시 빼놓고 즉시 실행 가능한 작업을 먼저 하는데 이때 빼놓은 작업은 이벤트 루프에서 처리를 해줍니다.

 

// blocking
const fs = require("fs")
const data = fs.readFileSync("../03/example.txt") // 블로킹
console.log(data) // 파일읽기 끝날때까지 대기
console.log("The End")
console.log("--------------------------")

// non-blocking
const fs1 = require("fs")
fs1.readFile("../03/example.txt", "utf8", (err, data) => {
    if(err) console.log(err)
    console.log(data)
})
console.log("The End")

 

백엔드 개발에서 네트워크와 관련된 작업을 할 때는 중간에 멈추는 일이 없도록 비동기 처리를 하는데 이것을 논블로킹I/O라고 합니다.

728x90
반응형
LIST

댓글