Node.js 기술 문제

게으른개발자·2020년 6월 25일
0

면접준비

목록 보기
4/6

1. Node.js란 무엇인가요? 어떤 프로그램을 만들 때 쓰이나요?

Node.js란 구글의 V8 자바스크립트 엔진 기반인 server-side scripting이다.

Node.js로 만들 수 있는 프로그램:

  • 비디오 스트리밍 웹 애플리케이션
  • 실시간 웹 애플리케이션 (예: 채팅)
  • 네트워크 애플리케이션

Node.js는 I/O 및 많은 클라이언트 연결과 관련하여 매우 효율적이다. 그러나 단일 쓰레드이기 때문에 CPU intensive한 작업엔 효율적이지 않다.

2. Node.js를 쓰는 이유는?

  • 자바스크립트 런타임이기 때문에 통일된 프로그래밍 언어와 데이터 유형을 제공한다.
  • 아파치 등의 별도의 소프트웨어 없이 http 서버라이브러리를 포합하고 있어 웹서버 동작이 가능하다.
  • Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능.
  • 겁나 빠르다.

3. Node.js의 단점은?

  • 비동기 방식의 싱글 스레드를 채용하기 때문에 콜백 지옥에 빠질 수 있다.

콜백 지옥과 해결

4. setTimeout(), setInterval(), setImmediate() 차이점

setTimeout(콜백 함수, ms):

일정 시간 이후 콜백 함수 실행

setTimeout은 함수의 참조 값을 받도록 정의되어 있는데 함수 뒤에 ( )를 붙여 인수로 전달하면 함수 실행 결과가 전달되어 버린다. 그런데 반환문이 없다면 호출 결과는 undefined가 되어 스케줄링할 대상을 찾지 못해, 원하는 대로 코드가 동작하지 않는다.

setInterval(콜백 함수, ms):

일정 시간 마다 콜백 함수를 반복

재귀적인 setTimeout vs. setInterval
setInterval 의 경우 콜백 함수의 실행에 의해 소비되는 일부의 interval 때문에 진짜 딜레이는 기재 된 것 보다 짧거나 길 수도 있다.
반면 재귀적인 setTimeout은 setInterval이 보장하지 못하는 실행간 딜레이를 보장할 수 있다.

setImmediate(콜백 함수):

콜백 함수를 즉시 실행

setImmediate()는 현재 이벤트 루프 주기 끝에 코드를 실행한다. 이 코드는 현재 이벤트 루프의 모든 I/O 작업 후 다음 이벤트 루프에 스케줄링 된 모든 타이머 이전에 실행된다.

setTimeout(func,0) vs setImmediate
파일 시스템 접근, 네트워크 같은 I/O 작업의 콜백 함수 안에서 타이머를 호출하는 특수한 경우엔 setImmediate가 먼저 실행 된다. 하지만 항상 그런 것은 아니며 솔직히 잘 모르겠으니 그냥 setImmediate 쓰자...

5. Node.js의 API 함수 종류

두가지의 함수가 존재: Blocking 함수, Non-Blocking 함수

Blocking

Node.js 프로세스에서 추가적인 JavaScript의 실행을 위해 JavaScript가 아닌 작업이 완료될 때까지 기다려야만 하는 상황

이는 이벤트 루프가 블로킹 작업을 하는 동안 JavaScript 실행을 계속할 수 없기 때문

예:

const fs = require('fs');
const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹

Non-Blocking

Non-blcoking 함수에선 I/O 작업이 멈추지 않고 비동기적으로 실행된다.

예:

const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
  console.log(data);
});

동시성과 처리량 (Concurrency and Throughput)

NodeJS에서 Javascript는 싱글 쓰레드(single thread)로 수행된다. 그래서 NodeJS에서 동시성이라 함은 다른 일을 마친 후, Javascript 콜백 함수를 수행하는 이벤트 루프의 수용량 말하는 것이다. 따라서 동시성을 높이기 위해 동시에 실행시킬 코드는 I/O와 같은 non-Javascript 연산이 일어날 때, 이벤트 루프가 계속 실행되도록 해주는 것이 좋다.

예를 들어 웹 서버에 대한 각 요청을 수행하는데 50ms가 걸릴 때 database I/O가 45ms 걸리고, 비동기적으로 처리한다고 생각하보자. 이렇게 non-blocking 비동기 연산 방식이기 때문에 45ms 동안 다른 일을 할 수 있게 되고 따라서 그 동안에 다른 요청을 처리할 수 있다. 이 점 때문에 blocking 함수 대신 non-blocking 함수를 사용하게 되면 더 많은 요청을 처리할 수 있다.

profile
딩코딩코딩

0개의 댓글