Node.js 시작하기

Jeris·2023년 5월 4일
0

코드잇 부트캠프 0기

목록 보기
81/107

1. Node.js가 무엇인가요?

Node.js

Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 오픈 소스 서버 측 런타임 환경입니다. Node.js는 이벤트 기반, 비동기식 I/O 프레임워크를 사용하여 높은 처리량과 확장성을 제공합니다.

비동기 이벤트 중심 자바스크립트 런타임인 Node.js는 다음 "hello world" 예제에서는 많은 연결을 동시에 처리할 수 있습니다. 각 연결 시 콜백이 실행되지만 수행해야 할 작업이 없으면 Node.js는 절전 모드로 전환됩니다.

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

이는 OS 스레드를 사용하는 오늘날의 일반적인 동시성 모델(concurrency model)과는 대조적입니다. 스레드 기반 네트워킹은 상대적으로 비효율적이고 사용하기가 매우 어렵습니다. 또한 Node.js 사용자는 잠금(locks)이 없기 때문에 프로세스가 dead-locking될 염려가 없습니다. Node.js의 거의 모든 함수가 직접 입출력을 수행하지 않기 때문에 Node.js 표준 라이브러리의 동기식 메서드(synchronous methods)를 사용하여 입출력을 수행하는 경우를 제외하고는 프로세스가 절대 블록(block)되지 않습니다. 블록이 없기 때문에 확장성 있는 시스템을 개발한다면 Node.js는 매우 합리적입니다.

  • dead-locking 둘 이상의 작업이 서로 상대방의 작업이 끝나기를 기다리고 있어 상황이 진행되지 않는 상태를 말합니다. 예를 들어, 두 개의 스레드가 각각 A와 B라는 자원을 사용하려고 할 때, A를 사용 중인 스레드는 B를 사용할 수 없고, B를 사용 중인 스레드는 A를 사용할 수 없으므로 상대방의 작업이 끝나기를 기다리며 영원히 대기하는 상황이 발생합니다.
  • blocking 프로그램이 어떤 작업을 처리할 때, 해당 작업이 완료될 때까지 프로그램의 다른 작업을 중지시키는 것을 말합니다. 예를 들어, 파일을 읽거나 데이터베이스에서 데이터를 조회하는 작업은 시간이 오래 걸리므로, 이 작업을 수행하는 동안 프로그램은 다른 작업을 중지시켜야 합니다.

Node.js는 주로 서버 측 애플리케이션을 개발하는 데 사용됩니다. 예를 들어, 웹 서버, API 서버, 데이터베이스 클라이언트, 웹 소켓 서버 등을 개발할 수 있습니다. 또한 Node.js는 JavaScript로 작성되어 있으므로, 프론트엔드에서 사용되는 JavaScript와 유사한 문법과 기능을 가지고 있어, 프론트엔드와 백엔드 모두에서 사용이 가능합니다.

Node.js의 역사

Node.js는 2009년 라이언 달(Ryan Dahl)이 개발한 오픈 소스 서버 측 런타임 환경입니다. 라이언 달은 자신의 경험에서, 웹 서버의 성능 문제를 해결하기 위해 비동기식 I/O를 사용하는 것이 좋다는 것을 깨달았습니다. 그리고 V8 엔진을 이용해 자바스크립트를 서버 측에서도 사용할 수 있도록 Node.js를 개발했습니다.

Node.js는 초기에는 크게 주목받지 않았지만, Node.js가 제공하는 높은 처리량과 확장성, 그리고 개발 생산성을 인식한 개발자들이 늘어나면서, Node.js의 인기가 상승하기 시작했습니다. Node.js는 2011년에 첫 번째 안정 버전인 0.4.0을 발표하였고, 이후에도 지속적인 업데이트와 개선이 이루어졌습니다.

Node.js의 생태계는 점점 커져가면서, 각종 모듈과 패키지가 개발되어 사용이 가능해졌습니다. 특히, npm(Node.js Package Manager)은 Node.js를 사용하는 개발자들에게 필수적인 도구로 자리 잡았습니다. Node.js는 또한 서버 측 JavaScript를 사용하여 개발할 수 있다는 새로운 개념을 제시하면서, 프론트엔드와 백엔드의 경계를 허물어버리는 역할을 하게 되었습니다.

현재 Node.js는 대규모 서비스에서도 사용되고 있으며, 많은 기업에서 Node.js를 사용하여 서버 측 애플리케이션을 개발하고 있습니다. Node.js는 오픈 소스로 개발되었기 때문에, 다양한 모듈과 패키지가 개발되어 있어, 다양한 용도로 사용이 가능합니다.


2. Node.js는 프레임워크인가요?

프레임워크(Framework)

프레임워크란 일정한 틀을 갖고 있어서, 개발자가 특정 부분만 원하는 모습대로 채워 넣으면, 프로그램을 완성할 수 있게 해주는 준비된 코드 체계입니다.

예를 들어, Java 기반의 Spring, Python 기반의 Django 같은 프레임워크들은 개발을 더 빠르고 편하게 만들어 줍니다.

Node.js는 프레임워크인가요?

프레임워크의 의미를 어떻게 보느냐에 따라 다르지만, 위에서 말한 의미를 기준으로 생각한다면 Node.js는 프레임워크가 아닙니다.

Node.js는 프레임워크가 아니고 자바스크립트라는 언어의 실행 환경(runtime environment)일 뿐입니다. 컴퓨터에 Node.js를 깔고 나서 개발을 시작하려고 하면, 일정한 틀이라는 게 없습니다. 주어지는 건 단지 Node.js라는 실행 환경일 뿐이고, 그 위에서 프로그램의 전반적인 구조를 설계하고 결정하는 건 전부 개발자의 몫이기 때문입니다.

Django와 비교해서 표현한다면 다음 이미지와 같습니다.

왼쪽은 Node.js라는 실행환경 위에서, 개발자 본인이 직접 프로그램의 동작 구조를 설계하고 그것을 자바스크립트(.js) 코드로 구현해나가는 모습을 나타낸 이미지입니다. 그리고 오른쪽은 Python 위에서 실행되는, Django 프레임워크의 정해진 틀 내에서 개발하는 모습을 나타낸 이미지입니다. Django 프레임워크 자체도 파이썬(.py) 코드로 작성되어 있고, 개발자가 직접 채워 넣은 부분들(별표, 세모)도 파이썬 코드로 작성되어 있습니다. 이제 개발자는 물음표 표시가 있는 원 부분만 완성하면 하나의 온전한 프로그램을 완성할 수 있게 됩니다.


3. Node.js로 자바스크립트 실행해보기

현재 LTS 버전인 node 18.16.0, npm 9.5.1을 설치한 상태입니다.

다음 테스트 코드를 Node.js로 실행해 보겠습니다.

// test.js
console.log("Hello Node.js");

콘솔에 node test.js 혹은 확장자를 생략하고 node test라고 입력하면 Node.js가 브라우저 환경이 아닌 실행 환경에서 자바스크립트 파일을 실행하는 것을 확인할 수 있습니다.

node test
// Hello Node.js

4. REPL 모드에서 실행해보기

REPL은 Read Eval Print Loop의 줄임말입니다. REPL 모드는 사용자가 입력한 내용을 읽고(Read) 그 결괏값을 구한 다음(Evaluate) 결괏값을 출력하고(Print) 이런 과정을 계속 반복하는(Loop) 모드입니다.

콘솔에 node를 입력하면 REPL 모드에 진입할 수 있습니다. 여러 줄의 코드도 입력할 수 있고, 입력 후에 바로 결과가 출력됩니다.

JavaScript에서는 아무 것도 반환하지 않으면 자동으로 undefined가 반환됩니다. REPL 모드에서도 코드에 아무 것도 반환하지 않으면 undefined가 자동으로 출력됩니다.

REPL 모드는 짧은 코드를 간단하게 테스트할 때 사용합니다.


Feedback

  • React를 설치할 때 Node.js의 npm을 이미 사용했었다. npm은 프론트엔드 개발자에게도 친숙한 도구이므로 Node.js 공부하면서 프론트엔드 개발에도 도움이 될 것 같다.

Reference

profile
job's done

0개의 댓글