Node.js가 뭐예요

i do as i say·2020년 3월 18일
1
post-thumbnail

Node.js?

자바스크립트를 시작하면서 흔하게 볼 수 있었던 이름, 'Node.js'. 자바스크립트 같은데 왜 앞에 Node가 붙었을까? 하면서 휙 넘겼었다. 딱히 알고 싶지 않았고, 지금 하고 있는 자바스크립트도 벅찼기 때문. Node.js가 백엔드 같은 JS라는 말을 듣고 더 거리를 뒀었던 것 같다. 그런데 왜 갑자기 공부를 시작하냐. "자바스크립트 하나로 풀스택이 가능하고, 나의 작은 프로젝트들을 성공적으로 이끌 수 있을 것 같기 때문이다." 그러니까, JS로 프론트엔드를, Node.js로 서버를 만들면 되는 것 아닌가? 나처럼 포켓 사이즈의 사이드 프로젝트가 하고 싶어서 드릉거리는 사람에게는 딱 제격인 언어라는 말씀. 이제부터 왜 Node가 괜찮은지 설명하겠다.

Node.js 검색하면 나오는 키워드

V8엔진 이벤트 기반 논블로킹 I/O모델 비동기 단일(싱글) 쓰레드 NPM 런타임
Node.js(이하 노드)를 정의하자면 이 정도 나올 것이다. 그런데 나는 저 중에서 비동기라는 것만 제외하고 아무것도 몰랐다. 뭘 알아야 좋고, 나쁘고를 따지지. 그래서 짧게나마 요약과 해설을 해 본다.

V8 엔진

구글에서 만든 엔진. 기존 JS는 WEB이라는 한정적인 공간 안에서만 활약했었다. 그게 JS의 최대 장점이자 최대 단점이었는데, 구글사에서 크롬의 성능 향상을 위해 V8이라는 엔진을 오픈 소스로 만들었고, 그것에 기반하여 서버 사이드 언어인 Node.js를 만들게 되었다. Node.js가 나오면서 웹에 국한된 언어가 아닌 컴퓨터 자체에서 굴릴 수 있게 되었고, 아파치나 톰캣, PHP처럼 서버쪽에서도 동작이 가능하게 된 것. 경제적, 산업적으로 큰 파장이 일어, 천대(?)를 받던 자바스크립트가 급부상하기 시작했다. 왜? 자바스크립트 하나로 백엔드와 프론트엔드 둘 다 할 수 있거든!!

런타임

프로그램이 실행되고 있는 때에 존재하는 곳. 컴퓨터 내에서 프로그램이 가동이 되면, 그게 바로 그 프로그램의 런타임이다. (https://asfirstalways.tistory.com/99) 그러니까 노드는 자바스크립트의 런타임이라고 할 수 있다. 자바스크립트를 쌓아서 예쁘게 만들 수 있는 장을 말한다. 자바스크립트는 런타임이 두 개가 되겠지? 브라우저와 노드.js. 언어를 사용할 수 있는 공간을 일컫는 말이다.

이벤트 기반(event-driven)

이벤트라는 건 자바스크립트를 하면서 많이 봤을 것이다.

button.addEventListener("onclick", foo)
function foo() { console.log('이벤트입니다.') } //콜백

이런식으로 어떠한 것을 누르거나 행동을 취했을 때, 미리 만들어 둔 이벤트를 실행시키는 것을 "이벤트"라고 하는데, 노드는 이 이벤트를 기반으로 만들어졌다.
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해 둬야 한다. 발생한 이벤트가 없거나 발생했던 이벤트들을 다 처리하고 나면 노드는 다음 이벤트가 나올 때까지 대기한다.(https://thebook.io/006982/ch01/01/03/) 자바스크립트를 조금이라도 알고 있는 사람이라면 이벤트 루프에 대해서 알고 있을 텐데, (동시에 들어온 호출을 어떤 순서부터 내보내야 할지 정하는 것) 노드도 그와 같다. 이벤트 기반 시스템이라 try, catch, async, await 같은 키워드가 등장한 것 같다. 그냥 내 생각. ㅎㅎ

요건 글을 훑다가 발견한 내용. 태스크 큐, 백그라운드 같은 단어들을 몰라서 절절맸던 과거의 내가 짠해, 이곳으로 긁어 왔다. 자세한 건 아래 링크로.
(https://thebook.io/006982/ch01/01/03-04/)
• 이벤트 루프: 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당합니다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 불립니다.
• 태스크 큐: 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간입니다. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서 있으므로 콜백 큐라고도 부릅니다.
• 백그라운드: 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳입니다.

논블로킹 I/O 모델

논블로킹이란 블로킹의 반댓발(당연함) 논블로킹을 알기 전엔 블로킹을 알아야 되는데,
블로킹이란 자신의 수행 결과가 끝날 때까지 주도권을 자신이 가지고 있는 것을 의미한다.
논블로킹이란 자신이 호출을 당했을 때 제어권을 곧바로 호출한 쪽으로 넘기며, 자신을 호출한 쪽에서 다른 일을 할 수 있도록 하는 것을 의미한다.

그러니까, 블로킹 같은 경우엔 하나를 수행한다고 했을 때 다른 하나를 하기 위해서는 시작한 일을 끝날 때까지 멈추고, 기다려야 하는데, 이 논블로킹 같은 경우엔 수행이 여러 개 동시에 들어와도 멈추지 않으며 일단 주문을 받고, 수행이 끝나는 대로 바로 내어 주는 것이다.

I/O는 Input과 Output을 말한다. 고로 논블로킹 I/O 모델이란 입출력 처리를 시만 해 둔 상태로 완료되지 않은 상태에서, 다른 일들을 멈추지 않고 계속 진행할 수 있게 하는 법을 말한다. 애플리케이션 실행시 운영체제가 대기 큐에 들어가지 않고, 실행 여부와 관계없이 바로 응답을 보낸다. 개인적인 의견으로는 주로 콜백으로 소통할 것 같다.
전통적으로는 I/O 작업이 진행되면 I/O 작업만을 위해 다른 것들은 전부 멈추게 되는 방식을 사용하였으나, Node.js는 논블로킹 I/O 모델을 사용하여 굉장히 빠르다고 할 수 있다. (https://developer.ibm.com/technologies/linux/#N1004F)

비동기

논블로킹과 비동기를 같다고 생각하는 사람들이 많다. (나도 지금 그렇다.) 그런데 둘이 다르다고 하네....... 그것에 대해서 정리를 해 보았다.

논블로킹은 통신과 관련이 되는 언어이다. 네트워크 통신이 끊기지 않고 다른 것을 할 수 있냐, 요청이 발생하고 완료될 때까지 모든 일을 중단한 상태로 대기하냐 하냐의 문제라면 비동기와 동기는 말 그대로 동시에 일어나냐, 일어나지 않느냐이다.

비동기라는 것은 어떠한 문제가 주어졌을 때 요청한 결과까지 동시에 리턴이 되지 않고 나중에 처리가 되는 반면, 동기라는 것은 어떠한 문제와 함께 요청한 결과까지 동시에 일어나는 것이다. 그 자리에서 요청한 결과를 주겠다는 것으로, 시간이 얼마가 되었든 그것을 꼭 주겠다는 강한 의지(..)를 가졌다.

비동기는 setTimeOut 함수라고 생각을 하면 편하다.

비동기와 논블로킹 I/O에 대해서는 추후 따로 포스팅을 더 해야겠다.

단일 쓰레드

  1. 쓰레드가 뭐예요?
    일꾼이라고 생각하면 아주 좋겠다. 하나의 프로세스(직장) 안에 쓰레드(일꾼)들이 사용자를 위해 어떠한 수행을 계속 진행한다. 워드를 하고 있다고 가정했을 때, 내가 워드에 글을 쓰는 동안 파일을 주기적으로 저장하고, 자동으로 맞춤법을 검사하고 수정하는 등 이 모든 작업들은 각각의 쓰레드에 의해서 이루어진다. (https://donghoson.tistory.com/8) 쓰레드를 이용하면 하나의 프로그램에서 한 번의 하나의 일을 처리하는 게 아니라 동시에 많을 일을 처리할 수 있다는 것.

그렇다면 단일 쓰레드는 뭐예요?
싱글 쓰레드라고 부르는 이것은 요청을 받는 일꾼이 한 명밖에 없다는 것이다. (https://gocoder.tistory.com/1577)
노드는 싱글 스레드 기반의 이벤트 루프가 계속 돌아가면서 요청을 처리한다. 그렇기 때문에 가벼운 작업에 아주 효율적이고, 멀티 스레드보다 경제적이며 산업적인 효과가 크다. (싱글 스레드처럼 보이지만 아니라고 하는 고견도 보았다. 이것도 깊게 팔 수 있는 기회가 왔으면 좋겠다.)

NPM

node package manager의 약자로, 노드로 만들어진 모듈을 웹에서 받아 설치하고 관리해 주는 프로그램이다. 노드를 쓰는 사람들이 노드를 위한 모듈을 개발해 NPM에 올리고, 공유하고 사용할 수 있다. 자바스크립트는 모듈을 모으고 모아 하나의 거대한 집합체가 탄생이 된다고 생각하는데, NPM이라는 모듈의 장(??)은 자바스크립트의 특성과 아주 어울린다고 생각한다. Node를 설치하면 자동으로 npm이 깔리고(물론 초기 설정을 해 줘야 되지만) npm으로 인해 express나 bodyparser 같은 모듈을 설치, 사용할 수 있다. npm은 설치로 끝나는 게 아니라 매번 업데이트 때마다 알림을 해 주는 등 정말 매니저 같은 모양새를 보이는데, node를 쓴다면 빠지지 않고 쓰게 될 아주 좋은 프로그램이다.

그래서, Node.js란?

(https://junspapa-itdev.tistory.com/3)
자바스크립트의 런타임이자, 비동기 논블로킹 I/O와 단일 스레드 이벤트 루프 등으로 아주 효율적인 처리 성능을 가지고 있는 네트워크 애플리케이션 개발에 사용이 되는 소프트웨어 플랫폼이다.

브라우저에 갇혀 있던 자바스크립트를 밖으로 빼낸 일등공신. 브라우저 밖에서도 활동이 가능하게 해 준 아주 똑똑하고 고마운 녀석.

개발이 빠르고 쉽게 이루어지며(..) 서버 설치부터 띄우는 것까지 아주 쉽다. 아파치, 톰캣이 없어도 서버를 띄울 수 있음! 그렇기 때문에 사이드 프로젝트나 게시글, 스트리밍 등 간단하고 빠르게 할 수 있는, 데이터를 옮기고 움직이게 하는 웹서비스에 알맞다. 대용량으로 데이터를 다루거나 단일 처리가 오래 걸리는 프로젝트엔 어울리지 않는다. 오버워치로 따지자면 트레이서 같은 존재라고 해야 되나. 날쌔고 재빠른 이미지가 크다.

profile
커신이 고칼로리

0개의 댓글