본문 바로가기
Framework/NODEJS

[NODEJS] NODE.JS란 무엇인가? 핵심 개념 이해하기

by 알파쿼카 2023. 7. 13.

노드가 무엇인지, 어디에 쓰이는지, 누가 쓰는지 알아보고, 노드의 핵심 개념을 알아봅시다.

 

이번 글에서는 노드와 관련된 코드는 나오지 않지만, 노드의 핵심 개념을 다루므로 꼭 읽어보길 바랍니다.
많은 노드 입문자가 핵심 개념을 충분히 이해하지 못한 채 코딩부터 시작하다가 어려움을 겪습니다.
만약 여러분이 이미 런타임, 이벤트 기반, 논 블로킹 I/O, 싱글 스레드 모델이 무엇인지 알고 있다면 다음 글로 넘어가도 좋습니다.


노드 공식 사이트에서는 노드를 다음과 같이 설명하고 있습니다.
Node.js는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임입니다.

 

대부분의 사람들은 노드를 서버로 사용하는 방법을 익히기 위해 정보를 찾지만
공식 사이트의 노드 소개글에는 서버라는 말이 없으니 당황스러울 수 있습니다.
그러나 서버라는 말이 없는 이유는 노드가 서버만 실행할 수 있는것이 아니기 때문입니다.


서버와 런타임

 

1) 서버

노드는 서버 애플리케이션을 실행하는데 제일 많이 사용한다.

서버: 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말한다.

클라이언트: 요청을 보내는 주체(브라우저, 데스크톱 프로그램, 모바일 앱, 다른 서버에 요청을 보내는 서버...)

 

ex)

어떤 웹사이트를 방문한다고 생각해보자.

주소창에 주소를 입력(요청)

브라우저는 주소에 해당하는 컴퓨터 위치를 파악

그 컴퓨터로부터 웹 사이트 페이지를 받아와서 요청자의 브라우저(클라이언트)에 띄운다(응답)

 

이런 일을 하는 컴퓨터가 바로 서버입니다.

 

ex)

모바일 앱을 설치하는 경우를 생각해보자.

구글 플레이 스토어나 애플 앱스토어에서 원하는 앱을 고른 후

설치 버튼을 누르면(요청) 내려받기(응답)가 시작됩니다.

앱 설치파일은 이미 어딘가에 저장되어 있으므로 여러분이 그곳에서 데이터를 받아와 모바일 기기에 설치할 수 있는 것입니다.


그 어딘가가 구글과 애플의 서버입니다.

플레이스토어와 앱스토어는 클라이언트 역할을 하는 것이고요.

 

웹이나 앱을 사용할 때 데이터가 생성된다(아이디, 비밀번호, 이메일 등)

이 데이터를 어딘가에 저장하고

그 어딘가에서 데이터를 받아와야한다.

 

이곳이 바로 서버이다.

 

서버라고해서 요청에 대한 응답만 하는 것은 아니다.

다른 서버에 요청을 보낼 수도 있다.

이때는 요청을 보낸 서버가 클라이언트 역할을 한다.

 

정리

서버는 클라이언트의 요청에 대해 응답한다.

응답으로 항상 YES를 해야하는 것은 아니고, NO를 할 수도 있다.

여러분이 어떤 사이트로부터 차단당했다면 그 사이트의 서버는 여러분의 요청에 매번 NO를 응답할 것이다.

 

노드는 자바스크립트 프로그램이 서버로서 기능하기 위한 도구를 제공하므로 서버 역할을 수행할 수 있다.

왜 굳이 노드를 사용해서 서버를 만들까?

이 궁금증을 해결하려면 노드의 특성을 알아야한다.

 

2)자바스크립트 런타임

 

공식 사이트에 게시된 노드 소개글을 다시한번 보자

 

노드 공식 사이트에서는 노드를 다음과 같이 설명하고 있습니다.
Node.js는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임입니다.

 

노드는 자바스크립트 런타임이다.

런타임: 특정 언어로 만든 프로그램들을 실행할 수 있는 환경이다.

따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있습니다.

쉽게말해 노드는 자바스크립트 실행기라고 봐도 무방하다.

따라서 자바스크립트를 모른다면 노드를 전혀 활용할 수 없습니다.

 

기존에는 자바스크립트 프로그램을 웹 브라우저 위에서만 실행할 수 있었으나

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

브라우저 외의 환경에서 자바스크립트를 실행하기 위한 여러 시도가 있었으나, 자바스크립트의 실행 속도 문제 때문에 모두 큰 호응을 얻지는 못했다.

 

하지만 2008년 구글이 V8 엔진을 사용하여 크롬을 출시하자 이야기가 달라졌다.

당시 V8엔진은 다른 자바스크립트 엔진과 달리 매우 빨랐고, 오픈소스로 코드를 공개했다.

속도 문제가 해결되자 라이언 달은 2009년 V8 엔진 기반의 노드 프로젝트를 시작했다.

 

노드는 V8과 더불어 libuv라는 라이브러리를 사용합니다.

V8과 libuv는 C와 C++로 구현되어 있다.

코딩한 자바스크립트 코드는 노드가 알아서 V8과 libuv에 연결해주므로, 노드를 사용할 때 C와 C++은 몰라도 된다.

 

libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있습니다.

 

3) 이벤트 기반

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

ex) 클릭이나 네트워크 요청...

 

이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야합니다.
이를 이벤트 리스너에 콜백 함수를 등록한다고 표현합니다.

버튼을 클릭할 때 경고창을 띄우도록 설정하는 것을 예로 들어보겠습니다.

클릭 이벤트 리스너에 경고창을 띄우는 콜백 함수를 등록해두면 클릭 이벤트가 발생할 때마다 콜백