Node.js

2장 Node.js로 백엔드 입문하기

컴맹99 2024. 2. 19. 23:08

node.js설치 (http://nodejs.org)

 

 

2.1 Node.js 소개

  • Node.js는 V8엔진을 사용하는 서버측 자바스크립트 런타임 환경이다.
  • 기존에는 논블로킹/비동기 API를 서버환경에서 구현하는데 어려웠는데, Node.JS는 이벤트기반의 비동기 환경으로  쉽게 개발할수있도록 하여, 2009년에 발표되었다.
  • 2010년에는 npm이라는 패키지 매니저를 공개하였다. 

 

  • 웹프레임워크 기술에서 익스프레스가 3위를 차지할정도로 Node.js는 많이 사용된다.
    • (익스프레스는 Node.js상에서 동작하는 웹 개발 프레임워크이다.)

 

https://insights.stackoverflow.com/survey/2021#most-popular-technologies-webframe

 

 

2.2 Node.js는 서버에서 어떻게 자바스크립트를 실행할까?

  • node.js는 아래와 같이 구성되어있다.

 

 

 

 

 

  • V8엔진 : C++로 만든 오픈 소스 자바스크립트 엔진

 

 

  • JIT(Just-in Time) 컴파일러 : 인터프리터와 컴파일러의 장점을 동시에 가지고 있는 프로그램

 

 

  • Node.js에서는 V8엔진을 사용하여 서버에서 자바스크립트를 실행할수있습니다. 그리고 Node.js에서 지원하지 않는 기능은 Libuv라는 C++을 사용하여 해결합니다.
  • Libuv에서는 Http, File I/O, Socket통신 등등 다양한 기능을 지원합니다.

 

 

 

 

 

 

 

 

2.3 Node.js 의 기술적인 특징

  • Node.js는 자바스크립트엔진(V8)을 사용하는 싱글스레드, 이벤트 기반 아키텍쳐이다.
  • 싱글스레드라는 이야기는 콜스택이 한개만 존재한다는 의미이다. 

 

function func1() {
  console.log("1");
  func2();
  return;
}

function func2() {
  console.log("2");
  return;
}

func1();

 

 

  • 아래는 재귀호출을 사용한 합계를 구하는 간단한 소스이다.
function func(x) { 
    if(x<=1) return 1; 
    return x + func(x-1);
}

sum = func(10);
console.log(sum);

 

 

 

 

  • 이벤트 기반 아키텍쳐

 

console.log(1);
setTimeout(() => console.log(2), 1000);
console.log(3);

 

 

 

 

 

 

 

  • libuv의 이벤트 루프 동작 원리 

https://github.com/libuv/libuv/blob/v1.x/src/unix/core.c

 

 

 

2.4 Node.js 과연 쓸만할까?

 

 

 

2.5 나의 첫 Node.js 서버 프로그램 

https://github.com/gilbutITbook/006806

const http = require("http"); // ❶ http 객체 생성
let count = 0;

// 노드 서버 객체 생성
const server = http.createServer((req, res) => { // ❷ 서버 객체 생성
  log(count); // ❸ 카운트 1 증가
  res.statusCode = 200;  // ➍결괏값 200
  res.setHeader("Content-Type", "text/plain");  //  ➎ 헤더 설정 
  res.write("hello\n"); //  ➏ 응답값 설정

  setTimeout(() => { 
    res.end("Node.js"); // ❼ 2초후 Node.js 출력
  }, 2000);
});

function log(count) {
  console.log((count += 1)); 
}
server.listen(8000, () => console.log("Hello Node.js")); // ❽ 8080번 포트로 서버 실행

 

 

 

2.6 정말로 동시에 요청을 처리하는지 성능 테스트하기 

 

windows에서는 아래의 명령으로 k6를 설치한다. 

winget install k6 --source winget

 

  • 아래소스는 성능테스트를 위한 스크립트이다.
import http from "k6/http"

export const options = {
    vus : 100,
    duration: "10s",
}

export default function() {
    http.get("http://localhost:8000");
}

 

  • k6 run test_hello.js  를 입력하여 성능테스트를 진행해보자