Choose a default theme

You can change your theme from the menu

Node.js

Earlier revision · 1View current content

Node.js는 브라우저 밖에서 JavaScript를 실행하는 런타임이다. 웹 서버뿐 아니라 명령줄 도구, 파일 처리와 빌드 작업에도 사용한다. JavaScript 엔진과 네트워크·파일 시스템 API를 함께 제공하지만, 브라우저 화면이나 DOM을 제공하는 환경은 아니다.

동작 방식과 적합한 작업

한 이벤트 루프에서 실행되는 JavaScript 작업은 서로 실행 시간을 나누어 쓴다. 비동기 입출력은 응답을 기다리는 동안 다른 일을 진행하게 한다. 모든 작업이 하나의 운영체제 스레드에서 처리된다는 뜻은 아니다. 내부 작업 풀이나 운영체제 기능을 이용하는 API도 있으며, CPU 계산을 분리할 때는 별도 워커나 프로세스를 고려한다.

장점은 웹 화면과 서버에서 같은 언어와 자료 형식을 사용할 수 있고, 작은 HTTP 도구를 짧은 코드로 만들기 쉽다는 것이다. 여러 외부 서비스의 응답을 기다리는 API에 잘 맞는다. 반대로 큰 배열 정렬이나 영상 처리 같은 긴 동기 계산은 다른 요청의 처리를 늦출 수 있다. async 함수로 감싸는 것만으로 계산이 다른 스레드로 이동하지는 않는다.

도서 목록 서버 예제

Node.js가 설치된 빈 연습 폴더에서 다음을 library.mjs로 저장한다. 외부 패키지는 필요 없다. 메모리의 가상 도서 목록을 JSON으로 반환하는 읽기 전용 예제이며 데이터베이스나 로그인 기능을 구현한 것은 아니다.

import { createServer } from 'node:http';

const books = [{ id: 11, title: '작은 정원의 기록', available: true }];
const server = createServer((req, res) => {
if (req.method !== 'GET' || req.url !== '/books') {
res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('찾을 수 없습니다');
return;
}
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify(books));
});
server.listen(4310, '127.0.0.1');
node library.mjs
# 다른 터미널에서 조회
curl http://127.0.0.1:4310/books

응답은 도서 한 개를 담은 JSON 배열이다. /books 이외의 경로나 POST 요청에는 404가 반환된다. 종료하면 메모리 상태도 사라진다. 여기서 사용한 127.0.0.1은 같은 컴퓨터에서만 접속하기 위한 주소다.

설계할 때의 한계

실제 API는 요청 크기 제한, 입력 검증, 오류 응답과 종료 절차가 필요하다. 긴 파일을 한 번에 메모리에 올리기보다 스트림으로 처리하고, 클라이언트가 읽는 속도를 고려해야 한다. 동시 요청이 많다는 이유만으로 무제한 Promise를 만들면 메모리와 연결 수가 먼저 고갈될 수 있으므로 작업 수를 제한한다. 런타임의 비동기 기능과 서비스의 처리 용량은 별개의 설계 항목이다.

참고 자료