Ryu.log

[ NodeJS 04 ] 이벤트 기반, 싱글쓰레드, 논블러킹I/O 본문

Prev-content

[ NodeJS 04 ] 이벤트 기반, 싱글쓰레드, 논블러킹I/O

류뚝딱 2018. 7. 12. 12:25



이전에 이벤트 루프를 알아야만 이벤트 기반, 싱글쓰레드, 논블러킹 I/O 에 대해 이해할 수 있다고 설명했다.

3강 에서 이벤트 루프를 통해서 함수의 호출을 인위적으로 조절 가능한 것을 알았으며,

2강 에서는 Node프로그램 hello Node도 실행시켜 보았다.


그렇다면 실제 서버로 이용하려면 어떻게 해야 할까?

어떻게 해야 Node가 서버의 역활을 할 수 있을까?


먼저 서버에 대해 알아보자

간단히 설명하면 요청을 받아서 응답을 하는것을 서버라 한다.

요청을 보내는 주체는 클라이언트(사용자)라 한다.


클라이언트는 서버에 요청을하고 서버는 그에대해 응답을 한다.

또한 서버가 클라이언트가 될 수도있다. 서버가 서버에게 요청을 보내는것이다.


요청의 특징은 언제올지 모른다는 것이다. ( 유저가 서버로 보내는 모든 요청 방문, 댓글등록 등등.. )

언제 요청이 올지모르는 서버는 계속 기다리고 있어야 한다.



01. 이벤트 기반

요청이 언제올지 모르는 서버는, 계속하여 대기한다.

아무런 코드 없이 기다릴 수는 없고 이벤트 리스너라는 것을 이용한다.

이벤트 리스너는 말 그대로 해당 이벤트에 대해 대기중인 것! 

항상 리스닝 중 이다. 해당 이벤트가 발생했을 때 등록했던 이벤트 리스너가 실행된다.

예를 들어서 이벤트 리스너   "유저가 방문 하면 HTML 줘 라는 명령(콜백 함수로 구성 되어있음)이 있다고 치자,

호출스택테스크 큐 에 다른 실행문이 없을 때, 클라이언트의 방문 이벤트가 발생되면

이벤트 리스너 에 등록된  "유저가 방문 하면 HTML 줘 라는 명령은 테스크 큐 로 들어가고 (콜백 함수테스크 큐로 들어간다.)

테스크 큐 에 들어간  "유저가 방문 하면 HTML 줘 라는 명령은 곧장 호출 스택으로 이동하여 클라이언트에게 HTML을 전달하여 

사이트를 보여주게 된다.


이렇게 이벤트 리스너 통해  응답하는것을 이벤트 기반 이라한다. 



02. 논블러킹 I/O

이번에는 논 블러킹 I/O 를 알아보자.

논 블러킹 이라 함은 무언가를 막지 않는다는 뜻이다.
논 블러킹호출스택테스크 큐로 설명이 가능하다.

3강에서 진행 했던 코드를 보자.
function run() {
  console.log('3초 후 실행');
}
console.log('시작');
setTimeout(run, 3000);
console.log('끝');
앞서 계속 설명했지만 setTimeout호출스택이아니라 테스크 큐로 보내진 뒤에 호출스택이 끝난뒤 실행된다.
그래서 코드가 순서대로 읽혀지는 것이아니라 순서의 핸들링이 가능해진다.

논 블러킹 은 순서의 문제이다, 순서가 눈에 보이는 순서와 다르면 논블러킹이라 일컫는다.

그렇다면 I/O는 무엇일까 I/O는 Input / Output 이다.
크게 두가지만 외우면 된다.
파일 시스템과 네트워크이다.

파일시스템 은 프로그램이 파일열고, 닫고, 쓰고 이러한 것들을 파일시스템 I/O 라 하고,
네트워크 는 네트워크 요청을 보내고, 받고 하는 것을 네트워크 I/O 라 한다.

이런것들은 자체적으로 논블러킹을 지원하고, 그래서 논블러킹 I/O라 한다.


03. 싱글스레드

싱글스레드란 팔이 하나인것을 말한다. 한번에 하나의 일만 처리할 수 있다.
반대로 멀티스레드란 ? 팔이 여러개인것이다. 한번에 여러개의 일을 처리 할 수 있다.

JavaScript 언어의 특성은 싱글스레드이다.
싱글스레드이기 때문에 블러킹이 발생하는 것이다.
팔이 한개이기때문에 한가지 일만 가능하니, 한가지일을 처리하는동안 나머지 할일을 대기시킨다.
그것을 극복하기 위해 논블러킹으로 순서를 변경시켜서 효율적으로 처리하기위한 움직임이나
멀티 스레드를 비슷하게 따라하려는 움직임 들이 있으나

기본적으로 JavaScript싱글스레드이다.


Comments