Node.js 공부기(3)

6488 단어 node.jsTILTIL

5장, 서버 만들기(http)

Node.js에서 가장 비중 있게 사용하는 모듈을 꼽으라면 당연히 http를 꼽을 수 있다. 서버의 역할이나 웹 서버로 사용하기 위함인데, 당연히 http 모듈 혹은 https 모듈은 필수이다.

http

  • 기본적으로 네트워크를 사용하는 모든 모듈은 실시간 응답이 불가능한 비동기 함수들이다.
  • 콜백을 통해 응답하는 함수라는 것을 기억하자.

비동기로 처리하는 이유는 Node.js가 싱글 스레드 기반이므로, 하나의 스레드가 많은 일을 동시에 처리하기 위해서는 이벤트 기반의 비동기 처리가 가장 적합하기 때문이다.

위의 말을 다 이해하면 좋겠지만, 잘 이해가 안된다면 두 가지만 기억하도록 하자.

첫째, 콜백을 통해 응답한다.
둘째, 싱글 스레드이다.

사실 책에 있는 예제와 말들을 읽었을 때 제대로 이해되지 않고 약간 애매한 부분들이 있어서 구글링을 통해 더 검색해 보았는데, 그제서야 이해가 되었다. 먼저 싱글 스레드에 대해 자세히 알아보자.

싱글 스레드

싱글 스레드에 대해 검색하면 전문적이고 어려운 단어들이 많은데, 여기서는 그렇게 설명하지 않기로 하겠다. 스레드는 실행중인 프로그램 내에서 작업을 처리해주는 일손이라고 이해하면 좋을 것 같다.

근데 처음에는 나도 이렇게 생각했다. "아니, 여러명이 일을 하는게 당연히 혼자 하는 것보다 더 좋은 것 아닌가? 왜 싱글 스레드를 쓰는 거지?"

그에 대한 해답은 멀티 스레드를 사용할 때의 단점들 때문이다.

단점

  • 스레드를 만들고 없애는 데에 비용이 발생한다.
  • 서버자원은 한정적이기 무한정 스레드를 증가시킬 수 없다.
  • 자원을 공유하기 때문에 공유자원 접근 문제가 발생. thread-unsafe라고 표현하기도 함.

싱글 스레드의 장점은 다음과 같다.

장점

  • 멀티스레드에 비해 자원을 적게 사용한다.
  • 자원을 혼자만 사용하므로 공유자원 접근문제에 자유롭다.

여기까지만 보면 자원만 풍부하다면 멀티스레드를 사용하는 것이 더 좋아보인다. 하지만 아직 콜백에 대한 이야기가 남았다.

콜백

콜백은 어떤 일이 들어왔을 때 작업이 끝나면 끝났다고 call해주는 함수를 말한다. 함수의 return은 너무나도 당연한 말인데, 이게 강력한 이유에 대해 설명하겠다.

Blocking Code

말그대로 어떤 작업을 실행하고 기다리면서 코드가 “막히”게 되는 것을 말한다. 예시를 보자.

출처 : Node.js 강좌 6편 : Call back function 개념 - https://velopert.com/255

우선, input.txt 라는 텍스트파일을 생성해줍니다.

Let's understand what is a callback function.
What the HELL is it?

그 다음, main.js 를 작성하세요.

var fs = require("fs");

var data = fs.readFileSync('input.txt');

console.log(data.toString());
console.log("Program has ended");

이제 결과값을 확인해볼까요?

$ node main.js
Let's understand what is a callback function.
What the HELL is it?
Program has ended

결과값은 우리가 익숙한 출력 순서 그대로 나왔다. 여기까지는 신기한 것이 없고 당연하다. 그러나 밑의 경우는 좀 다르다.

Non-Blocking Code

input.txt 는 위 예제에서 사용한 똑같은 파일을 사용합니다.

main.js 를 이렇게 수정해보세요.

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("Program has ended");

모든 Node 어플리케이션의 비동기식 함수에서는 첫번째 매개변수로는 error를, 마지막 매개변수로는 callback 함수를 받습니다.
fs.readFile() 함수는 비동기식으로 파일을 읽는 함수이고, 도중에 에러가 발생하면 err 객체에 에러 내용을 담고
그렇지 않을 시에는 파일 내용을 다 읽고 출력합니다.

결과는?

Program has ended
Let's understand what is a callback function.
What the HELL is it?

readFile() 메소드가 실행 된 후, 프로그램이 메소드가 끝날때까지 대기하지 않고 곧바로 다음 명령어로 진행하였기 때문에,
프로그램이 끝났다는 메시지를 출력 한 후에, 텍스트 내용을 출력했습니다.

물론 프로그램이 종료된 이후에 readFile이 진행된 것은 아니다. 다만, 비동기식으로 코드가 진행되었기 때문에 먼저 작업이 완료된 순서로 출력이 진행된 것이다. 만약 마지막 줄이 console.log()가 아니라 fs.readFile보다 더 시간이 오래 걸리는 함수였다면 fs.readFile이 먼저 실행되었을 것이다.

이제 다시 앞에서 한 말을 보자.

이벤트루프를 활용한 논블로킹I/O를 통해 고성능 병렬처리가 가능하기 때문에 강력하다.

어떤 일이 들어왔을 때 "여러 가지 일을 병렬로 동시에 진행할 수 있다"는 것은 더 많은 양의 요청을 빠르게 수행할 수 있다는 말이므로 속도 측면에서 blocking code보다 상당한 이점을 가진다. 물론 여러 가지 일이 전부 다 굉장히 오래 걸리는 일이라면 전체적으로 속도가 느려지는 단점이 있겠지만 말이다.

좋은 웹페이지 즐겨찾기