{"componentChunkName":"component---src-templates-blog-post-js","path":"/translation/2026/what-to-know-in-js-2026/","result":{"data":{"site":{"siteMetadata":{"title":"Ykss","author":"[Ykss]","siteUrl":"https://ykss.netlify.app","comment":{"disqusShortName":"","utterances":"ykss/ykss.netlify.com"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"6169bcc8-5c1c-5ace-a721-9a7e0b0eee1e","excerpt":"원문: What To Know in JavaScript (2026 Edition) CSS…","html":"<blockquote>\n<p>원문: <a href=\"https://frontendmasters.com/blog/what-to-know-in-javascript-2026-edition/\">What To Know in JavaScript (2026 Edition)</a></p>\n</blockquote>\n<p><a href=\"https://frontendmasters.com/blog/what-you-need-to-know-about-modern-css-2025-edition/\">CSS에 대해서는 이런 글을 작성한 적이 있는데</a>, 자바스크립트도 마찬가지로 다뤄봐야겠습니다! 특히 자바스크립트는 버전 관리가 훨씬 잘 이루어지니까요. 언어의 새로운 기능을 살펴보겠지만, 자바스크립트 개발자로 일한다는 건 언어 그 자체를 넘어 런타임, 프레임워크, 라이브러리, 툴링까지 아우르는 일입니다. 자, 시작해봅시다. 어차피 이미 아래로 스크롤했겠지만요.</p>\n<h2 id=\"언어의-새로운-기능\" style=\"position:relative;\"><a href=\"#%EC%96%B8%EC%96%B4%EC%9D%98-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5\" aria-label=\"언어의 새로운 기능 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>언어의 새로운 기능</h2>\n<p>자바스크립트는 매년 버전이 릴리스됩니다. 꽤 좋은 방식이라고 생각합니다!</p>\n<h3 id=\"ecmascript-2025\" style=\"position:relative;\"><a href=\"#ecmascript-2025\" aria-label=\"ecmascript 2025 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ECMAScript 2025</h3>\n<p>가장 최신 버전은 <strong>ECMAScript 2025</strong>로, 2025년 6월에 출시됐습니다. <a href=\"https://tc39.es/ecma262/2025/\">전체 스펙은 이 버전에서 확인할 수 있습니다</a>.</p>\n<h4 id=\"이터레이터-헬퍼iterator-helpers\" style=\"position:relative;\"><a href=\"#%EC%9D%B4%ED%84%B0%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%97%AC%ED%8D%BCiterator-helpers\" aria-label=\"이터레이터 헬퍼iterator helpers permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>이터레이터 헬퍼(Iterator Helpers)</h4>\n<p>이제 이터레이터에서 직접 <code class=\"language-text\">.map()</code>, <code class=\"language-text\">.filter()</code>, <code class=\"language-text\">.take()</code>, <code class=\"language-text\">.drop()</code> 같은 메서드를 지연 평가(lazy evaluation) 방식으로 사용할 수 있습니다. 솔직히 주로 프런트엔드 일을 하는 저 같은 사람 입장에서는 좀 생소하게 느껴집니다. 배열에서 이미 map을 쓸 수 있는데 뭐가 대단하냐고요? 하지만 성능 측면에서는 분명히 의미가 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> array\n  <span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x</span> <span class=\"token operator\">=></span> x <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 새 배열을 메모리에 생성</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x</span> <span class=\"token operator\">=></span> x <span class=\"token operator\">></span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// ... 또 생성</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// ... 또 생성</span></code></pre></div>\n<p>배열이 크고 각 연산이 “비용이 많이 든다”면, 이 방식은 느리고 메모리도 많이 씁니다. 새로운 방식은 이렇습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> Iterator<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span>array<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x</span> <span class=\"token operator\">=></span> x <span class=\"token operator\">*</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x</span> <span class=\"token operator\">=></span> x <span class=\"token operator\">></span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">take</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">toArray</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 중간 배열 생성 없이, 3개를 찾으면 연산을 멈춥니다</span></code></pre></div>\n<p>보너스로 <code class=\"language-text\">Iterator.from()</code>은 이터러블(iterable)한 것이라면 뭐든 동작합니다. 배열뿐 아니라 Set, Map, 제너레이터 등 모두 동일한 메서드 세트를 쓸 수 있습니다.</p>\n<h4 id=\"set-메서드\" style=\"position:relative;\"><a href=\"#set-%EB%A9%94%EC%84%9C%EB%93%9C\" aria-label=\"set 메서드 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Set 메서드</h4>\n<p>자바스크립트의 Set은 각 항목이 고유한 배열 같은 자료구조입니다. 이건 새로운 게 아니지만, Set이 <em>두 개</em>라면 이야기가 달라집니다. 이제 두 Set을 비교해서 교집합, 차집합 등을 반환하는 메서드가 생겼습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> youKnow <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Set</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'JS'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Python'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'CSS'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'SQL'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> jobNeeds <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Set</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'JS'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'TypeScript'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Python'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 채용 공고에서 원하는 기술 중 이미 알고 있는 것</span>\nyouKnow<span class=\"token punctuation\">.</span><span class=\"token function\">intersection</span><span class=\"token punctuation\">(</span>jobNeeds<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// → Set {\"JS\", \"Python\"}</span>\n\n<span class=\"token comment\">// 모두 합친 것 — 당신의 전체 스택 + 채용 공고가 원하는 것</span>\nyouKnow<span class=\"token punctuation\">.</span><span class=\"token function\">union</span><span class=\"token punctuation\">(</span>jobNeeds<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// → Set {\"JS\", \"Python\", \"CSS\", \"SQL\", \"TypeScript\"}</span>\n\n<span class=\"token comment\">// 채용 공고가 원하지만 아직 모르는 것 (스킬 갭)</span>\njobNeeds<span class=\"token punctuation\">.</span><span class=\"token function\">difference</span><span class=\"token punctuation\">(</span>youKnow<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// → Set {\"TypeScript\"}</span>\n\n<span class=\"token comment\">// 당신이 알지만 채용 공고가 신경 쓰지 않는 것</span>\nyouKnow<span class=\"token punctuation\">.</span><span class=\"token function\">difference</span><span class=\"token punctuation\">(</span>jobNeeds<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// → Set {\"CSS\", \"SQL\"}</span>\n\n<span class=\"token comment\">// 한 쪽에만 있는 것, 양쪽 모두에 없는 것</span>\nyouKnow<span class=\"token punctuation\">.</span><span class=\"token function\">symmetricDifference</span><span class=\"token punctuation\">(</span>jobNeeds<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// → Set {\"CSS\", \"SQL\", \"TypeScript\"}</span>\n\n<span class=\"token comment\">// 채용 조건이 당신이 아는 것의 부분집합인가요?</span>\njobNeeds<span class=\"token punctuation\">.</span><span class=\"token function\">isSubsetOf</span><span class=\"token punctuation\">(</span>youKnow<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// → false</span>\n\n<span class=\"token comment\">// 당신이 모든 기술을 알고 있고 그 이상인가요?</span>\nyouKnow<span class=\"token punctuation\">.</span><span class=\"token function\">isSupersetOf</span><span class=\"token punctuation\">(</span>jobNeeds<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// → false</span>\n\n<span class=\"token comment\">// 당신과 채용 공고 사이에 겹치는 게 전혀 없나요?</span>\nyouKnow<span class=\"token punctuation\">.</span><span class=\"token function\">isDisjointFrom</span><span class=\"token punctuation\">(</span>jobNeeds<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// → false</span></code></pre></div>\n<p>꽤 유용하죠. Claude Code가 이걸로 <a href=\"https://codepen.io/editor/chriscoyier/pen/019c9733-c5ed-7594-9bd9-8ed47f3860d1?file=%2Findex.html&#x26;orientation=left&#x26;show=preview\">인터렉티브 데모를 만들어줬는데</a> 재밌었습니다.</p>\n<h4 id=\"정규식regex-업데이트\" style=\"position:relative;\"><a href=\"#%EC%A0%95%EA%B7%9C%EC%8B%9Dregex-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8\" aria-label=\"정규식regex 업데이트 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>정규식(RegEx) 업데이트</h4>\n<p>상황을 설명하겠습니다. 페이지 내 검색 기능을 만들고 있는데, 사용자가 직접 검색어를 입력합니다. 그 검색어를 정규식으로 사용하려고 하는데, 여기에 위험이 있습니다. 사용자가 입력하는 문자 중 일부는 정규식에서 “특수 문자”로 쓰이기 때문입니다. 예를 들어 <code class=\"language-text\">$</code>는 마지막 문자를 가리키는 식으로요. 그래서 사용자가 <code class=\"language-text\">$9</code>를 검색하면 정규식이 깨집니다. 어떤 문자를 “이스케이프(escape)“해야 하는지는 각 정규식 구현마다 다릅니다.</p>\n<p>그래서! 무려 15년에 걸친 여정 끝에 <code class=\"language-text\">RegExp.escape()</code>가 드디어 등장했습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> query <span class=\"token operator\">=</span> userInput<span class=\"token punctuation\">;</span> <span class=\"token comment\">// 예: \"$5.00 (off!)\"</span>\n\n<span class=\"token comment\">// ❌ 이전 방식 — 정규식 특수 문자가 있으면 깨짐</span>\n<span class=\"token keyword\">const</span> badRe <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">RegExp</span><span class=\"token punctuation\">(</span>query<span class=\"token punctuation\">,</span> <span class=\"token string\">'g'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ✅ ES2025 — 메서드 하나로 문제 해결</span>\n<span class=\"token keyword\">const</span> goodRe <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">RegExp</span><span class=\"token punctuation\">(</span>RegExp<span class=\"token punctuation\">.</span><span class=\"token function\">escape</span><span class=\"token punctuation\">(</span>query<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'g'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>이번에도 <a href=\"https://codepen.io/editor/chriscoyier/pen/019cbeea-b5e2-7af0-acbe-96dab95e0ee8\">Claude Code가 제법 훌륭한 데모를 만들어줬습니다</a>.</p>\n<p>정규식 “플래그”가 동작하는 방식도 업데이트됐습니다. 흔히 쓰는 <code class=\"language-text\">i</code> 플래그처럼, 대소문자를 구분하지 않는 옵션을 정규식 끝에 <code class=\"language-text\">/i</code>로 붙이는 방식이 있었죠. 그런데 정규식의 <em>일부분만</em> 대소문자 구분 없이 처리하고 싶다면 어떻게 할까요? 이제는 해당 부분을 괄호로 감싸고 앞에 플래그를 추가하면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 방식 — 대소문자 민감도를 섞을 수 없었음</span>\n<span class=\"token operator\">/</span><span class=\"token punctuation\">[</span>a<span class=\"token operator\">-</span>z<span class=\"token punctuation\">]</span><span class=\"token operator\">+</span>@<span class=\"token punctuation\">[</span><span class=\"token constant\">A</span><span class=\"token operator\">-</span><span class=\"token constant\">Z</span><span class=\"token punctuation\">]</span><span class=\"token operator\">+</span><span class=\"token operator\">/</span>i  <span class=\"token comment\">// 'i' 플래그가 전체에 적용됨</span>\n\n<span class=\"token comment\">// ES2025 — 그룹별 인라인 수정자</span>\n<span class=\"token operator\">/</span><span class=\"token punctuation\">(</span><span class=\"token operator\">?</span>i<span class=\"token operator\">:</span><span class=\"token punctuation\">[</span>a<span class=\"token operator\">-</span>z<span class=\"token punctuation\">.</span><span class=\"token punctuation\">]</span><span class=\"token operator\">+</span><span class=\"token punctuation\">)</span>@<span class=\"token punctuation\">(</span><span class=\"token operator\">?</span><span class=\"token operator\">-</span>i<span class=\"token operator\">:</span><span class=\"token punctuation\">[</span><span class=\"token constant\">A</span><span class=\"token operator\">-</span><span class=\"token constant\">Z</span><span class=\"token punctuation\">]</span><span class=\"token operator\">+</span><span class=\"token punctuation\">)</span>\\<span class=\"token punctuation\">.</span><span class=\"token punctuation\">(</span><span class=\"token operator\">?</span>i<span class=\"token operator\">:</span>com<span class=\"token operator\">|</span>org<span class=\"token punctuation\">)</span><span class=\"token operator\">/</span>\n<span class=\"token comment\">//^^^^ 대소문자 구분 없는 부분</span>\n<span class=\"token comment\">//             ^^^^^ 대소문자 구분하는 부분</span>\n<span class=\"token comment\">//                           ^^^ 대소문자 구분 없는 부분</span></code></pre></div>\n<h4 id=\"promise-업데이트\" style=\"position:relative;\"><a href=\"#promise-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8\" aria-label=\"promise 업데이트 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise 업데이트</h4>\n<p>모두가 좋아하는 비동기 프로그래밍 모델(Promise)에 <code class=\"language-text\">Promise.try()</code>가 추가되면서 오류 처리를 간소화할 수 있습니다. 어떤 함수는 동기적으로, <em>또는</em> 비동기적으로 에러를 던질 수 있었는데, 각각 따로 처리해야 했습니다. 이제는 한꺼번에 처리할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 비동기일 수도, 동기 에러를 던질 수도 있는 함수</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">loadUser</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>id<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'No ID'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 동기 에러</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/api/users/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>id<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 비동기</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ❌ 이전 방식 — 두 가지 에러 경로 처리</span>\n<span class=\"token keyword\">let</span> p<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n  p <span class=\"token operator\">=</span> <span class=\"token function\">loadUser</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 여기서 동기 에러를 잡고…</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">handleError</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\np<span class=\"token operator\">?.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token function\">handleError</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// …여기서 비동기 에러를 잡음</span>\n\n<span class=\"token comment\">// ✅ ES2025 — 한 줄로, .catch() 하나로</span>\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">try</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">loadUser</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">user</span> <span class=\"token operator\">=></span> <span class=\"token function\">render</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">err</span> <span class=\"token operator\">=></span> <span class=\"token function\">showError</span><span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 둘 다 잡습니다</span></code></pre></div>\n<p>이번에도 <a href=\"https://codepen.io/editor/chriscoyier/pen/019cc8dc-9bde-7597-9b57-d91d6ef0a6c2\">Claude Code가 개념을 잘 설명해주는 데모를 만들어줬습니다</a>.</p>\n<h4 id=\"가져오기-속성\" style=\"position:relative;\"><a href=\"#%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0-%EC%86%8D%EC%84%B1\" aria-label=\"가져오기 속성 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>가져오기 속성</h4>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import/with\">가져오기 속성</a>은 개인적으로 가장 좋아하는 기능입니다. 정말로요! 우선 JSON 데이터를 fetch하고 파싱하는 과정 없이 그냥 JSON 파일로 바로 임포트할 수 있다는 게 마음에 듭니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> data <span class=\"token keyword\">from</span> <span class=\"token string\">\"./file.json\"</span> <span class=\"token keyword\">with</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">\"json\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><code class=\"language-text\">with</code> 이후의 객체 부분이 바로 “가져오기 속성”입니다. 여기에는 몇 가지 트릭이 더 있는데, 곧 살펴보겠습니다.</p>\n<p>JSON 임포트는 보기에도 깔끔하고 코드도 한두 줄 줄어들지만, 솔직히 꽤 주목할 만한 단점도 있습니다. Jake Archibald가 <a href=\"https://jakearchibald.com/2025/importing-vs-fetching-json/\">JSON 임포트 vs 페치</a>에서 지적한 내용인데요. 한 가지 큰 문제는, 임포트에 실패하면 “모듈 그래프 전체를 망가뜨릴 수 있다”는 점입니다. 꽤 심각하죠. 동적 <code class=\"language-text\">import()</code>를 사용해 실패를 <code class=\"language-text\">catch</code>할 수도 있지만…</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">default</span><span class=\"token operator\">:</span> data <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">with</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">'json'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 대체 로직</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">fetch</code>로 JSON을 가져올 때만큼의 유연성은 없어서 여전히 아쉬운 면이 있습니다. Jake는 임포트한 데이터가 “페이지 생명주기 동안 모듈 그래프에 계속 남아 있다”는 점도 짚어줍니다. <code class=\"language-text\">fetch</code> 이후 데이터처럼 가비지 컬렉션(garbage collection)이 되지 않는다는 거죠. 아무튼, 신중하게 사용하세요.</p>\n<p>JSON 외에도 가져오기 속성으로 임포트할 수 있는 게 있습니다. 제가 이 기능을 개인적으로 좋아하는 진짜 이유는 CSS를 이런 방식으로 임포트할 수 있다는 점 때문입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> componentStyles <span class=\"token keyword\">from</span> <span class=\"token string\">\"./component.css\"</span> <span class=\"token keyword\">with</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">\"css\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><a href=\"https://frontendmasters.com/blog/architecture-through-component-colocation/\">웹 컴포넌트와 CSS 모듈 스크립트를 활용한 바닐라 앱 아키텍처</a>에서 이에 대해 자세히 다뤘습니다. CSS 파일을 자바스크립트 컴포넌트 바로 옆 폴더에 나란히 두면서, CSS는 CSS 파일로 유지할 수 있다는 게 정말 마음에 듭니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> sheet <span class=\"token keyword\">from</span> <span class=\"token string\">'./styles.css'</span> <span class=\"token keyword\">with</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">'css'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">MyComponent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">HTMLElement</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> shadowRoot <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">attachShadow</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">mode</span><span class=\"token operator\">:</span> <span class=\"token string\">'open'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    shadowRoot<span class=\"token punctuation\">.</span>adoptedStyleSheets <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>sheet<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n     <span class=\"token operator\">...</span></code></pre></div>\n<hr>\n<p>ES2025의 모든 내용을 다룬 건 아니며, 이를 구체적으로 다루는 글도 이미 많이 있습니다. Matthew Tyson의 <a href=\"https://www.infoworld.com/article/4021944/ecmascript-2025-the-best-new-features-in-javascript.html\">ECMAScript 2025: 자바스크립트의 최고 신기능</a>이 꽤 도움이 됐습니다. <code class=\"language-text\">Float16Array</code> 같은 내용도 다루는데, 제 전문 영역은 아니지만 정밀도와 메모리 사용량 사이에서 트레이드오프가 필요한 상황에서 유용한 기능입니다.</p>\n<h3 id=\"ecmascript-2026-2026년-중반-예정\" style=\"position:relative;\"><a href=\"#ecmascript-2026-2026%EB%85%84-%EC%A4%91%EB%B0%98-%EC%98%88%EC%A0%95\" aria-label=\"ecmascript 2026 2026년 중반 예정 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ECMAScript 2026 (2026년 중반 예정)</h3>\n<p>2026년 아직 이른 시기지만, 예년처럼 연간 ECMAScript 릴리스가 연중에 나올 것을 기대하고 있습니다. 이미 Stage 4에 진입해 포함될 가능성이 높은 기능들을 소개합니다.</p>\n<h4 id=\"temporal-api\" style=\"position:relative;\"><a href=\"#temporal-api\" aria-label=\"temporal api permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Temporal API</h4>\n<p>자바스크립트에 한동안 추가된 기능 중 가장 기대되고 유용한 기능입니다. 한마디로 요약하면 “이제 라이브러리 없이도 자바스크립트에서 날짜와 시간을 제대로 다룰 수 있다”는 것입니다. 오랫동안 <a href=\"https://momentjs.com/\">Moment</a> 같은 훌륭한 라이브러리들이 이 빈자리를 채워왔고, 개발자들은 성능과 개발 경험(DX) 사이에서 선택을 강요받아왔습니다 😬.</p>\n<p>이 글을 쓰는 시점에 Safari만 <a href=\"https://caniuse.com/temporal\">아직 미지원 상태</a>이지만, <a href=\"https://blogs.igalia.com/compilers/2026/01/31/implementing-the-temporal-proposal-in-javascriptcore/\">작업이 진행 중</a>이고 이제 TP(기술 미리보기, Technical Preview)에 들어갔으니 머지않아 지원될 것입니다.</p>\n<p>이제 특정 시간대의 현재 시간을 구하는 것이 정말 간단해졌습니다. 라이브러리가 필요 없습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> now <span class=\"token operator\">=</span> Temporal<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">.</span><span class=\"token function\">zonedDateTimeISO</span><span class=\"token punctuation\">(</span><span class=\"token string\">'America/New_York'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 프로그래밍 방식의 날짜</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 더 읽기 좋은 방식으로...</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">.</span><span class=\"token function\">toLocaleString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><a href=\"https://github.com/tc39/agendas/blob/main/2026/03.md\">TC39 미팅 어젠다에는 다음 미팅이 당신의 시간대로 언제인지 알려주는 코드가 DevTools 콘솔용으로 올라와 있는데</a>, 꽤 재밌었습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">Temporal<span class=\"token punctuation\">.</span>ZonedDateTime<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span><span class=\"token string\">'2026-03-10T10:00[America/New_York]'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">withTimeZone</span><span class=\"token punctuation\">(</span>Temporal<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">.</span><span class=\"token function\">timeZoneId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 당신의 시간대</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">toLocaleString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>멋지죠.</p>\n<p>Temporal이 할 수 있는 건 무궁무진하지만, 기존 방식이 특히 엉망이었던 사례 몇 가지를 더 살펴보겠습니다.</p>\n<p>1월의 마지막 날에 “한 달을 더하면” 황당한 결과가 나왔습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> date <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token number\">2026</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">31</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 1월 31일</span>\ndate<span class=\"token punctuation\">.</span><span class=\"token function\">setMonth</span><span class=\"token punctuation\">(</span>date<span class=\"token punctuation\">.</span><span class=\"token function\">getMonth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// \"한 달 추가\"</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>date<span class=\"token punctuation\">.</span><span class=\"token function\">toDateString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Sun Mar 03 2026 ❌ 😬</span></code></pre></div>\n<p>하지만 멋진 Temporal API를 쓰면 올바르게 처리됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> jan31 <span class=\"token operator\">=</span> Temporal<span class=\"token punctuation\">.</span>PlainDate<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span><span class=\"token string\">'2026-01-31'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> feb <span class=\"token operator\">=</span> jan31<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">months</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>feb<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 2026-02-28 ✅</span></code></pre></div>\n<p>비교 연산도 이제 올바르게 작동합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> a <span class=\"token operator\">=</span> Temporal<span class=\"token punctuation\">.</span>Duration<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">hours</span><span class=\"token operator\">:</span> <span class=\"token number\">25</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> b <span class=\"token operator\">=</span> Temporal<span class=\"token punctuation\">.</span>Duration<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">days</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> cmp <span class=\"token operator\">=</span> Temporal<span class=\"token punctuation\">.</span>Duration<span class=\"token punctuation\">.</span><span class=\"token function\">compare</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">relativeTo</span><span class=\"token operator\">:</span> Temporal<span class=\"token punctuation\">.</span>Now<span class=\"token punctuation\">.</span><span class=\"token function\">plainDateISO</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>cmp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 1  (25시간 > 1일) ✅</span></code></pre></div>\n<h4 id=\"명시적-자원-관리explicit-resource-management\" style=\"position:relative;\"><a href=\"#%EB%AA%85%EC%8B%9C%EC%A0%81-%EC%9E%90%EC%9B%90-%EA%B4%80%EB%A6%ACexplicit-resource-management\" aria-label=\"명시적 자원 관리explicit resource management permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>명시적 자원 관리(Explicit Resource Management)</h4>\n<p>비동기 함수와 await 사용 시 정리(cleanup)를 보장하는 새로운 <code class=\"language-text\">using</code> 키워드가 생겼습니다. 런타임은 변수가 스코프를 벗어날 때 <code class=\"language-text\">[Symbol.dispose]()</code>(또는 <code class=\"language-text\">[Symbol.asyncDispose]()</code>)가 반드시 호출되도록 보장합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">FileHandle</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">path</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>path <span class=\"token operator\">=</span> path<span class=\"token punctuation\">;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Opened </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>path<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">async</span> <span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ... 데이터 쓰기</span>\n  <span class=\"token punctuation\">}</span>\n\n  async <span class=\"token punctuation\">[</span>Symbol<span class=\"token punctuation\">.</span>asyncDispose<span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">await</span> <span class=\"token function\">someFlushOperation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Flushed and closed </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>path<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">saveData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> using file <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FileHandle</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"output.txt\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">await</span> file<span class=\"token punctuation\">.</span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"hello world\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// 에러가 발생해도 여기서 file이 자동으로 flush되고 닫힙니다</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>단일 자원에는 <code class=\"language-text\">using</code> 키워드가 훌륭하지만, 여러 자원을 정리해야 할 때를 위한 DisposableStack도 생겼습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">runJob</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> using stack <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">AsyncDisposableStack</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> db <span class=\"token operator\">=</span> stack<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> <span class=\"token function\">openDatabase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> file <span class=\"token operator\">=</span> stack<span class=\"token punctuation\">.</span><span class=\"token function\">use</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">FileHandle</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"output.txt\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> tmpDir <span class=\"token operator\">=</span> stack<span class=\"token punctuation\">.</span><span class=\"token function\">defer</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">removeTempDir</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/tmp/job\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// 작업 수행...</span>\n  <span class=\"token keyword\">await</span> file<span class=\"token punctuation\">.</span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> db<span class=\"token punctuation\">.</span><span class=\"token function\">query</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"SELECT * FROM jobs\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// 세 가지 모두 역순으로 정리됩니다. 에러가 발생해도 마찬가지입니다</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4 id=\"arrayfromasync--iterator-시퀀싱\" style=\"position:relative;\"><a href=\"#arrayfromasync--iterator-%EC%8B%9C%ED%80%80%EC%8B%B1\" aria-label=\"arrayfromasync  iterator 시퀀싱 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Array.fromAsync / Iterator 시퀀싱</h4>\n<p><code class=\"language-text\">Array.fromAsync</code>는 2024년에 먼저 출시됐지만, 스펙에 문제가 있어 ES2026에서야 정식으로 포함됐습니다. 비동기 이터레이터를 순회하면서 <strong>각 <code class=\"language-text\">yield</code> 값을 await</strong>하여 결과를 일반 배열에 담습니다. 이 기능 없이는 직접 루프를 돌며 push해야 했습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span><span class=\"token operator\">*</span> <span class=\"token function\">fetchNumbers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">await</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">r</span> <span class=\"token operator\">=></span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 비동기 지연 시뮬레이션</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">await</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">r</span> <span class=\"token operator\">=></span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>r<span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">yield</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> numbers <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Array<span class=\"token punctuation\">.</span><span class=\"token function\">fromAsync</span><span class=\"token punctuation\">(</span><span class=\"token function\">fetchNumbers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>numbers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [1, 2, 3]</span></code></pre></div>\n<p>페이지네이션처럼 결과를 yield하는 비동기 함수들을 순회할 때 특히 유용합니다. yield 대신 모두 완료되면 반환하는 Promise 배열을 전달할 수도 있습니다.</p>\n<p>페이지네이션 이야기가 나온 김에, <code class=\"language-text\">Iterator.concat</code>은 이터레이션 대상을 지연 평가할 수 있게 해주는 새로운 기능입니다. 처음부터 모든 것을 배열에 펼쳐 담는 대신, 이터레이션은 그대로 수행하면서 중간에 멈추면 배열을 미리 채우지 않아 메모리를 아낄 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> page1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>Symbol<span class=\"token punctuation\">.</span>iterator<span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> page2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token number\">3</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token number\">4</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>Symbol<span class=\"token punctuation\">.</span>iterator<span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> page3 <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token number\">5</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">id</span><span class=\"token operator\">:</span> <span class=\"token number\">6</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>Symbol<span class=\"token punctuation\">.</span>iterator<span class=\"token punctuation\">]</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> item <span class=\"token keyword\">of</span> Iterator<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>page1<span class=\"token punctuation\">,</span> page2<span class=\"token punctuation\">,</span> page3<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">process</span><span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 모든 페이지를 지연 방식으로 순회합니다</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4 id=\"erroriserror\" style=\"position:relative;\"><a href=\"#erroriserror\" aria-label=\"erroriserror permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Error.isError()</h4>\n<p>어떤 값이 진짜 <code class=\"language-text\">Error</code> 객체인지 신뢰할 수 있게 확인할 수 있습니다. Error처럼 생긴 객체가 아닌 진짜 Error인지를요. 웹 워커(web worker)나 iframe처럼 서로 다른 “렐름(realm)“에서 발생해 일반적인 방법으로는 판별하기 어려울 수 있는 에러를 받는 중앙화된 에러 리포팅 서비스 같은 상황에서 특히 유용합니다.</p>\n<h4 id=\"mathsumprecise\" style=\"position:relative;\"><a href=\"#mathsumprecise\" aria-label=\"mathsumprecise permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Math.sumPrecise</h4>\n<p><code class=\"language-text\">console.log(0.1 + 0.2);</code>를 실행해본 적 있으신가요? 결과가 <code class=\"language-text\">0.30000000000000004</code>라는 이상한 숫자가 나오죠. 사연이 깁니다. Firefox에서 <code class=\"language-text\">console.log(Math.sumPrecise([0.1, 0.2]));</code>를 실행해보면… 결과는 정확히 같습니다.</p>\n<p>하지만 그럼에도 <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sumPrecise\">특정 상황에서는 여전히 유용하다고 합니다</a> 🤷‍♀️</p>\n<h4 id=\"base64--hex-인코딩\" style=\"position:relative;\"><a href=\"#base64--hex-%EC%9D%B8%EC%BD%94%EB%94%A9\" aria-label=\"base64  hex 인코딩 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Base64 / Hex 인코딩</h4>\n<p>이런 작업들을 이제 간단하고 직관적인 메서드 호출로 처리할 수 있다는 게 좋습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> val <span class=\"token operator\">=</span> <span class=\"token string\">'Frontend Masters!'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> textEnc <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TextEncoder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> bytes <span class=\"token operator\">=</span> textEnc<span class=\"token punctuation\">.</span><span class=\"token function\">encode</span><span class=\"token punctuation\">(</span>val<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>bytes<span class=\"token punctuation\">.</span><span class=\"token function\">toBase64</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 'RnJvbnRlbmQgTWFzdGVycyE='</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>bytes<span class=\"token punctuation\">.</span><span class=\"token function\">toHex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// '46726f6e74656e64204d61737465727321'</span></code></pre></div>\n<p>이번에도 Claude Code가 <a href=\"https://codepen.io/editor/chriscoyier/pen/019d5093-782b-7ab5-a507-f689e9e00173\">멋진 데모를 만들어줬습니다</a>.</p>\n<h2 id=\"프레임워크의-새로운-기능\" style=\"position:relative;\"><a href=\"#%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EC%9D%98-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5\" aria-label=\"프레임워크의 새로운 기능 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>프레임워크의 새로운 기능</h2>\n<h3 id=\"리액트-생태계\" style=\"position:relative;\"><a href=\"#%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%83%9D%ED%83%9C%EA%B3%84\" aria-label=\"리액트 생태계 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>리액트 생태계</h3>\n<p><a href=\"https://react.dev/blog/2024/12/05/react-19\">리액트 19는 2024년 12월에 출시됐고</a>, 현재는 19.2 버전입니다. 리액트 20에 뭐가 담길지 공개된 정보는 아직 많지 않습니다.</p>\n<p>리액트 19는 꽤 큰 릴리스였는데, <a href=\"https://react.dev/reference/rsc/server-components\">RSC(리액트 서버 컴포넌트)</a>, <a href=\"https://react.dev/learn/react-compiler\">리액트 컴파일러</a>, <a href=\"https://18.react.dev/reference/rsc/server-actions\">서버 액션</a>이 핵심입니다. 간략히 정리하면 이렇습니다.</p>\n<ul>\n<li><strong>RSC</strong>: Node 서버를 활용할 수 있다면, <em>어쩌면 정말로</em>, 원래 클라이언트 측 자바스크립트 번들에 포함됐을 일부 컴포넌트를 서버에서 처리하고 필요한 데이터만 클라이언트로 전달할 수 있습니다.</li>\n<li><strong>서버 액션</strong>: 마찬가지로 Node 서버가 있을 때, 서버에만 존재하는 함수를 컴포넌트에서 직접 호출할 수 있습니다. 폼 처리가 대표적인 예입니다.</li>\n<li><strong>컴파일러</strong>: 기존에는 개발자가 직접 챙겨야 했던 성능 최적화들이 있었습니다. <code class=\"language-text\">useMemo</code> 전문가이신가요? 저도 아닙니다. 이 컴파일러를 통해 리액트 코드를 먼저 처리하면 이런 최적화를 자동으로 해줍니다. 빌드 복잡도는 좀 높아지지만 성능은 올라갑니다.</li>\n</ul>\n<p>물론 세세한 변경 사항도 많지만, 크게 보면 이것들이 핵심입니다. <a href=\"https://reactnative.dev/blog/2025/12/10/react-native-0.83\">React Native는 0.83으로 업데이트됐으며</a>, 사실 저는 잘 모르는 영역이지만, 10년간의 개발 끝에 1.0을 “예고”(다소 비공식적이지만)한 것은 모두에게 의미 있는 일이라고 생각합니다. 링크는 찾지 못했는데, React Universe Conf 무대에서 언급된 것 같습니다.</p>\n<p>방금 오븐에서 꺼낸 따끈따끈한 서버 기반 리액트 기술들은 작년에 연달아 <a href=\"https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components\">심각한 보안 취약점</a>을 겪었고, 많은 사람들이 이를 보고 우려를 표명한 것은 충분히 이해할 만합니다.</p>\n<h3 id=\"뷰vue-생태계\" style=\"position:relative;\"><a href=\"#%EB%B7%B0vue-%EC%83%9D%ED%83%9C%EA%B3%84\" aria-label=\"뷰vue 생태계 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>뷰(Vue) 생태계</h3>\n<p>Vue 3.5는 안정적으로 유지되고 있으며, <a href=\"https://github.com/vuejs/core/releases/tag/v3.6.0-alpha.1\">Vue 3.6이 알파 버전으로 공개됐습니다</a>. “Solid 및 Svelte 5 수준”의 대폭적인 성능 향상을 가져오는 선택적 기능 <a href=\"https://github.com/vuejs/core/releases/tag/v3.6.0-alpha.1#about-vapor-mode\">Vapor Mode</a>가 함께 소개됐습니다.</p>\n<p><a href=\"https://frontendmasters.com/blog/the-vue-ecosystem-in-2024/\">2024년 Vue 생태계 전반에 대한 개요</a>에서 살펴볼 수 있습니다. 완전한 Vue 외부인으로서, 2025/2026년 상황을 파악하기가 다소 어렵습니다. 물론 Evan You가 핵심 인물이지만, 현재 “자바스크립트 툴링 회사”인 <a href=\"https://voidzero.dev/\">VoidZero</a>를 운영하고 있습니다. 이곳에서는 Vite 자체, 포맷팅, 린팅, 테스팅 등 <em>수많은</em> 주요 프로젝트를 아우르는 <a href=\"https://viteplus.dev/\">Vite+</a>를 만들고 있습니다. 이 모든 것이 Vue에만 국한된 게 아니다 보니, 이 모든 것을 이끌어가면서 Vue 자체에 집중하기가 쉽지 않을 것 같습니다 🤷‍♀️.</p>\n<p>주요 Vue 메타 프레임워크인 Nuxt는 <a href=\"https://nuxt.com/blog/v4\">4.0으로 업데이트됐으며</a>, Nuxt의 관리 주체인 NuxtLabs는 <a href=\"https://vercel.com/blog/nuxtlabs-joins-vercel\">Vercel에 인수됐습니다</a>. Vercel이 Nuxt를 완전히 “소유”하는 건 아니지만… 그런 느낌도 있죠. 메타 프레임워크들이 이론적으로 지속 가능한 기반을 갖게 됐다는 점에서 한편으론 긍정적이고, 한편으론 VoidZero가 Vue 본래 언어를 위한 메타 프레임워크를 제외한 자바스크립트 툴체인의 거의 모든 단계를 갖게 된 게 묘하게 느껴지기도 합니다. Vue의 대표적인 상태 관리 라이브러리인 Pinia는 <a href=\"https://pinia.vuejs.org/cookbook/migration-v2-v3.html\">v3로 업데이트되면서</a> Vue 2 지원을 종료했습니다.</p>\n<h3 id=\"svelte-생태계\" style=\"position:relative;\"><a href=\"#svelte-%EC%83%9D%ED%83%9C%EA%B3%84\" aria-label=\"svelte 생태계 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Svelte 생태계</h3>\n<p>Svelte는 <a href=\"https://svelte.dev/blog/svelte-5-is-alive\">v5에서 순항 중입니다</a>. 반응성을 더 세밀하게 제어해 더 효율적이고 빠른 “Runes API”를 도입한 큰 업데이트였습니다. 솔직히 Svelte나 <a href=\"https://svelte.dev/docs/kit/introduction\">SvelteKit</a>에 대해 잘 알지 못하지만, Vercel의 일부이기도 하고, 사용자들에게 아주 사랑받고 있다는 건 알고 있습니다.</p>\n<h2 id=\"자바스크립트-런타임\" style=\"position:relative;\"><a href=\"#%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%9F%B0%ED%83%80%EC%9E%84\" aria-label=\"자바스크립트 런타임 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>자바스크립트 런타임</h2>\n<p>가장 큰 런타임은 분명 브라우저에 내장된 것들입니다. 하지만 직접 선택해서 실행할 수 있는 런타임으로는 Node가 여전히 지배적인 플레이어이며, 두 개의 흥미로운 경쟁자가 있습니다. <a href=\"https://frontendmasters.com/blog/when-deno-or-bun-is-a-better-solution-than-node-js/\">Deno나 Bun이 Node를 대체할 수 있는 경우에 대해서는</a> 다뤘습니다. 최근에는 세 런타임 모두 TypeScript를 기본으로 지원하고 표준 Node API와의 호환성을 높이는 방향으로 수렴하는 추세입니다.</p>\n<h3 id=\"nodejs\" style=\"position:relative;\"><a href=\"#nodejs\" aria-label=\"nodejs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Node.js</h3>\n<p>Node의 최근 가장 큰 소식은 <a href=\"https://nodejs.org/en/learn/typescript/run-natively\">TypeScript 파일을 기본으로 실행할 수 있게 됐다는 것입니다</a>.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\">node my-script.ts</code></pre></div>\n<p>Node 22.18.0부터 <code class=\"language-text\">--experimental-strip-types</code> 플래그 없이도 이렇게 동작합니다. 다만 여전히 타입을 <em>제거(strip)</em>하는 방식이라, 실제 TypeScript 코드 문제를 경고해주지는 않습니다.</p>\n<p>Node에서 나오는 가장 큰 소식은 보통 화려하지는 않지만 중요한 기본기 개선들입니다. 보안, 성능 향상, 브라우저 자바스크립트 API와의 정렬이 대표적입니다.</p>\n<p>개인적으로 Node의 발전에 꽤 만족하고 있습니다. Node의 내장 테스트 러너로 전환하는 프로젝트를 진행했는데, 의존성을 줄일 수 있어 좋았습니다. 신뢰할 수 없는 코드 환경에서도 사용하기 쉬워진 <a href=\"https://nodejs.org/api/permissions.html#permissions\">권한 모델</a>도 응원합니다.</p>\n<h3 id=\"bun\" style=\"position:relative;\"><a href=\"#bun\" aria-label=\"bun permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bun</h3>\n<p><a href=\"https://bun.com/blog/bun-v1.3\">Bun의 큰 릴리스는 1.3</a>이었는데, 개발 서버 실행 관련 DX 기능이 많이 추가됐습니다. HTML 파일만 지정하면 완전한 기능을 갖춘 개발 서버를 실행할 수 있다는 게 꽤 만족스럽습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">bun <span class=\"token string\">'./**/*.html'</span></code></pre></div>\n<p>이 과정에서 처리와 번들링도 모두 해주므로, 이 맥락에서 Bun은 Vite의 대안이 될 수 있습니다.</p>\n<p>Bun에서 가장 큰 소식은 <a href=\"https://www.anthropic.com/news/anthropic-acquires-bun-as-claude-code-reaches-usd1b-milestone\">Anthropic(Claude를 만드는 회사)이 작년 말 Bun을 인수했다는 것입니다</a>. 전반적인 분위기는 Bun에 좋은 소식이라는 것으로, 안정적이고 자금력 있는 기반을 갖게 됐습니다.</p>\n<p>일반적으로 사람들이 Bun을 선택하는 이유는 속도 때문입니다. npm 패키지 설치 속도가 매우 빠르고 전반적으로 빠른 성능을 발휘합니다. <a href=\"https://js-segfault-compare.sigmasd.workers.dev/\">다소 안정성을 희생하기는 합니다</a>.</p>\n<h3 id=\"deno\" style=\"position:relative;\"><a href=\"#deno\" aria-label=\"deno permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Deno</h3>\n<p>Deno는 <a href=\"https://deno.com/blog/v2.0\">v2</a>를 유지하고 있습니다. 완전한 Node.js 호환성을 갖추고 있으며 세 런타임 중 가장 안정적입니다. 패키지의 <code class=\"language-text\">npm:</code> 지정자를 통해 npm과도 완전히 호환됩니다.</p>\n<p>사람들이 Deno를 선택하는 이유는 보통 안정성과 보안 우선 아키텍처 때문입니다. <a href=\"https://docs.deno.com/runtime/fundamentals/security/\">이렇게 명시되어 있습니다</a>.</p>\n<blockquote>\n<p>Deno는 기본적으로 보안이 적용됩니다. 명시적으로 활성화하지 않는 한, Deno로 실행되는 프로그램은 파일 시스템 접근, 네트워크 연결, 환경 접근 같은 민감한 API에 접근할 수 없습니다. 커맨드 라인 플래그나 런타임 권한 프롬프트를 통해 이러한 리소스에 대한 접근을 명시적으로 허용해야 합니다. 이는 의존성에 모든 시스템 I/O에 대한 전체 접근 권한이 자동으로 부여되어 프로젝트에 숨겨진 취약점이 생길 수 있는 Node와의 큰 차이점입니다.</p>\n</blockquote>\n<p>좋은 설계입니다.</p>\n<h2 id=\"빌드-도구\" style=\"position:relative;\"><a href=\"#%EB%B9%8C%EB%93%9C-%EB%8F%84%EA%B5%AC\" aria-label=\"빌드 도구 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>빌드 도구</h2>\n<h3 id=\"vite\" style=\"position:relative;\"><a href=\"#vite\" aria-label=\"vite permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vite</h3>\n<p><a href=\"https://vite.dev/\">Vite</a>는 자바스크립트 생태계의 지배적인 빌드 도구가 됐습니다. 운이 좋게 타이밍이 맞아떨어진 것 같습니다! Vue를 만든 팀에서 출발했지만, Vite는 거의 모든 프런트엔드 프로젝트에서 동작하는 빌드 도구입니다. 개인적으로 이들의 접근 방식이 마음에 드는데, 로컬 개발 시에는 전체 번들링 없이 변경된 작은 부분만 업데이트하면서 필요할 때는 프로덕션 수준의 번들링도 해줍니다.</p>\n<p><a href=\"https://vite.dev/blog/announcing-vite8\">Vite는 최근 v8로 업데이트됐습니다</a>. 서드파티 번들링 도구인 <a href=\"https://rollupjs.org/\">Rollup</a> 대신 자체 개발한 번들러인 <a href=\"https://rolldown.rs/\">Rolldown</a>을 사용하게 된 것이 주요 변경 사항입니다. 이는 더 “통합된 툴체인”이 되겠다는 Vite의 최근 방향과 일치합니다. 파서 등의 툴링을 공유함으로써 전체 시스템의 예측 가능성을 높일 수 있습니다. 이 전체 툴체인을 <a href=\"https://viteplus.dev/\">Vite+</a>라고 부르며, Vite의 멋진 개발 서버뿐 아니라 포맷팅, 린팅, 타입 검사, 테스팅, 태스크 실행, 모노레포 지원, 패키징까지 포함합니다.</p>\n<p>Cloudflare의 호스팅, 데이터 스토리지, 클라우드 함수 등의 인프라를 활용한 “배포 플랫폼” <a href=\"https://void.cloud/\">Void</a>도 개발 중입니다.</p>\n<blockquote>\n<p>데이터베이스, KV 스토리지, 오브젝트 스토리지, AI 추론, 인증, 큐, 크론 작업. 모두 내장되어 있습니다. 필요한 것만 임포트하고 불필요한 건 건너뛰세요.</p>\n</blockquote>\n<p>오늘날 대부분의 프레임워크가 Vite를 사용합니다. <a href=\"https://astro.build/\">Astro</a>, <a href=\"https://start.solidjs.com/\">SolidStart</a>, <a href=\"https://svelte.dev/docs/kit/introduction\">SvelteKit</a>, <a href=\"https://nuxt.com/\">Nuxt</a> 등이 그렇습니다. 눈에 띄는 예외는 webpack을 사용하며 Turbopack으로 전환 중인 Next.js입니다. <a href=\"https://github.com/cloudflare/vinext\">Cloudflare가 AI로 Next.js를 Vite로 포팅한 사례</a>도 있었는데, 꽤 논란이 됐습니다.</p>\n<h3 id=\"turbopack\" style=\"position:relative;\"><a href=\"#turbopack\" aria-label=\"turbopack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Turbopack</h3>\n<p><a href=\"https://nextjs.org/docs/app/api-reference/turbopack\">Turbopack</a>은 Vercel의 번들러로, Next.js v16부터 <a href=\"https://nextjs.org/docs/app/guides/upgrading/version-16#turbopack-by-default\">기본 번들러</a>가 됐습니다. Rust 기반 프로젝트로, Next.js의 이전 버전에서 webpack보다 최대 5~10배 빠른 새로고침 속도를 제공합니다. 현재는 Next.js에서만 사용되는 것으로 알고 있습니다.</p>\n<h3 id=\"webpack\" style=\"position:relative;\"><a href=\"#webpack\" aria-label=\"webpack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>webpack</h3>\n<p><a href=\"https://webpack.js.org/\">webpack</a>은 여전히 널리 사용되고 있으며, 다양한 로더의 필요성을 줄이고 여러 부분을 간소화하는 내용의 <a href=\"https://webpack.js.org/blog/2026-02-04-roadmap-2026/\">2026년 로드맵</a>을 발표했습니다. webpack이 너무 복잡하다는 일반적인 인식을 고려하면 반가운 소식입니다.</p>\n<h2 id=\"typescript\" style=\"position:relative;\"><a href=\"#typescript\" aria-label=\"typescript permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TypeScript</h2>\n<p><a href=\"https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/\">타입스크립트가 v6로 업데이트됐습니다</a>. v7은 2026년 중반을 목표로 하고 있으며, Go 기반의 새 컴파일러로 전환하는 대규모 릴리스가 될 예정입니다. v6의 주요 목표는 그 변화를 준비하는 정비 작업입니다. <a href=\"https://bytes.dev/archives/473\">Bytes 뉴스레터</a>에 간결한 요약이 있습니다.</p>\n<blockquote>\n<p>Strict 모드가 기본값 <code class=\"language-text\">true</code>로 변경됐고, <code class=\"language-text\">module</code>은 <code class=\"language-text\">esnext</code>를 기본값으로, <code class=\"language-text\">target</code>은 현재 연도의 ES 스펙(현재 <code class=\"language-text\">es2025</code>)에 맞춰 유동적으로 설정되며, <code class=\"language-text\">types</code>는 이제 <code class=\"language-text\">node_modules/@types</code>의 모든 것을 끌어오는 대신 빈 배열을 기본값으로 합니다. 마지막 변경 사항만으로도 많은 프로젝트가 깨지겠지만, 20~50%의 속도 향상 효과도 있습니다.</p>\n</blockquote>\n<p>VS Code나 Playwright 사용 시 약 10배의 속도 향상이 확인되는 v7을 미리 준비해두는 것이 좋을 것 같습니다.</p>\n<p>주목할 만한 소식은 <a href=\"https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/\">타입스크립트가 GitHub의 1위 언어가 됐다는 것입니다</a>, 전년 대비 66%의 성장입니다.</p>\n<h3 id=\"자바스크립트에-타입이\" style=\"position:relative;\"><a href=\"#%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90-%ED%83%80%EC%9E%85%EC%9D%B4\" aria-label=\"자바스크립트에 타입이 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>자바스크립트에 타입이?</h3>\n<p>몇 년 전, <a href=\"https://devblogs.microsoft.com/typescript/a-proposal-for-type-syntax-in-javascript/\">자바스크립트에 타입을 직접 추가하자는 논의</a>가 있었습니다. 컴파일러 없이도 타입스크립트의 일부 혜택을 누리자는 아이디어였죠. 그다지 진전이 없는 것 같고, 타입스크립트가 할 수 있는 것을 진정으로 대체하기는 어려울 것 같습니다.</p>\n<h3 id=\"ai\" style=\"position:relative;\"><a href=\"#ai\" aria-label=\"ai permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>AI</h3>\n<p>이쯤에서 이 이야기를 꺼내는 게 적당할 것 같습니다. 타입스크립트는 개발자들이 활발히 사용하는 언어이자 LLM이 학습할 오픈 소스 데이터로도 풍부하게 제공되다 보니, AI는 요즘 코드 작성을 정말 잘합니다. 특히 타입스크립트를요. 92%의 개발자가 어느 정도 AI를 활용해 코드를 작성한다고 하는데, 놀라운 성장이며 지금 이 시대 개발 업계에서 단연 가장 큰 이슈입니다.</p>\n<h2 id=\"테스팅\" style=\"position:relative;\"><a href=\"#%ED%85%8C%EC%8A%A4%ED%8C%85\" aria-label=\"테스팅 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>테스팅</h2>\n<p>자바스크립트의 주요 테스팅 프레임워크들, Jest, Jasmine, Mocha 등은 여전히 잘 운영되며 대부분의 테스트를 담당하고 있습니다. 하지만 변화도 있는데, Vite가 엄청나게 인기를 얻으면서 Vite의 테스팅 프레임워크인 <a href=\"https://vitest.dev/\">Vitest</a>도 급부상했습니다. Jest와 호환되어 테스트 마이그레이션이 비교적 쉽고, 훨씬 빠르며, 보기에도 더 깔끔합니다. Vitest에는 실제 브라우저에서 테스트를 실행할 수 있는 “브라우저 모드”도 있어 컴포넌트 테스팅에 꽤 중요한 기능입니다. 이 기능은 보통 <a href=\"https://playwright.dev/\">Playwright</a>와 함께 사용하는데, Playwright도 인기가 치솟고 있으며 자체적으로 “엔드투엔드(end-to-end)” 테스트도 할 수 있습니다. <a href=\"https://pptr.dev/\">Puppeteer</a>나 <a href=\"https://www.cypress.io/\">Cypress</a>보다 인기가 높아진 것 같습니다.</p>\n<h2 id=\"메타-프레임워크\" style=\"position:relative;\"><a href=\"#%EB%A9%94%ED%83%80-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC\" aria-label=\"메타 프레임워크 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>메타 프레임워크</h2>\n<h3 id=\"nextjs\" style=\"position:relative;\"><a href=\"#nextjs\" aria-label=\"nextjs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Next.js</h3>\n<p><a href=\"https://nextjs.org/blog/next-16\">Next.js는 Turbopack을 기본으로 채택한 첫 번째 버전인 v16입니다</a>. 개인적으로 이 방향으로의 전진이 마음에 들지만, 마이그레이션이 어려워 직접 운영 중인 프로젝트에서는 비활성화했습니다. 하지만 로깅/에러 개선은 눈에 띄게 발전했습니다. 이 버전의 Next.js는 리액트 컴파일러와 리액트 서버 컴포넌트를 자동으로 사용하는데, 이론적으로는 전반적인 성능 향상이지만 결과는 더 복잡하고 엇갈립니다.</p>\n<p>Next.js 사이트에 AI를 많이 사용한다면, <a href=\"https://nextjs.org/docs/app/guides/mcp\">MCP 서버</a>가 생겼다는 것도 주목할 만합니다. 연동하면 AI가 여러분의 사이트 작업을 훨씬 잘 이해하게 됩니다.</p>\n<p>리액트 19도 적용되어 <code class=\"language-text\">&lt;ViewTransition></code> 지원이 가능합니다. <a href=\"https://frontendmasters.com/blog/reacts-viewtransition-element/\">관련 내용은 여기서 살펴봤습니다</a>.</p>\n<h3 id=\"remix--react-router\" style=\"position:relative;\"><a href=\"#remix--react-router\" aria-label=\"remix  react router permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Remix / React Router</h3>\n<p>몇 년 전 Remix는 Shopify에 인수됐습니다. v2를 거쳐, Remix v3가 되려던 것이 사실은 <a href=\"https://reactrouter.com/\">React Router</a> v7이 된다고 발표됐습니다. <a href=\"https://remix.run/blog/wake-up-remix\">이제 Remix v3도 별도로 개발이 진행 중입니다</a>. 가장 큰 변화는 리액트가 더 이상 필수 의존성이 아니라는 점입니다.</p>\n<blockquote>\n<p>지금까지 본 어떤 프레임워크보다 웹에 더 가까운 느낌의 자체 컴포넌트 모델을 만들고 있습니다.</p>\n</blockquote>\n<p><a href=\"https://remix.run/jam/2025\">Remix Jam</a>이라는 행사에서 자세한 내용을 공개했으니, 관심이 있다면 확인해보세요.</p>\n<h3 id=\"tanstack\" style=\"position:relative;\"><a href=\"#tanstack\" aria-label=\"tanstack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TanStack</h3>\n<p>Remix 혼선의 반사이익 일부를 <a href=\"https://tanstack.com/\">TanStack 생태계</a>가 얻었을 수도 있습니다. <a href=\"https://tanstack.com/router/latest\">인기 있는 라우터</a>를 포함한 여러 도구들의 모음인데, 그 라우터가 Remix처럼 <a href=\"https://tanstack.com/start/latest\">프레임워크</a>로까지 발전했습니다.</p>\n<p>Adam Rackis가 작성한 <a href=\"https://frontendmasters.com/blog/tag/tanstack/\">TanStack 관련 콘텐츠</a>가 많이 있습니다.</p>\n<h3 id=\"astro\" style=\"position:relative;\"><a href=\"#astro\" aria-label=\"astro permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Astro</h3>\n<p><a href=\"https://astro.build/\">Astro</a>는 수년 동안 꾸준히 성장해왔고 지금도 멈추지 않았습니다. 올해 <a href=\"https://blog.cloudflare.com/astro-joins-cloudflare/\">Cloudflare에 인수됐는데</a>, 대체로 좋은 소식으로 받아들여집니다. 훌륭한 프런트엔드 프레임워크는 탄탄한 비즈니스 모델을 갖추기 어렵고, 그 해답이 탄탄한 호스팅 사업자와의 파트너십인 것 같습니다. 이미 <a href=\"https://blog.cloudflare.com/emdash-wordpress/\">이상한 WordPress 클론</a>을 만드는 데도 쓰이고 있습니다.</p>\n<p>기본적으로 정적 사이트를 만들면서도, 현대적인 자바스크립트 프레임워크의 컴포넌트 기반 아키텍처를 활용하고, 필요할 때 더 동적인 기능을 쉽게 추가하고 싶다면 Astro가 최고의 선택입니다.</p>\n<p><a href=\"https://astro.build/blog/astro-6/\">Astro의 최신 릴리스는 6.0입니다</a>. 개발 시 사용하는 런타임 커스터마이징, 콘텐츠 보안 정책(CSP, Content Security Policy), 실험적인 빠른 컴파일러 같은 성숙한 기능들이 추가됐습니다. 곧이어 <a href=\"https://astro.build/blog/astro-610/\">6.1</a>도 출시됐는데, 다양한 설정 개선 사항이 담겨 있어 얼마나 열정적으로 프레임워크를 개선하고 있는지 잘 보여줍니다.</p>\n<h2 id=\"npm\" style=\"position:relative;\"><a href=\"#npm\" aria-label=\"npm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>npm</h2>\n<p><a href=\"https://www.npmjs.com/\">npm</a>에서는 특별히 눈에 띄는 변화가 없는 것 같습니다. Microsoft/GitHub가 인수한 지 6년이 됐고 안정적으로 운영되고 있습니다. GitHub 자체는 <a href=\"https://damrnelson.github.io/github-historical-uptime/\">가동 시간 문제가 있었습니다</a>.</p>\n<p>npm에서 <em>덜</em> 좋은 소식은 공급망(supply chain) 사고들입니다. <a href=\"https://nx.dev/blog/s1ngularity-postmortem\">s1ngularity</a>는 사람들의 인증 정보/토큰/설정 파일을 탈취해 GitHub에 공개적으로 올렸습니다 😳. 이후 <a href=\"https://www.wiz.io/blog/widespread-npm-supply-chain-attack-breaking-down-impact-scope-across-debug-chalk\">debug/chalk</a>에서는 악성 패키지 업데이트가 배포되어 암호화폐 트랜잭션을 나쁜 사람들의 지갑으로 우회시킬 수 있었습니다. 그리고 자기 복제 형태로 인증 정보를 탈취하는 Shai-Hulud 웜(이런, <em>웜들</em>이 맞군요, 복수입니다)이 있었는데, 2.0 버전은 사용자 홈 디렉터리의 모든 파일을 덮어쓰거나 삭제하는 방식이었습니다. 2000만 회 이상의 다운로드를 기록한 796개의 npm 패키지에 배포됐습니다. 정말 대단하군요. npm 보안 관점에서 작년 한 해는 좋지 않았습니다.</p>\n<p>심각한 프로덕션 앱에서 npm을 사용한다면, <a href=\"https://socket.dev/\">Socket</a> 같은 도구를 활용해 보호 조치를 취하는 것이 좋을 수 있습니다.</p>\n<h2 id=\"무엇을-배워야-할까\" style=\"position:relative;\"><a href=\"#%EB%AC%B4%EC%97%87%EC%9D%84-%EB%B0%B0%EC%9B%8C%EC%95%BC-%ED%95%A0%EA%B9%8C\" aria-label=\"무엇을 배워야 할까 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>무엇을 배워야 할까?</h2>\n<p>언제나 변하지 않는 답은, 기본 원리를 이해하는 것이 툴링과 프레임워크의 변화와 상관없이 당신을 지켜준다는 것입니다. 감히 말하자면, AI가 코드 작성을 더 많이 도울수록, 코드가 어떻게 만들어지든 계획하고, 이끌고, 다듬고, 테스트하고, 설계하고, 좋은 취향을 적용할 수 있는 여러분 같은 사람이 더 필요해집니다.</p>\n<p>Frontend Masters에 가입하는 것이 그 기본기를 쌓는 방법입니다.</p>\n<br/>\n<blockquote>\n<p>🚀 한국어로 된 프런트엔드 아티클을 빠르게 받아보고 싶다면 Korean FE Article(<a href=\"https://kofearticle.substack.com/\">https://kofearticle.substack.com/</a>)을 구독해주세요!</p>\n</blockquote>","frontmatter":{"title":"(번역) 2026년판 자바스크립트 개발자가 알아야 할 것들","date":"May 07, 2026","thumbnail":null,"canonicalUrl":null}}},"pageContext":{"slug":"/translation/2026/what-to-know-in-js-2026/","previous":{"fields":{"slug":"/translation/2026/use-sync-external-store/"},"frontmatter":{"title":"(번역) useSyncExternalStore : 실전 리액트 개발을 위한 심층 해설"}},"next":null}},"staticQueryHashes":["1873090088","3128451518"]}