Node.js 교과서 1장 [주제 : 노드란 무엇인가?]

김철준·2023년 2월 11일
0

node.js

목록 보기
1/6

node.js 교과서 학습을 시작해보겠다.
앞 포스팅에서 말한 것처럼 먼저 한번 읽어본 뒤 챕터에 대하여 개괄적으로 요약해보고 잘 이해가지 않는 부분과 궁금한 부분을 추가적으로 학습하는 방식으로 포스팅을 진행해보겠다.

node.js란 무엇인가?

node.js 공식 홈페이지에서 정의한 node.js는 다음과 같다.

Node.js는 chrome V8 javascript 엔진으로 빌드된 Javascript 런타임입니다.

이해가 가지 않는 단어들이 있다.
엔진은 무엇이고 런타임이란 무엇일까?

엔진

엔진에 관련해서는 언급만 되고 책에서는 자세한 설명이 없어서 따로 자료를 검색해보았다.

엔진이란 여러 역할을 하는데 쉽게 말해 컴파일러이다.

컴파일
javascript,java,c,python 등과 같은 고급 언어들은 컴퓨터가 바로 인식할 수 없기 때문에 컴퓨터가 이해할 수 있는 저급 언어(0과 1로 이루어진 기계어)로 컴파일되어야 소스 코드들이 명령어로 인식될 수 있다.
그래서 고급 언어는 컴퓨터가 인식할 수 있도록 저급언어로 변환되야하고 이 변환되는 것을 컴파일이라고 한다.

컴파일 방식에는 컴파일 방식과 인터프리터 방식이 있는데 여기서 두 방식까지 자세히 설명하지는 않겠다.

인터프리터 방식을 간단히 설명하자면 소스 코드 전체를 위에서부터 아래로 한줄씩 컴파일(기계어로 변환)하는 방식이다.

본론으로 돌아와 그렇다면 자바스크립트 엔진을 다시 정의해보면 자바스크립트를 컴퓨터에서 실행될 수 있도록 하게 해주는 컴파일러(인터프리터)라고 할 수 있겠다.

런타임

런타임이란 실행 환경을 말한다. 즉, javascript 런타임이란 자바스크립트를 실행할 수 있는 환경을 말하는 것이다.
그러면 node.js를 정의할 때에 왜 런타임이라는 단어를 강조했는지 생각해보자.

javascript는 node.js 등장 이전에 브라우저 환경에서만 작동할 수 있는 언어였다.

브라우저는 자바스크립트 런타임을 내장하고 있으므로 자바스크립트 코드를 실행할 수 있다.

즉, 브라우저가 아닌 환경에서는 작동할 수 없었다. 서버,데스크탑앱,모바일앱 등 환경에서는 javascript가 작동할 수 없었다는 것이다.

하지만 구글의 V8 엔진의 등장으로 브라우저외의 환경에서 javascript가 동작할 수 있도록 되었다.
그러므로 javascript가 동작할 수 있는 환경의 제약에서 벗어나 여러 환경에서 작동되게 되었으므로 node.js측은 정의할 때 실행 환경의 자유성을 장점으로 강조하고자 런타임이라는 단어를 강조하고 있다.

node.js로 코드를 어떻게 구성하냐에 따라 서버도 구성할 수 있고 모바일 앱,데스크탑앱도 구성할 수 있는 것이다.

여기서 추측할 수 있는 것은 google의 V8엔진은 javascript 브라우저에서도 작동하고 해주고 그 외에 환경에서도 작동하게 해줄 수 있는 짱짱맨 엔진이란 것을 확인할 수 있다.

특징

node.js는 이벤트 기반, 논 블로킹 I/O, 싱글 쓰레드라는 특징을 가지고 있다.

3가지 단어 모두 말이 참 어려운데 각 특징을 살펴보도록 하자.

이벤트 기반

노드는 이벤트 기반 방식으로 동작한다.

이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.

예를 들어, 클릭이라는 이벤트가 일어났을 때 특정 숫자가 증가하는 작업이 있을 수 있겠다.
그래서 클릭이라는 이벤트에 대비하여 미리 클릭 이벤트가 일어나면 숫자가 증가시키는 작업을 등록해두는 것이다.

그래서 이를 구현하기 위해 이벤트 리스너가 존재하고 이벤트 리스너에는 콜백 함수를 등록한다.

이벤트가 발생하면 이벤트 리스너에 등록된 콜백 함수가 실행된다.

이벤트 리스너를 이해하기 쉽도록 흔한 자바스크립트 코드를 확인해보자.

<button>Click me!</button>
<script>
  const $button = document.querySelector('button');
  $button.addEventListener('click',() => {
  console.log("숫자 증가")
  })
  
</script>

addEventListener가 이벤트 리스너이고 여기에 인수로 특정 이벤트와 이벤트 발생시 실행될 작업을 미리 등록해두는 것이다.

그래서 노드는 이벤트 기반 방식으로 작동하며
위처럼 이벤트 리스너에 이벤트를 등록하고 미리 지정할 작업을 콜백 함수로 구현한다.

논 블로킹 I/O

논 블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 방법을 제공한다.
뿐만 아니라 논 블로킹을 활용하면 I/O 작
업들은 동시에 처리될 수 있다.

I/O작업이란?
입력(input)/출력(output)을 의미한다. 파일 시스템 접근(파일 읽기,쓰기,폴더 만들기)이나 네트워크를 통한 요청 같은 작업이 I/O의 일종이다.

I/O작업은 백그라운드라는 곳에서 동시에 처리될 수 있다.
이 백그라운드는 자바스크립트가 아닌 다른 언어로 작성되어있기 때문에 동시에 실행될 수 있는 것이다.

예를 들어,
파일 읽기라는 I/O 작업이 있다했을 때, 3개의 파일을 읽는 작업이 동시에 요청이 된다면 백그라운드에서는 3개의 파일을 거의 동시에 읽을 수가 있다.

자바스크립트는 싱글 스레드 언어이기 때문에 동시에 실행될 수 없다.

멀티 프로세싱이란?
멀티 쓰레드는 여러 명의 직원이 효율적으로 여러 명의 손님을 상대한다고 하면 멀티 프로세싱은 여러 명의 직원이 해당 직원수대로만 손님을 감당할 수 있는 것인가?
예를 들어, 멀티 스레드는 직원이 3명이어도 9명의 손님을 처리할수있지만 멀티 프로세스는 직원이 3명이면 3명의 손님만 처리가 가능한 것?

싱글 스레드

자바스크립트는 싱글 스레드 언어이다.
노드 또한 자바스크립트로 작성해야하기 때문에 싱글 스레드의 특성을 가지고 있다.

싱글 스레드라는 것은 스레드가 하나라는 것이다.
그렇다면 스레드란 무엇일까?

스레드란 CPU의 코어를 하나만 사용하는 것을 말한다.

여기서 코어라는 것은 명령어를 처리할 수 있는 부품이고 CPU의 구성 항목 중 하나이다.

컴퓨터의 CPU는 대부분 여러개의 코어로 이루어져있다.
여러 개의 코어를 동시에 구동할 수 있는 것을 멀티쓰레드라하며 멀티스레드는 때문에 동시에 여러 명령어를 처리할 수 있다.

다시 돌아와 자바스크립트는 싱글 스레드언어이다.
때문에 여러 명령어를 동시에 처리하지 못하고 하나의 코어가 처리해야한다.

멀티 스레드가 싱글 스레드가 좋은 것은 맞지만 멀티 스레드로 프로그래밍하는 것은 어렵다고 한다.

노드로도 멀티 스레드를 구현할 수 있긴 하지만 난이도가 어렵다고 한다.

싱글 스레드라는 특성때문에 동시에 명령어를 처리할 수 없어 비효율적일 수 있지만 위에서 언급했던 논블로킹이라는 특성으로 백그라운드(자바스크립트 기반이 아니므로 동시에 여러 작업 처리 가능)에 여러 I/O 작업을 전가하면서 동시에 처리할 수 있다.

왜 서버로서의 역할로써 노드를 많이 사용할까?

노드는 서버로 많이 사용되고 있다.
앞서 살펴봤듯이 노드는 서버뿐만 아니라 모바일,데스크탑 등 여러 환경을 구성할 수 있었다.

그렇다면 왜 노드를 서버로써의 역할로 많이 사용하는 것일까?

  • 노드는 작업 크기가 작은 I/O 처리가 많을 때 유리하다.
    앞서 살펴봤듯이 노드는 I/O처리 작업은 백그라운드에 위임하여 동시에 처리할 수 있다고 학습했다.
    그리고 노드 특성상 작은 크기의 I/O 작업을 처리하는 것이 유리하기 때문에 크기가 작은 I/O 작업의 수가 많다면 노드를 사용하는 것도 나쁘지 않은 선택이다.

  • 노드에는 웹 서버가 내장되어있어 입문자가 쉽게 서버를 만들 수 있다.
    노드 외의 서버를 개발하다면 nginx와 같은 웹 서버를 별도로 설치하거나 Tomcat과 같은 WAS 서버도 별도로 설치해야한다.
    서버를 실행하기 위해서는 해당 프로그램을 실행해야한다.
    노드는 별도의 프로그램 설치없이 서버를 쉽게 구성할 수 있다.
    또한 다른 언어 프레임워크에 비해 서버를 실행하기 위한 과정도 어렵지 않다.
    또한 노드로 서버를 만들면 웹 서버로서의 기능과 WAS 서버의 기능을 동시에 한다.

  • 개발 생산성이 높다.
    Javascript 언어 하나만으로 프론트,백엔드를 구성할 수 있다는 점에서 개발 생산성이 높다.
    나와 같이 프론트를 하는 사람이 백엔드를 배워보고 싶다했을 때, 큰 러닝커브없이 배울 수 있다는 것이 장점이다.

위와 같은 특성으로 노드는 서버로써 많이 활용되고 있다.
위 특성을 살펴보면 노드로 서버 개발을 시작해보려는 사람은 허들이 적기 때문에 javascript로 프론트 개발을 한 사람에게 적절한 선택이 아닐까라는 생각이 든다.

서버외에는 노드를 어떻게 사용할까?

앞서 말했듯 노드는 여러 용도로 사용될 수 있다.

구체적인 예로는 웹,모바일,데스크탑 애플리케이션을 만드는데에도 사용될 수 있다.

노드 기반으로 돌아가는 대표적인 웹 프레임워크로는 리액트,뷰,앵귤러 등이 있고 모바일 측에서 돌아가는 대표적인 프레임워크는 리액트 네이티브가 있다.

데스크탑 애플리케이션의 예시로는 일렉트론이 있다.

이렇게 노드 환경에서 여러 가지 분야를 시도할 수 있으니 여러 시도를 해보는 것도 재미있을 듯 하다.

마무리

이번장에서는 노드에 대해서 알아봤는데 솔직히 노드가 서버 작업으로 큰 장점들을 가지고 있는 것 같진 않다.
(서버는 역시 Spring..?)

하지만 나와 같이 js로 프론트개발을 하던 사람이 서버 개발에 흥미를 붙여 시도해보고 싶다면 비교적 쉽고 빠르게 서버 개발에 접근할 수 있다.
그러니 나처럼 js로 프론트 개발을 하던 사람이 서버 개발에 흥미를 가지게 되었다면 node.js로 시작해보는 것도 나쁘지 않은 선택인 것 같다.

노드 버전 확인
현재 내 노드 버전은 14버전 LTS인데 홈페이지에서 확인해보니 2023.04.30까지만 지원한다하니 버전을 업데이트해줘야겠다.

profile
FE DEVELOPER

0개의 댓글