emewjin.github.io
Ecma International, ECMAScript 2025 승인: 새로운 기능은?
ES2025 의 핵심은 Iterator Helpers(.filter/.map/.take)와 `import attributes` + JSON 모듈, 그리고 `Promise.try` / `Set` 메서드 / RegExp `v` 플래그. 일상 코드의 표현력을 한 단계 끌어올린다.
핵심 요약
주요 기능 정리:
// 1) Iterator Helpers - lazy 파이프라인
['a','','b','','c','','d','','e'].values()
.filter(x => x.length > 0)
.drop(1).take(3)
.map(x => `=${x}=`)
.toArray(); // ['=b=', '=c=', '=d=']
// 2) import attributes + JSON 모듈
import config from './config.json' with { type: 'json' };
const dyn = await import('./config.json', { with: { type: 'json' } });
// 3) Promise.try - sync/async/throw 통일
await Promise.try(() => maybeSync()).catch(handle);
// 4) Set 메서드
A.union(B); A.intersection(B); A.difference(B);
A.isSubsetOf(B); A.isSupersetOf(B); A.isDisjointFrom(B);
// 5) RegExp v - 유니코드 집합 연산
/[\p{Letter}--\p{ASCII}]/v; // 비-ASCII 글자만
// 6) RegExp 명명된 캡처 그룹 중복 허용
/(?<n>\d+)|(?<n>[a-z]+)/;
// 7) Atomics.pause - 짧은 스핀 대기 힌트
Atomics.pause();
공통 동기는 "패턴은 흔한데 매번 손코딩하던 것" 을 표준 메서드로 끌어올리는 것이다.
ES2025 변경사항을 외울 게 아니라 "어떤 코드 패턴을 더 짧고 안전하게 만들 수 있게 됐는가" 로 묶어 기억한다.
- 데이터 변환: Iterator Helpers — 배열로 변환하지 않고 lazy 파이프라인
- 모듈 시스템: import attributes + JSON 모듈 — 비-JS 자원의 표준 import
- 비동기:
Promise.try— sync/async/throw 를 한 진입점으로 통일 - 컬렉션:
Set메서드 —union/intersection/difference표준화 - 정규식: RegExp
v플래그 — 유니코드 집합 연산 - 동기화:
Atomics.pause, 공유 메모리 정렬
면접에서 "최신 ES 에서 인상적인 기능?" 은 단순 자랑 아닌 언어 발전의 방향성 을 읽는 능력 테스트다. ES2025 는 함수형 표현·모듈 일관성·비동기 진입점·집합 연산처럼 "매일 쓰는 코드의 군더더기를 깎는" 변경이 많다. 따라서 "이 기능 알아요" 가 아니라 "전엔 이렇게 짰는데, 이젠 이렇게 짭니다 + 그래서 어떤 비용이 줄었습니다" 로 답해야 한다.
학습 포인트
면접 답변으로 연결할 학습 포인트입니다.
Iterator Helpers 는 "메모리 안 쓰는 배열 메서드"
기존 array.filter().map().slice() 는 중간 배열을 매번 새로 만든다. Iterator Helpers 는 lazy 라 진짜 필요한 만큼만 평가한다.
// 기존: 매 단계 새 배열
bigArr.filter(f).map(m).slice(0, 3);
// ES2025: 끝에서 take(3) 하면 3개만 평가
bigArr.values().filter(f).map(m).take(3).toArray();
특히 무한 이터러블(function* generator) 과 결합할 때 위력적. 메모리/시간 둘 다 아낀다.
이미 작은 배열에까지 .values() 체이닝으로 바꾸는 것. 오버헤드만 늘고 가독성도 손해. 큰 데이터/스트림에서만 이득이 명확.
import attributes + JSON 모듈 — 비-JS 자원의 표준 진입
ES 모듈은 원래 JS 만 import 가 표준이었고 JSON/CSS 등은 번들러 마법에 의존했다. with { type: 'json' } 가 표준화되면서 런타임이 직접 JSON 모듈을 평가한다. 보안적으로도 "내가 JSON 으로 받겠다" 를 명시하므로 MIME 미스매치 공격 방지에 기여한다.
// 정적
import pkg from './package.json' with { type: 'json' };
// 동적
const data = await import(url, { with: { type: 'json' } });
assert { type: 'json' } 옛 문법으로 쓰는 것. ES2025 부터 with 가 표준이며 assert 는 deprecated.
`Promise.try` — sync/async/throw 통합 진입점
기존엔 "콜백이 sync 일지 async 일지 모를 때" 다음처럼 짰다.
Promise.resolve().then(() => maybeSync()); // 또는 new Promise(...) 래핑
그러나 즉시 throw 하는 sync 함수 는 Promise.resolve().then(fn) 으로 잡히지만 의미상 우회. ES2025 의 Promise.try 는 "무조건 Promise 컨텍스트로 들어가서, sync throw 도 catch 로 흘려보낸다" 는 한 줄짜리 진입점.
await Promise.try(() => maybeSync()).catch(handle);
async () => maybeSync() 즉시호출(IIFE) 로 같은 효과를 보려는 것. 동작은 비슷하지만 의도/의미가 약함.
읽는 순서
- 1이론
ES2025 변경사항을 데이터 변환 / 모듈 / 비동기 / 컬렉션 / 정규식 / 동기화 6개 카테고리로 나눠 한 줄씩 정리한다.
- 2구현
큰 배열·무한 generator·중첩된 sync/async 호출의 세 시나리오를 (a) ES2024 이전 (b) ES2025 신기능으로 짜보고 코드 라인 수와 메모리 사용을 비교.
- 3실무
프로젝트의
Array.prototype.filter().map().slice()호출 중 큰 데이터/스트림 에 해당하는 곳을 찾아 Iterator Helpers 로 치환 후 성능 측정. JSON config import 가 번들러 마법에 의존하는 곳은 표준 import attributes 로 옮긴다. - 4설명
동료에게 "ES2025 에서 가장 개발자 일상을 바꾸는 기능 3개" 를 5분 안에 코드 예시 없이 말로 설명한다.
면접 연결 질문
[감점 답변] "새 표준이라 좋다". [좋은 답변] lazy 평가 라 중간 배열이 없고 take(N) 시점에 N 개만 평가 — 큰/무한 데이터에 유리. 단 작은 고정 배열에는 체이닝 오버헤드만 늘 수 있다. 즉 "스트림/큰 데이터/제너레이터" 일 때 권장.
[감점 답변] "async 래핑이에요". [좋은 답변] sync throw + async reject 를 같은 catch 로 잡는 진입점. 예: await Promise.try(() => maybeSync()).catch(handle) — maybeSync 가 throw 하든 reject 하든 모두 handle 로 흘러간다. 기존엔 try/catch + Promise.resolve().then(...) 두 곳을 모두 다뤄야 했다.
[감점 답변] "수학적 집합이 필요할 때". [좋은 답변] 권한·태그·플래그 비교 같은 도메인 — 예: 사용자 권한 집합과 라우트 요구 권한의 intersection, A/B 그룹의 difference, 이전/현재 선택된 태그의 symmetricDifference. 기존엔 Array.filter(includes) 로 O(n*m) 코드를 썼지만 Set 메서드는 의도가 명료하고 평균 O(n).
자기 점검
"결과만 같으면 동등" 이라는 인식. 메모리/시간 측면에서 큰 차이가 난다.
"같은 결과" 라는 가정. 모듈 그래프/캐시/번들러 분석/보안 면에서 다르다.