TechFeedTechFeed
Programming Languages

JavaScript ES2026 새 기능 정리

한 줄 요약: ES2026은 Pipeline Operator, Temporal API 안정화, 새 배열 메서드, Pattern Matching 초안을 포함한다. 지금 당장 쓸 수 있는 기능과 아직 Stage 2~3에 머무는 기능을 구분해서 파악해야 한다. Pipeline Operator( |> )는 TC39 Stage 2 프로포절로, 함수 합성을 왼쪽에서 오른쪽으로 읽을 수 있게 만든다.

by

한 줄 요약: ES2026은 Pipeline Operator, Temporal API 안정화, 새 배열 메서드, Pattern Matching 초안을 포함한다. 지금 당장 쓸 수 있는 기능과 아직 Stage 2~3에 머무는 기능을 구분해서 파악해야 한다.


이 글이 필요한 사람
  • 최신 JavaScript 문법을 실무 프로젝트에 도입하려는 프론트엔드/풀스택 개발자
  • Babel·TypeScript 트랜스파일 설정에서 어떤 플러그인이 필요한지 파악하려는 경우
  • 날짜/시간 처리에서 Date 객체 대신 현대적인 API로 전환하고 싶은 경우
  • 함수형 스타일 코드를 작성하는 팀에서 Pipeline Operator 도입 가능성을 검토하는 경우

※ 이 글은 TC39 프로포절 상태(2025년 기준)를 반영하며, 브라우저 지원 현황은 caniuse.comtc39.es에서 확인할 것을 권장합니다.


Pipeline Operator — 함수 체이닝을 선형으로

Pipeline Operator(|>)는 TC39 Stage 2 프로포절로, 함수 합성을 왼쪽에서 오른쪽으로 읽을 수 있게 만든다. 현재 Hack Pipeline 방식(오른쪽 표현식에서 %로 이전 값 참조)이 표준 방향으로 채택됐다.


기존 코드에서 중첩 함수 호출이 많은 데이터 변환 파이프라인은 안에서 밖으로 읽어야 하는 불편함이 있었다. Pipeline Operator는 이를 위에서 아래, 왼쪽에서 오른쪽으로 읽히는 선형 흐름으로 바꾼다.


Pipeline Operator — 함수 체이닝을 선형으로 — 언어별 성능 벤치마크
JavaScript ES2026 새 기능 정리 — 언어별 성능 벤치마크 (출처: 공식 문서 및 벤치마크 데이터 기반)
Pipeline Operator — 기존 방식 vs |> 방식 비교
// 기존: 중첩 함수 호출 — 안에서 밖으로 읽어야 함 const result = formatOutput(filterActive(normalizeData(parseInput(rawData)))); // Pipeline Operator (Hack Pipeline, Babel 플러그인 필요) const result = rawData |> parseInput(%) |> normalizeData(%) |> filterActive(%) |> formatOutput(%); // 비동기 파이프라인도 자연스럽게 표현 가능 const user = userId |> await fetchUser(%) |> await fetchPermissions(%) |> formatUserDisplay(%); // Babel 설정 (proposal-pipeline-operator) // babel.config.json // { "plugins": [["@babel/plugin-proposal-pipeline-operator", // { "proposal": "hack", "topicToken": "%" }]] }

Temporal API — Date를 대체하는 날짜/시간 처리

Temporal API(TC39 Stage 3)는 30년 된 Date 객체의 모든 문제를 해결하는 새 날짜/시간 API다. 타임존 처리, 달력 시스템, 불변(immutable) 객체, 명확한 타입 구분이 특징이다.


Date 객체의 주요 문제점:


  • Mutable — 실수로 수정 가능
  • 타임존이 로컬과 UTC만 지원 (IANA 타임존 없음)
  • 월이 0-indexed (1월 = 0)
  • 파싱 동작이 브라우저마다 다름
  • 날짜 산술이 직관적이지 않음

Temporal API 주요 예시
// PlainDate — 시간 없이 날짜만 const today = Temporal.Now.plainDateISO(); const nextWeek = today.add({ days: 7 }); console.log(nextWeek.toString()); // 2026-03-22 // ZonedDateTime — 타임존 포함 const meeting = Temporal.ZonedDateTime.from({ timeZone: 'Asia/Seoul', year: 2026, month: 3, day: 20, hour: 14, minute: 0 }); // 다른 타임존으로 변환 const nyTime = meeting.withTimeZone('America/New_York'); console.log(nyTime.toString()); // 날짜 차이 계산 const start = Temporal.PlainDate.from('2026-01-01'); const end = Temporal.PlainDate.from('2026-12-31'); const diff = start.until(end); console.log(diff.days); // 364 // Polyfill 사용 (현재) // npm install @js-temporal/polyfill import { Temporal } from '@js-temporal/polyfill';

Record and Tuple — 불변 자료구조

Record(#{ })와 Tuple(#[ ])은 불변(immutable) 복합 자료구조를 언어 레벨에서 지원하는 프로포절(Stage 2)이다. 기존 객체·배열과 달리 값 기반 동등 비교가 가능해 React state 비교, 메모이제이션, 캐시 키 등에 유용하다.


핵심 차이: 일반 { a: 1 } === { a: 1 }false지만, #{ a: 1 } === #{ a: 1 }true다. 참조가 아닌 값 자체로 비교된다.


Temporal API — Date를 대체하는 날짜/시간 처리 — 문법 비교 차트
JavaScript ES2026 새 기능 정리 — 문법 비교 차트 (출처: 공식 문서 및 벤치마크 데이터 기반)
Record and Tuple 사용 예시
// Record — 불변 객체 리터럴 const point = #{ x: 1, y: 2 }; const point2 = #{ x: 1, y: 2 }; console.log(point === point2); // true (값 비교) // Tuple — 불변 배열 const colors = #['red', 'green', 'blue']; const colors2 = #['red', 'green', 'blue']; console.log(colors === colors2); // true // 수정 시 새 Record/Tuple 반환 const moved = #{ ...point, x: 5 }; console.log(point.x); // 1 (원본 불변) console.log(moved.x); // 5 // Map 키로 사용 가능 (참조가 아닌 값 기반) const cache = new Map(); cache.set(#{ userId: 1, role: 'admin' }, 'data'); console.log(cache.get(#{ userId: 1, role: 'admin' })); // 'data'

새 Array 메서드 — 이미 Stage 4 완료

ES2023에 도입돼 ES2025~2026에 안정화된 배열 메서드들이 있다. 이미 주요 브라우저에서 지원되므로 폴리필 없이 사용 가능하다.


Array.fromAsync (ES2024 완료): 비동기 이터러블을 배열로 변환한다. for await...of + push 패턴을 한 줄로 줄인다.


Iterator Helpers (Stage 3 → 4): 이터레이터에 .map(), .filter(), .take() 등을 직접 사용할 수 있다. 중간 배열 생성 없이 지연(lazy) 평가로 처리된다.


Object.groupBy / Map.groupBy (ES2024): 배열을 특정 기준으로 그룹화하는 메서드. 기존에 reduce로 구현하던 패턴을 한 줄로 처리한다.


새 Array/Iterator 메서드 예시
// Array.fromAsync — 비동기 이터러블 → 배열 async function* generate() { yield 1; yield 2; yield 3; } const arr = await Array.fromAsync(generate()); // [1, 2, 3] // Iterator Helpers — 지연 평가, 중간 배열 없음 const result = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] .values() .filter(n => n % 2 === 0) .map(n => n * n) .take(3) .toArray(); // [4, 16, 36] // Object.groupBy const people = [ { name: 'Alice', dept: 'eng' }, { name: 'Bob', dept: 'design' }, { name: 'Carol', dept: 'eng' } ]; const byDept = Object.groupBy(people, p => p.dept); // { eng: [Alice, Carol], design: [Bob] } // Array.prototype.toSorted / toReversed / toSpliced — 원본 불변 const nums = [3, 1, 2]; const sorted = nums.toSorted(); // [1, 2, 3] console.log(nums); // [3, 1, 2] — 원본 유지

Pattern Matching — switch를 대체하는 구조적 매칭

Pattern Matching(match 표현식, Stage 2)은 Rust나 Haskell의 패턴 매칭을 JavaScript에 도입하는 프로포절이다. switch와 달리 구조 분해, 타입 체크, 가드 조건을 조합해 복잡한 분기 로직을 선언적으로 표현할 수 있다.


현재 공식 JS 런타임에서는 지원되지 않으며 Babel 플러그인을 통해 실험적으로 사용 가능하다. 문법은 최종 확정 전이므로 프로덕션 도입은 시기상조다.


Record and Tuple — 불변 자료구조 — 생태계 구성 다이어그램
JavaScript ES2026 새 기능 정리 — 생태계 구성 다이어그램 (출처: 공식 문서 및 벤치마크 데이터 기반)
Pattern Matching 문법 예시 (실험적)
// 현재 switch로 작성하는 복잡한 분기 function handleResponse(response) { switch (true) { case response.status === 200 && response.data !== null: return processData(response.data); case response.status === 404: return notFound(); case response.status >= 500: return serverError(response.status); default: return unknownError(); } } // Pattern Matching으로 표현 (제안 문법) function handleResponse(response) { return match (response) { when ({ status: 200, data: not null }) => processData(response.data), when ({ status: 404 }) => notFound(), when ({ status: (s) if s >= 500 }) => serverError(s), default => unknownError() }; }
Stage별 실무 적용 기준: Stage 4는 바벨 없이 최신 브라우저·Node.js에서 바로 사용 가능. Stage 3은 주요 엔진이 구현 중이므로 폴리필 또는 Babel로 사용 가능. Stage 2 이하(Pipeline Operator, Pattern Matching, Record & Tuple)는 프로덕션 도입 전에 문법 변경 가능성과 번들러 지원 여부를 반드시 확인할 것.

브라우저·Node.js 지원 현황 요약

기능TC39 StageChromeFirefoxNode.jsBabel/트랜스파일
Array.fromAsyncStage 4 (ES2024)121+115+22+불필요
Object.groupByStage 4 (ES2024)117+119+21+불필요
Iterator HelpersStage 4 (ES2025)122+131+22+불필요
Temporal APIStage 3미지원실험적미지원폴리필 필요
Pipeline OperatorStage 2미지원미지원미지원Babel 플러그인
Record & TupleStage 2미지원미지원미지원Babel 플러그인
Pattern MatchingStage 2미지원미지원미지원실험적 플러그인

※ 지원 버전은 변경될 수 있으므로 caniuse.com에서 최신 상태를 확인할 것.


toSorted / toReversed / with — 이미 사용 가능: ES2023에 확정된 Array.prototype.toSorted(), toReversed(), toSpliced(), with()는 원본 배열을 변경하지 않는 불변 버전 메서드다. Chrome 110+, Node.js 20+에서 이미 지원된다. React state 업데이트에서 스프레드 연산자 대신 사용할 수 있다.

자주 묻는 질문

JavaScript ES2026 새 기능 정리, 한 줄로 정리하면 어떻게 되나요?

ES2026 주변 기능은 TC39 Stage에 따라 지금 쓸 수 있는 것과 기다려야 하는 것이 완전히 갈립니다. Iterator Helpers·Object.groupBy·Array.fromAsync·toSorted는 이미 Stage 4라 폴리필 없이 최신 브라우저와 Node.js에서 바로 쓰고, Temporal은 Stage 3이라 polyfill을 깔아야 합니다. Pipeline Operator·Record & Tuple·Pattern Matching은 Stage 2로 문법이 바뀔 수 있어 프로덕션 도입은 시기상조입니다. 즉 기능별 Stage를 먼저 확인해 채택 전략을 세우는 것이 핵심입니다.


실무에서 처음 도입할 때 가장 먼저 확인할 것은 무엇인가요?

해당 기능의 TC39 Stage부터 확인하세요. Stage 4(Array.fromAsync, Object.groupBy, Iterator Helpers, toSorted)는 바벨 없이 최신 브라우저·Node.js에서 바로 쓸 수 있고, Stage 3인 Temporal은 @js-temporal/polyfill을 깔아야 동작합니다. Pipeline Operator·Record & Tuple·Pattern Matching은 Stage 2라 문법이 아직 바뀔 수 있으니, Babel 플러그인 설정 전에 caniuse.com에서 타깃 브라우저 지원 범위를 먼저 보고 도입 여부를 정하시면 됩니다.


가장 자주 발생하는 실수나 함정은 무엇인가요?

Stage 2 프로포절 문법을 프로덕션 코드에 바로 박아 넣는 것이 가장 큰 함정입니다. Pipeline Operator의 %(topic) 토큰이나 Pattern Matching의 match 문법은 최종 확정 전이라 표준이 바뀌면 코드 전체를 손봐야 합니다. 또 하나 자주 헷갈리는 지점은 Temporal을 Stage 4로 착각하는 것인데, 아직 Stage 3이라 Chrome·Node.js 기본 환경에서는 polyfill 없이 돌지 않습니다. 반대로 toSorted·toReversed처럼 이미 ES2023에 확정된 메서드를 굳이 폴리필로 감싸는 불필요한 작업도 흔합니다.


각 기능은 어떤 작업·환경에 적합하고 언제 도입을 미뤄야 하나요?

데이터 변환 로직이 중첩 함수 호출로 읽기 어려운 코드라면 Pipeline Operator가 흐름을 선형으로 펴주지만, Stage 2라 Babel 설정이 필요하고 사내 도구·실험 프로젝트에만 적합합니다. 타임존·달력 계산이 많은 서비스라면 Temporal이 Date의 고질적 문제를 해결해주는데, 아직 Stage 3이라 @js-temporal/polyfill을 감수해야 합니다. React state 비교나 캐시 키처럼 값 기반 동등성이 필요하면 Record & Tuple이 이상적이지만 역시 Stage 2라 프로덕션엔 이릅니다. 반면 Iterator Helpers·Object.groupBy·toSorted는 이미 Stage 4라 브라우저 타깃만 맞으면 어떤 프로젝트에서든 바로 적합합니다. 구형 브라우저를 지원해야 하거나 번들 크기에 민감한 프로젝트라면 Stage 2~3 기능 도입은 미루는 편이 안전합니다.


더 깊게 공부하려면 어떤 자료를 보면 좋을까요?

가장 정확한 1차 자료는 TC39 공식 프로포절 저장소(github.com/tc39/proposals)입니다. 각 기능의 현재 Stage와 설계 논의가 그대로 올라와 있어 본문 표의 상태가 바뀌었는지 직접 대조할 수 있습니다. Temporal은 tc39.es/proposal-temporal의 쿡북(cookbook) 문서가 실전 예제가 풍부해 Date에서 마이그레이션할 때 바로 도움이 됩니다. 브라우저·Node.js 지원 버전은 caniuse.com과 MDN의 각 메서드 페이지에서 교차 확인하시고, Babel 플러그인을 쓸 거라면 babeljs.io의 proposal 플러그인 문서에서 topicToken 같은 옵션을 확인하시면 됩니다.


JavaScriptES2026PipelineTemporal프로그래밍

함께 보면 좋은 문제 해결

관련 포스트