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 를 입력하여 성능테스트를 진행해보자
