티스토리 뷰
Node란 무엇인가?
서버
Node를 통해 다양한 자바스크립트 애플리케이션을 실행할 수 있지만, Node는 서버 애플리케이션을 실행하는 데 제일 많이 사용됨
- 서버?
- 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 or 프로그램
- 클라이언트란 요청을 보내는 주체로, 브라우저 일 수도 있고, 데스크톱 프로그램일 수도 있고, 모바일 앱일 수도 있고, 다른 서버에 요청을 보내는 서버 일 수도 있음
- ex) 웹사이트 주소 입력 (요청)
⇒ 브라우저는 그 주소에 해당하는 컴퓨터 위치를 파악하고, 웹사이트 페이지를 받아와서 클라이언트에 띄워줌 (응답)
자바스크립트 런타임
- 런타임?
- 위키: 컴퓨터 프로그램이 실행되고 있는 동안의 동작
- 가상 머신: 자바스크립트를 웹 브라우저 바깥의 환경에서 돌아갈 수 있게 하는 프로그램
기존에도 자바스크립트 프로그램을 브라우저 외의 환경에서 실행하기 위한 시도가 있었지만 속도가 문제였음
라이언 달은 V8엔진 기반의 Node 프로젝트를 시작함 *(*구글이 V8 엔진을 사용하여 크롬을 출시하고 오픈 소스로 코드도 공개)
노드는 V8과 더불어 libuv라는 라이브러리를 사용함,
V8과 libuv는 C와 C++로 구현되어 있음 알아서 연결해주므로 Node를 사용할 때 C, C++를 몰라도 상관없음.
libuv 라이브러리는 Node의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현하고 있음 (자세한 내용은 추후 설명)
이벤트 기반
- 이벤트 기반(event-driven)?
- 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미함
- 이벤트로는 클릭이나 네트워크 요청 등이 있을 수 있음
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야 하는데 이것을 이벤트 리스너(event listener)에 콜백(callback) 함수를 등록한다고 표현함.
ex) 클릭 이벤트 리스너에 경고 창을 띄우는 콜백 함수를 등록해두면 클릭 이벤트 발생 시 콜백 함수가 실행돼 경고 창이 뜨는 것
발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면 노드는 다음 이벤트가 발생할 때까지 대기함
이벤트 기반 모델에서는 이벤트 루프라는 개념이 등장함
- 이벤트 루프?
- 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당함.
- Node가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 불림
논블로킹 I/O
이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있음
-
논블로킹 방식?
-
논블로킹이란 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 뜻함
-
오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 그 함수가 다시 태스크 큐를 거쳐 호출 스 택으로 올라오기를 기다리는 방식
-
논블로킹 방식이 같은 작업을 더 짧은 시간 동안 처리할 수 있음을 알 수 있음.
싱글 스레드라는 한계 때문에 자바스크립트의 모든 코드가 이 방식으로 시간적 이득을 볼 수 있는 것은 아님
현재 Node 프로세스 외의 다른 컴퓨터 자원을 사용할 수 있는 I/O 작업이 주로 시간적 이득을 많이 봄
- I/O?
- I는 입력(Input) / 출력(Output)을 의미함
- 파일 시스템 접근 (읽기, 쓰기, 폴더 만들기 등)이나 네트워크 요청 같은 작업이 I/O의 일종임 ⇒ 이러한 작업을 할 때 노드는 논블로킹 방식으로 동작함
블로킹과 논블로킹 말고도 동기와 비동기라는 개념도 있음 (자세한 내용은 추후 설명)