Multi Developer SuHo

Node.js 란 무엇인가? 본문

Node.js 기록

Node.js 란 무엇인가?

Dreaming Developer Student 2025. 2. 18. 09:43
SMALL

안녕하세요~ 자바스크립트가 마무리되면서 이제 Node.js 에 대해 배워볼려고 합니다. Node.js가 무엇이고 Node.js를 왜 사용하는지, Node.js의 특징을 알아보는 중점으로 짚어보겠습니다. 

📘 목차
1. Node.js 란?
1-1. Node.js 공식 사이트

1-2. Node.js의 등장배경
1-3. Node.js의 인기
1-4. Node.js가 서버?
1-5. Node.js의 블로킹 OR 논블로킹
1-6. Node.js의 이벤트 루프 동작 방식
2. 스레드 &  libuv
2-1. Node.js 워커 스레드와 libuv
2-2. 워커 스레드란?
2-3. libuv 란?
3. Node.js 문법 
3-1. Node.js 모듈 레퍼

서론

먼저 이 글을 보기전에 Node.js 라고 들어보셨을까요?  대부분 개발 직무라면 들어보셨을 겁니다. Node.js 라고 들으셨을 때는 js? 자바스크립트와 관련되어 있나? 이렇게 생각하게 됩니다. 과연 관련이 있을지 피드를 보면서 생각해보시죠

본론

1. Node.js 란?

Node.js는 Chrome V8 엔진으로 빌드된 서버 측 JavaScript 런타임 환경


+ V8 엔진 로고



1-1. Node.js 공식 사이트
공식 사이트 들어가셔서 각 운영체제에 맞게 설치하시면 됩니다.

설치가 된것을 확인하고 싶으시다면 Cmd 창을 열어서 node -v 를 확인합니다. (Node.js 의 버전을 확인)


https://nodejs.org/ko

 

Node.js — 어디서든 JavaScript를 실행하세요

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org


1-2. Node.js의 등장배경


Node.js 출시전 


Node.js 가 출시되기 전에는 자바스크립트가 웹 브라우저에서만 실행되었습니다. 즉, HTML 요소와 함께 상호작용하며 버튼이나 해당 이벤트가 발생했을 때 특정 기능이 동작하도록 하는 방식으로 진행되었습니다. 



Node.js 등장한 이유 

 

웹 애플리케이션이 점점 복잡해지고 실시간으로 처리하는 수요가 급증하면서 이에 대응할 수 있도록 빠르고 가벼운 서버 기술의 필요성을 느끼게 됩니다.


이에 라이언 달(Ryan Dahl)이 2009년, 구글 V8 자바스크립트 엔진을 기반으로 자바스크립트를 서버에서도 실행할 수 있도록 Node.js를 개발하게 되었습니다.

 


1-3. Node.js의 인기

 node js 싱글 스레드(사실상 멀티 스레드) 자바스크립트를 활용한 서버측 로직을 작성하기 위해서 비동기 이벤트 기반 아키텍처를 사용 성능이 좋고 확장성을 제공한다.


1-4. Node.js가 서버?


먼저 Node.js 는 서버가 아닙니다.  Node.js 는 웹 서버를 구축할 수 있도록 도와주는 엔진입니다.
- nodejs는 자체가 서버가 아니고 웹서버를 구축할 수 있는 로직을 작성할 수 있게 해주는 엔진
- javascript를 배워서 javascript로 서버로직 코드를 작성할 수 있다.
- npm(node package manager) : 개발자들이 본인의 소스코드를 공유할 수 있는 패키지 저장소
- 방대한 오픈 소스 생태계를 구축하기 위해서 개발자들이 편하게 개발을 할 수 있도록 개발 생산성을 향상시키는 목적도 가지고 있다.

 


1-5. Node.js의 블로킹 OR 논블로킹

 
> nodejs에서 `비동기 I/O` 작업을 진행할 때 또 다른 작업을 할 수 있도록 제공한다 리버브(nodejs의 장점)
> 파일의 I/O 작업이 완료될 때까지 기다리면서 다른 코드도 실행할 수 있다.
> Input/Output : 파일 시스템 (브라우저에서는 파일을 조작할 수 없다.) 네트워크 디스크 등 데이터를 읽거나 쓰거나 하는 작업은 무거운 작업인데 nodejs는 이러한 작업의 속도가 빠르다.

> 논블로킹 I/O 작업을 할때 다른 코드의 내용을 실행할 수 있도록 해준다.
> nodejs는 모든 I/O 작업을 비동기적으로 실행하고 블로킹 하지 않는다.



 1-6. Node.js의 이벤트 루프 동작 방식

비동기 작업에 콜백함수를 등록하고 완료된 작업을 실행하는 역할

1. 타이머를 확인한다 : setTimeout() 같은 함수의 실행 시간을 감지, 비동기 작업이 처리가 되었는지
2. I/O 이벤트의 처리 : 파일을 읽거나 네트워크에 요청이 완료되었는지 확인한 뒤에 완료가 되면 콜백 함수를 실행한다. (poll 단계에서 대기 중인 콜백(I/O)를 실행한다. 이벤트 루프가 I/O 작업이 완료되지 않으면 콜백은 대기상태) (비동기 I/O 작업이 완료되면 I/O 콜백 큐에 추가되고 콜스택이 모두 비워지면 실행된다.)


3. idle/Prepare : 내부적으로 사용하는 단계이고 개발자가 직접 제어는 하지 않는다.
poll 단계 이벤트 루프의 핵심 단계 비동기 I/O 작업이 완료되면 I/O 콜백 큐에서 확인하고 콜백을 처리한다.
대기중인 콜백이 없는지를 확인하는 단계, 비동기 작업이 완료되면 콜백을 호출해서 알려준다.
대기중인 이벤트가 없으면 이벤트가 발생할때 까지 기다린다.

4. Pendding Callbacks : 일부 시스템의 관련 콜백의 내용이 실행되는 단계
우리가 등록한 콜백의 내용을 호출하는 단계 setImmdiate가 poll 단계가 끝나면 바로 실행이 되는데
setImmdiate가 등록한 콜백을 바로 호출한다.
5. Immediate 콜백의 처리 : setImmdiate로 예약된 콜백들이 실행된다.


6. close 이벤트 : 닫는 이벤트를 처리한다.
리소스의 내용이 닫힐때 실행되는 콜백이 여기서 호출한다.

 

 

2. 스레드 &  libuv

스레드는 아마 들어보셨을 겁니다.  스레드는 먼저 프로그램이 작업을 수행하는 작은 실행 단위 즉,  작업자를 뜻합니다.


2-1. Node.js 워커 스레드와 libuv

 

2-2. 워커 스레드란? 👞

무거운 작업을 별도의 스레드(작업공간)에서 처리하여 메인 스레드의 성능을 유지하는 방식

 

2-3. libuv? 📘

Node.js가 비동기 I/O 작업을 효율적으로 처리할 수 있도록 도와주는 라이브러리




3. Node.js 문법 

### nodejs 문법
> nodejs 레포 모드
> nodejs에서 제공하는 인터페이스

```sh
# 레포 모드 진입
# Repl (Read evaluation print loop)
# 읽기 - 해석(실행) - 출력 - 반복
# 대기 상태에서 이벤트를 기다린다.
node

# nodejs의 전역 객체는 global 객체
# console.log()의 메서드도 global 객체에 포함되어 있다.
# 브라우저의 window 객체에 포함되어있는 메서드와 동일하게 보면 안되지만
# 비슷한 동적을 하고 이름이 같은 메서드가 있는 것
# 런타임 환경이 다르기 때문에
# 브라우저에서도 자바스크립트를 해석할 수 있고 실행환경을 제공한 것 
# nodejs에서도 자바스크립트를 해석하고 실행환경을 제공한다.

# 컨트롤 + C
# 레포 모드 종료
```
```js
// 각각의 파일을 모듈화 해서 사용한다.
// 쉬운표현으로 기능을 하나의 묶음으로 표현했다고 보면
// 프로그램을 개발할 때 가장 작은 단위
// 모듈화 각각 파일을 단위로 구분하고 파일의 내용에 필요한 공통된 기능들이 포함되어 있는 것.

// 로또라는 기능을 모듈화 했다
// 로또의 모든 기능과 사용되는 변수를 하나의 파일로 내보내서 모듈화 시켰다.
// `모듈화`

const blockClass = [
  {
    name : "soon",
    age : 20,
    comment() { // 메소드 축약형을 쓰는 이유 :  function을 사용하면 불필요한 생성자의 내용까지 포함되기 때문에 
      console.log("안녕");
    }
  },
  {
    name : "kim",
    age : 30,
    comment() {
      console.log(`안녕 ${this.name} 이야`) // name의 키를 가져와서 this가 바인딩된다.
    }
  }
]

// 내보내고 싶은 내용
module.exports = blockClass;


3-1. Node.js 모듈 레퍼

### nodejs 모듈 레퍼
```js
( 
    function(exports, require, module, filename ...) {
        // 우리가 작성하는 코드들이 이 영역에 포함된다.
        // 이 레퍼라는 것 때문에 각각의 파일들이 독립된 환경에서 실행된다.
        // module은 현재 모듈 자체
        // exports module 에서 내보내는 객체 최초에 빈객체
        // 객체 안에서 this 전역 객체를 가르키는게 아니라 exports를 가리킨다.

        // 모듈 스코프
        // 각각의 독립된 파일들이 독립된 모듈로 실행된다.
        // 다른 파일에서 선언한 변수나 함수는 참조할 수 없다.
        // require 메서드를 사용해서 외부 모듈의 값을 가져와서 사용

        // 함수 스코프의 this는 전역 객체를 가리키게 된다. this는 global를 가리키게 된다.
        // module.exports === exports
        // exports
        // module.exports 새로운 객체를 할당할때
        // exports는 키를 생성해서 할당할때

    }
 )
```


결론

Node.js 에 대해 처음 접해보았습니다. Node.js 가 어떤 역할을 하고, Node.js 가 왜 사용되는지 알 수 있었고,  Node.js 를 사용해서 웹 서버를 구축할 수 있다는 점과 기능을 모듈화 해서 관리할 수 있다는 점을 알 수 있었습니다.

LIST