ECMAScript 2025/2026 주요 변경 사항

JavaScript는 매년 새 기능을 추가하며 빠르게 발전하고 있습니다. 2025년과 2026년 스펙에는 개발자 생산성을 크게 높이는 기능들이 대거 포함되어 있습니다. 특히 ES2026은 오랫동안 요청되어 온 날짜 처리, 리소스 관리, 정밀 수학 연산 기능이 추가된 주요 릴리스입니다.

ES2025 핵심 기능

1. Iterator 헬퍼 메서드

ES2025에서 Iterator 객체에 map, filter, take, drop 등의 헬퍼 메서드가 추가되었습니다. 이를 통해 지연 평가(lazy evaluation)가 가능해져 대용량 데이터 처리 효율이 높아집니다.

// Iterator 헬퍼 메서드 활용
function* range(start, end) {
  for (let i = start; i < end; i++) yield i;
}

// 기존 방식: 전체 배열 생성 후 처리
const result1 = [...range(1, 1000000)]
  .filter(n => n % 2 === 0)
  .map(n => n * n)
  .slice(0, 5);

// ES2025 Iterator 헬퍼: 필요한 만큼만 처리
const result2 = range(1, 1000000)
  .filter(n => n % 2 === 0)
  .map(n => n * n)
  .take(5)
  .toArray();

console.log(result2); // [4, 16, 36, 64, 100]

2. JSON 모듈 임포트

ES2025에서는 JSON 파일을 직접 모듈로 임포트할 수 있습니다. 이 기능은 설정 파일이나 데이터 파일을 더 쉽게 불러올 수 있도록 합니다.

// JSON 직접 임포트 (ES2025)
import config from './config.json' with { type: 'json' };
import translations from './i18n/ko.json' with { type: 'json' };

console.log(config.apiUrl);         // 설정값 바로 사용
console.log(translations.welcome);   // 번역 데이터 바로 사용

3. RegExp.escape()

정규식 인젝션 공격을 방지하기 위한 RegExp.escape() 메서드가 추가되었습니다.

// 기존: 수동으로 특수문자 이스케이프
function escapeRegex(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

// ES2025: 내장 메서드 사용
const userInput = 'hello.world (test)';
const safePattern = RegExp.escape(userInput);
console.log(safePattern); // 'hello\.world \(test\)'

const regex = new RegExp(safePattern);
console.log(regex.test('hello.world (test)')); // true

4. Set 집합 연산 메서드

ES2025에서 Set 객체에 집합 연산 메서드들이 추가되었습니다.

const setA = new Set([1, 2, 3, 4, 5]);
const setB = new Set([3, 4, 5, 6, 7]);

// 합집합
console.log([...setA.union(setB)]);        // [1, 2, 3, 4, 5, 6, 7]

// 교집합
console.log([...setA.intersection(setB)]); // [3, 4, 5]

// 차집합 (A - B)
console.log([...setA.difference(setB)]);   // [1, 2]

// 대칭 차집합
console.log([...setA.symmetricDifference(setB)]); // [1, 2, 6, 7]

// 부분집합 여부
const setC = new Set([3, 4]);
console.log(setC.isSubsetOf(setA)); // true

ES2026 핵심 기능

1. Temporal API: 날짜/시간 처리의 혁명

ES2026의 가장 큰 변화는 Temporal API입니다. 기존 Date 객체는 타임존 처리 오류, 가변성(mutability) 문제, 직관적이지 않은 API 등으로 악명이 높았습니다. Temporal은 이 모든 문제를 해결합니다.

// 기존 Date의 문제점
const date1 = new Date('2026-04-08');
const date2 = new Date('2026-04-08');
date1.setMonth(3); // 원본이 변경됨 (가변성 문제)

// Temporal API: 불변(Immutable) 객체
const today = Temporal.PlainDate.today();
console.log(today.toString()); // 2026-04-08

// 날짜 계산 (새 객체 반환, 원본 불변)
const nextWeek = today.add({ days: 7 });
const lastMonth = today.subtract({ months: 1 });

console.log(nextWeek.toString()); // 2026-04-15
console.log(today.toString());    // 2026-04-08 (불변)

// 타임존 처리
const tokyoTime = Temporal.ZonedDateTime.from({
  timeZone: 'Asia/Tokyo',
  year: 2026, month: 4, day: 8,
  hour: 9, minute: 0
});

const seoulTime = tokyoTime.withTimeZone('Asia/Seoul');
console.log(seoulTime.toString()); // 2026-04-08T09:00:00+09:00[Asia/Seoul]

// 날짜 차이 계산
const start = Temporal.PlainDate.from('2026-01-01');
const end = Temporal.PlainDate.from('2026-04-08');
const diff = end.since(start);
console.log(diff.total({ unit: 'days' })); // 97

2. Resource Management: using과 await using

C#의 using, Python의 with처럼 JavaScript에도 자동 리소스 해제 키워드가 추가됩니다.

// Symbol.dispose 구현
class DatabaseConnection {
  constructor(url) {
    this.url = url;
    this.connection = null;
  }
  
  async connect() {
    this.connection = await openConnection(this.url);
    console.log('DB 연결됨');
    return this;
  }
  
  // 동기 정리
  [Symbol.dispose]() {
    this.connection?.close();
    console.log('DB 연결 해제됨');
  }
  
  // 비동기 정리
  async [Symbol.asyncDispose]() {
    await this.connection?.closeAsync();
    console.log('DB 연결 비동기 해제됨');
  }
}

// using: 블록 종료 시 자동 정리 (동기)
function processData() {
  using const reader = new FileReader('./data.txt');
  const data = reader.read();
  return processContent(data);
} // reader 자동 정리됨

// await using: 비동기 자동 정리
async function handleRequest() {
  await using const db = await new DatabaseConnection(DB_URL).connect();
  const users = await db.query('SELECT * FROM users');
  return users;
} // 함수 종료 시 db 자동 비동기 해제

3. Error.isError()

기존에 instanceof Error는 다른 실행 컨텍스트(iframe, Worker)에서 생성된 에러를 올바르게 감지하지 못하는 문제가 있었습니다.

// 기존: instanceof의 한계
try {
  throw new Error('오류 발생');
} catch (err) {
  console.log(err instanceof Error); // true (같은 컨텍스트)
  // 다른 iframe에서 온 Error는 false가 될 수 있음
}

// ES2026: Error.isError() 신뢰할 수 있는 체크
try {
  someOperation();
} catch (err) {
  if (Error.isError(err)) {
    console.log('에러:', err.message);
    console.log('스택:', err.stack);
  } else {
    console.log('에러가 아닌 예외:', err);
  }
}

4. Math.sumPrecise()

부동소수점 정밀도 문제를 해결하는 새로운 수학 메서드입니다.

// 기존 방식의 부동소수점 오류
const prices = [0.1, 0.2, 0.3];
const total1 = prices.reduce((a, b) => a + b, 0);
console.log(total1); // 0.6000000000000001 (정밀도 오류!)

// Math.sumPrecise: 정밀 합산
const total2 = Math.sumPrecise(prices);
console.log(total2); // 0.6 (정확)

// 금융 계산에 특히 유용
const transactions = [1234.56, 789.01, 456.78, 123.45];
const balance = Math.sumPrecise(transactions);
console.log(balance); // 2603.8 (정확한 합산)

Node.js 최신 동향 (2025-2026)

Node.js는 짝수 버전(LTS)과 홀수 버전(Current)을 번갈아 출시합니다. 2025-2026년 주목할 기능들입니다.

// Node.js 내장 테스트 러너 (별도 라이브러리 불필요)
import { test, describe, it, mock } from 'node:test';
import assert from 'node:assert';

describe('사용자 서비스', () => {
  it('사용자를 정상적으로 생성해야 합니다', async () => {
    const user = await createUser({ name: '김철수', email: 'kim@example.com' });
    assert.strictEqual(user.name, '김철수');
    assert.ok(user.id);
  });
});

// 실행: node --test test/*.js

// Node.js SQLite 내장 지원 (별도 모듈 불필요)
import { DatabaseSync } from 'node:sqlite';

const db = new DatabaseSync(':memory:');
db.exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
db.exec("INSERT INTO users (name) VALUES ('홍길동')");

const stmt = db.prepare('SELECT * FROM users');
console.log(stmt.all()); // [{id: 1, name: '홍길동'}]

정리

ES2025와 ES2026은 JavaScript 생태계의 오랜 숙제를 해결하는 버전입니다. Temporal API는 날짜 처리의 표준을 바꾸고, using 키워드는 리소스 누수 문제를 코드 레벨에서 방지합니다. Iterator 헬퍼와 Set 연산 메서드는 함수형 프로그래밍 스타일을 더 자연스럽게 만들어 줍니다. 이러한 기능들을 프로젝트에 적극적으로 적용하면 코드 품질과 개발 생산성을 크게 높일 수 있습니다.