Programming

Node.js가 이렇게 변했다? 2025년 현대 Node.js의 숨겨진 기능 5가지

danny-shim 2025. 10. 25. 10:26

안녕하세요, 개발자 여러분! Node.js를 사용하다 보면 "이걸 왜 패키지로 설치해야 하지?" 싶은 순간이 많죠? 2018년 이후 Node.js는 엄청난 변화를 겪었고, 이제는 nodemon이나 dotenv 같은 인기 패키지 없이도 많은 작업을 처리할 수 있어요. 이 포스트에서는 그 영상을 바탕으로 Node.js의 최신 기능 5가지를 자세히 살펴보겠습니다. AI 도구조차 이 기능들을 제대로 추천하지 않는다는 점이 재미있더군요.

이 기능들은 Node.js 버전 15 이상(예: 25 버전)에서 지원되며, 간단한 "Hello World" 앱을 기반으로 실습할 수 있습니다. 각 기능별로 코드 예시를 포함했으니, 따라 해보세요. 준비됐나요? 시작해 볼까요!

1. Watch Mode: 파일 변경 시 자동 재시작, nodemon 없이!

과거에는 파일을 수정할 때마다 터미널에서 Ctrl+C로 중단하고 다시 실행해야 했죠? 이제 Node.js의 내장 Watch Mode로 그 번거로움을 끝낼 수 있습니다. (Node.js 18.11+ 지원)

어떻게 사용하나요?

  • 명령어: node --watch app.js
  • 예시 코드 (app.js):
    console.log('Hello World!');
  • 파일을 수정하고 저장하면 자동으로 재시작되어 변경 사항이 즉시 반영됩니다. 예를 들어, "Hello World!"를 "Hello Node.js!"로 바꾸면 콘솔에 새 출력이 나타나요.

이 기능 하나로 nodemon 패키지를 설치할 필요가 없어집니다. 개발 속도가 훨씬 빨라지죠!

2. TypeScript 직접 실행: 컴파일 없이 타입 안전성 확보

TypeScript를 쓰려면 tsconfig.json 설정하고 tsc로 컴파일하는 게 기본이었어요. 하지만 Node.js 23+에서는 .ts 파일을 직접 실행할 수 있습니다. 타입 어노테이션을 무시하거나 변환해 JavaScript로 동작하게 해요.

기본 사용법:

  • 명령어: node app.ts
  • 예시 코드 (app.ts):
    let username: string = "Max";
    console.log(`Hello, ${username}!`);
  • 출력: "Hello, Max!" – 타입 체크 없이도 안전하게!

고급 기능 (Enums 등):

  • 플래그 추가: node --experimental-transform-types app.ts
  • 예시:
    enum Role { Admin, User }
    let role: Role = Role.Admin;
    console.log(role); // 0 (Admin)

실용 스크립트 작성 시 컴파일 단계를 생략할 수 있어 생산성이 UP! 아직 실험적 기능이니 주의하세요.

3. 내장 SQLite: 가벼운 DB 없이 서버리스 데이터베이스

SQLite는 서버 없이 파일 기반으로 동작하는 가벼운 DB예요. Node.js 25+에서는 sqlite 모듈로 바로 사용할 수 있어, better-sqlite3 같은 패키지가 필요 없어요.

사용 예시 (app.js):

import { DatabaseSync } from 'sqlite';
import { open } from 'sqlite/slow-sqlite3'; // 필요 시

const db = await open({ filename: 'test.db', driver: DatabaseSync });
await db.exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
await db.run('INSERT INTO users (name) VALUES (?)', 'Max');
const users = await db.all('SELECT * FROM users');
console.log(users); // [{ id: 1, name: 'Max' }]
  • 실행 후 test.db 파일이 생성되고, VS Code 확장으로 테이블을 확인할 수 있어요.
  • 소규모 프로젝트나 유틸리티 스크립트에 딱!

4. Promise-based Timers: async/await으로 타이머 간단히

setTimeout을 Promise로 감싸서 await 하던 시대는 끝났어요. Node.js 15+부터 timers/promises 모듈로 네이티브 지원합니다.

예시 코드 (app.js):

import { setTimeout } from 'node:timers/promises';

async function main() {
  console.log('시작!');
  await setTimeout(1000); // 1초 대기
  console.log('1초 후 실행!');
  await setTimeout(2000);
  console.log('끝!');
}

main();
  • 출력: 순차적으로 지연된 로그가 찍혀요. async 코드가 훨씬 깔끔해집니다. setInterval이나 setImmediate도 동일하게 지원돼요.

5. .env 파일 네이티브 지원: dotenv 패키지 goodbye!

환경 변수를 .env 파일에서 로드하려면 dotenv가 필수였죠? 이제 --env-file 플래그로 간단히 처리합니다.

설정:

  • .env 파일 생성:
    BUCKET=demo
  • 명령어: node --env-file=.env app.js
  • 예시 코드 (app.js):
    console.log(process.env.BUCKET); // "demo"

로컬 개발 환경이 한결 수월해집니다. 유틸리티 스크립트에 특히 유용해요.