<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Webs on Commentary of Takao</title><link>https://takao.blog/ko/web/</link><description>Recent content in Webs on Commentary of Takao</description><generator>Hugo -- gohugo.io</generator><language>ko</language><copyright>Commentary of Takao</copyright><lastBuildDate>Sun, 12 Jul 2026 04:12:51 +0900</lastBuildDate><atom:link href="https://takao.blog/ko/web/index.xml" rel="self" type="application/rss+xml"/><item><title>React 19 New Features: What Developers Need to Know</title><link>https://takao.blog/ko/web/react-19-new-features/</link><pubDate>Wed, 08 Jul 2026 10:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/react-19-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-19-new-features-ko.png" alt="Featured image of post React 19 New Features: What Developers Need to Know" /&gt;&lt;h2 id="what-changed-in-react-19"&gt;What Changed in React 19
&lt;/h2&gt;&lt;p&gt;React 19 is not a minor 업데이트 but a paradigm shift. Stable 서버 Components, new hooks, and the React Compiler fundamentally change how developers write applications.&lt;/p&gt;
&lt;h2 id="stable-서버-components"&gt;Stable 서버 Components
&lt;/h2&gt;&lt;p&gt;React 서버 Components (RSC) are now production-ready. By rendering on the 서버 and sending HTML to the client, they reduce bundle size significantly.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// app/page.jsx — Server Component (default)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Home&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;posts&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;query&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;SELECT * FROM posts&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#a6e22e"&gt;posts&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;post&lt;/span&gt; =&amp;gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;post&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;}&amp;gt;{&lt;span style="color:#a6e22e"&gt;post&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;}&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ))}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Components using useState or useEffect must declare &amp;ldquo;use client&amp;rdquo; at the top.&lt;/p&gt;</description></item><item><title>Web Performance Monitoring Tools Compared 2026</title><link>https://takao.blog/ko/web/web-performance-monitoring-tools-2026/</link><pubDate>Wed, 08 Jul 2026 10:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/web-performance-monitoring-tools-2026/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-performance-monitoring-tools-2026-ko.png" alt="Featured image of post Web Performance Monitoring Tools Compared 2026" /&gt;&lt;h2 id="why-lighthouse-is-not-enough"&gt;Why Lighthouse Is Not Enough
&lt;/h2&gt;&lt;p&gt;Lighthouse is an excellent diagnostic tool, but it only measures lab data, not real user experience. Standard practice in 2026 combines lab measurements with Real User Monitoring (RUM).&lt;/p&gt;
&lt;h2 id="1-web-vitals--chrome-ux-report-and-crux-api"&gt;1. Web Vitals — Chrome UX Report and CrUX API
&lt;/h2&gt;&lt;p&gt;Google&amp;rsquo;s Chrome UX Report aggregates field data from real Chrome users. You can query it via API to analyze both your own and competitors&amp;rsquo; sites.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;response&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=YOUR_KEY&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;origin&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;metrics&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;largest_contentful_paint&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;cumulative_layout_shift&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-sentry-성능"&gt;2. Sentry 성능
&lt;/h2&gt;&lt;p&gt;Well-known for error monitoring, Sentry also offers robust 성능 tracing. It captures transactions end-to-end, from frontend to backend, with automatic instrumentation for React and Next.js. Setup takes minutes.&lt;/p&gt;</description></item><item><title>Refactoring Large Codebases using Autonomous AI Agents</title><link>https://takao.blog/ko/web/ai-agents-codebase-refactoring-future/</link><pubDate>Sun, 05 Jul 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/ai-agents-codebase-refactoring-future/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ai-agents-codebase-refactoring-future-ko.png" alt="Featured image of post Refactoring Large Codebases using Autonomous AI Agents" /&gt;&lt;h2 id="the-rise-of-ai-assisted-refactoring"&gt;The Rise of AI-Assisted Refactoring
&lt;/h2&gt;&lt;p&gt;Refactoring large codebases has traditionally been one of the most expensive and risk-prone activities in software engineering. Autonomous AI 에이전트 are now changing this landscape, offering the ability to reason about code structure, generate transformations, and validate correctness at a scale previously impossible.&lt;/p&gt;
&lt;h2 id="automated-code-cleanup"&gt;Automated Code Cleanup
&lt;/h2&gt;&lt;p&gt;AI 에이전트 excel at mechanical refactoring tasks. Dead code elimination, unused import removal, and consistent formatting can be handled by agents that parse the entire AST of a project. Tools like &lt;strong&gt;Codema&lt;/strong&gt; and &lt;strong&gt;OpenAI Codex CLI&lt;/strong&gt; already demonstrate how agents can identify deprecated patterns and suggest modern equivalents.&lt;/p&gt;</description></item><item><title>Double development Speeds with custom Git configuration Aliases</title><link>https://takao.blog/ko/web/git-alias-setup-productivity/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-alias-setup-productivity/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-alias-setup-productivity-ko.png" alt="Featured image of post Double development Speeds with custom Git configuration Aliases" /&gt;&lt;p&gt;How many times a day do you type commands like &lt;code&gt;git status&lt;/code&gt;, &lt;code&gt;git checkout&lt;/code&gt;, or &lt;code&gt;git commit&lt;/code&gt; in your terminal? For active developers, the answer is easily in the dozens or hundreds. Typing out these full commands repeatedly wastes keystrokes, increases typing errors, and slows down your development momentum.&lt;/p&gt;
&lt;p&gt;Git has a built-in 기능 to address this: &lt;strong&gt;Aliases&lt;/strong&gt;. By configuring aliases, you can map complex options or frequent commands to short, custom abbreviations.&lt;/p&gt;</description></item><item><title>Isolating Layout Computations via CSS contain Property</title><link>https://takao.blog/ko/web/performance-css-contain-property/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/performance-css-contain-property/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/performance-css-contain-property-ko.png" alt="Featured image of post Isolating Layout Computations via CSS contain Property" /&gt;&lt;h2 id="the-rendering-cost-of-dynamic-content"&gt;The Rendering Cost of Dynamic Content
&lt;/h2&gt;&lt;p&gt;Every time the DOM changes, the browser must recompute styles, layout, and paint. For pages with many interactive widgets—chat feeds, stock tickers, infinite-scroll lists—these recalculations can ripple across the entire document, causing jank and dropped frames.&lt;/p&gt;
&lt;p&gt;The CSS &lt;code&gt;contain&lt;/code&gt; property tells the browser that a subtree is &lt;strong&gt;independent&lt;/strong&gt; from the rest of the page. This enables the engine to skip global recalculations and treat the element as an isolated island.&lt;/p&gt;</description></item><item><title>Strict Type Guarding using TypeScript's NoInfer Utility</title><link>https://takao.blog/ko/web/typescript-unmapped-types-utility/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-unmapped-types-utility/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-unmapped-types-utility-ko.png" alt="Featured image of post Strict Type Guarding using TypeScript's NoInfer Utility" /&gt;&lt;h2 id="the-widening-problem"&gt;The Widening Problem
&lt;/h2&gt;&lt;p&gt;When TypeScript infers types from multiple call-site arguments, it often &lt;strong&gt;widens&lt;/strong&gt; the inferred type to accommodate all candidates. This is usually helpful, but in certain generic scenarios it produces types that are too loose, letting invalid states slip through.&lt;/p&gt;
&lt;p&gt;Consider a function that accepts a default value alongside a specific key:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;createState&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;T&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;extends&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;T&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;defaultValue&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;T&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;defaultValue&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;createState&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// T inferred as &amp;#34;color&amp;#34; | &amp;#34;blue&amp;#34; — not what we want
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TypeScript infers &lt;code&gt;T&lt;/code&gt; as &lt;code&gt;&amp;quot;color&amp;quot; | &amp;quot;blue&amp;quot;&lt;/code&gt; instead of constraining &lt;code&gt;defaultValue&lt;/code&gt; to match &lt;code&gt;key&lt;/code&gt;. The result type loses precision for both parameters.&lt;/p&gt;</description></item><item><title>OWASP ZAP in 2026: Advanced Scanning and CI/CD Integration</title><link>https://takao.blog/ko/web/owasp-zap-advanced-2026/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/owasp-zap-advanced-2026/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/owasp-zap-advanced-2026-ko.png" alt="Featured image of post OWASP ZAP in 2026: Advanced Scanning and CI/CD Integration" /&gt;&lt;h2 id="beyond-basic-scanning"&gt;Beyond Basic Scanning
&lt;/h2&gt;&lt;p&gt;OWASP ZAP has evolved significantly since its early days. In 2026, it is no longer just a point-and-click proxy scanner — it is a full-featured security automation platform with a powerful API, a scriptable automation framework, and deep CI/CD integration. If you need the basics first, read our &lt;a class="link" href="https://takao.blog/web/how-to-owasp-zap/" &gt;OWASP ZAP 설치 and setup 가이드&lt;/a&gt;. This article covers advanced workflows for teams running security tests at scale.&lt;/p&gt;</description></item><item><title>Designing Modern Content Security Policies for Hugo blogs</title><link>https://takao.blog/ko/web/hugo-latest-csp-best-practices-2026/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/hugo-latest-csp-best-practices-2026/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/hugo-latest-csp-best-practices-2026-ko.png" alt="Featured image of post Designing Modern Content Security Policies for Hugo blogs" /&gt;&lt;h2 id="why-csp-matters-for-static-sites"&gt;Why CSP Matters for Static Sites
&lt;/h2&gt;&lt;p&gt;Static sites built with Hugo are inherently more secure than dynamic applications, but they still execute third-party scripts for analytics, ads, and embeds. A &lt;strong&gt;Content Security Policy (CSP)&lt;/strong&gt; protects your visitors from XSS, data injection, and malicious script execution by controlling which resources can load.&lt;/p&gt;
&lt;h2 id="설정-csp-via-cloudflare-pages"&gt;설정 CSP via Cloudflare Pages
&lt;/h2&gt;&lt;p&gt;Cloudflare Pages supports custom &lt;code&gt;_headers&lt;/code&gt; files for controlling HTTP response headers:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# static/_headers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Content-Security-Policy: default-src &amp;#39;self&amp;#39;; script-src &amp;#39;self&amp;#39;; style-src &amp;#39;self&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For Hugo, place the &lt;code&gt;_headers&lt;/code&gt; file in your &lt;code&gt;static/&lt;/code&gt; directory so it gets copied to the output:&lt;/p&gt;</description></item><item><title>Using SSH Keys instead of GPG keys for Git Commit Signatures</title><link>https://takao.blog/ko/web/git-signing-commits-ssh-keys/</link><pubDate>Mon, 25 May 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-signing-commits-ssh-keys/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-signing-commits-ssh-keys-ko.png" alt="Featured image of post Using SSH Keys instead of GPG keys for Git Commit Signatures" /&gt;&lt;p&gt;For a long time, GPG (GNU Privacy Guard) keys were the industry standard for signing Git commits to prove identity and prevent tampering. However, 설정 up GPG involves generating keyrings, managing expiration dates, and debugging background agents, which introduces substantial friction for developers.&lt;/p&gt;
&lt;p&gt;To eliminate this complexity, Git 버전 2.34 introduced the ability to &lt;strong&gt;use your existing SSH keys to sign commits directly&lt;/strong&gt;, bypassing the need for GPG keys.&lt;/p&gt;</description></item><item><title>Testing CSP Rules Safely with Content-Security-Policy-Report-Only</title><link>https://takao.blog/ko/web/security-content-security-policy-csp-report-only/</link><pubDate>Fri, 15 May 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/security-content-security-policy-csp-report-only/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-content-security-policy-csp-report-only-ko.png" alt="Featured image of post Testing CSP Rules Safely with Content-Security-Policy-Report-Only" /&gt;&lt;h2 id="the-broken-widget-problem"&gt;The Broken-Widget Problem
&lt;/h2&gt;&lt;p&gt;Deploying a Content Security Policy is one of the strongest defenses against XSS attacks. But a single misconfigured directive can silently break inline scripts, block CDN resources, or disable analytics. If you apply CSP directly via the &lt;code&gt;Content-Security-Policy&lt;/code&gt; header and a critical script gets blocked, your production site breaks—often without an obvious error 콘솔 notification.&lt;/p&gt;</description></item><item><title>Exporting Proper TypeScript Declaration Files (.d.ts) for NPM</title><link>https://takao.blog/ko/web/typescript-declaration-files-dts/</link><pubDate>Sun, 10 May 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-declaration-files-dts/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-declaration-files-dts-ko.png" alt="Featured image of post Exporting Proper TypeScript Declaration Files (.d.ts) for NPM" /&gt;&lt;h2 id="why-declaration-files-matter"&gt;Why Declaration Files Matter
&lt;/h2&gt;&lt;p&gt;When you publish an npm package written in TypeScript, consumers need type information to get IntelliSense and compile-time checking. Without &lt;code&gt;.d.ts&lt;/code&gt; files, your library is effectively typed as &lt;code&gt;any&lt;/code&gt;, defeating the purpose of using TypeScript in the first place.&lt;/p&gt;
&lt;p&gt;Declaration files describe the shape of your exports without shipping the implementation source. They enable tree-shaking, documentation hover 팁, and strict type checking in consumer projects.&lt;/p&gt;</description></item><item><title>2026 Static Site Generators: Astro, Hugo, and 11ty</title><link>https://takao.blog/ko/web/static-site-generators-2026-comparison/</link><pubDate>Tue, 05 May 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/static-site-generators-2026-comparison/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/static-site-generators-2026-comparison-ko.png" alt="Featured image of post 2026 Static Site Generators: Astro, Hugo, and 11ty" /&gt;&lt;h2 id="2026-static-site-generators-astro-hugo-and-11ty"&gt;2026 Static Site Generators: Astro, Hugo, and 11ty
&lt;/h2&gt;&lt;p&gt;The static site generator landscape in 2026 is more diverse than ever. Developers choose between blazing-fast Go-based &lt;strong&gt;Hugo&lt;/strong&gt;, the islands-architecture pioneer &lt;strong&gt;Astro&lt;/strong&gt;, and the minimalist, flexible &lt;strong&gt;11ty&lt;/strong&gt; (Eleventy). Each excels in different scenarios — understanding their trade-offs is essential for picking the right tool for your project.&lt;/p&gt;
&lt;p&gt;This comparison evaluates them across build speed, templating, content management, image 최적화, i18n, and 배포.&lt;/p&gt;</description></item><item><title>Recovering Deleted Branches and Commits using git reflog</title><link>https://takao.blog/ko/web/git-recovery-deleted-branch-reflog/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-recovery-deleted-branch-reflog/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-recovery-deleted-branch-reflog-ko.png" alt="Featured image of post Recovering Deleted Branches and Commits using git reflog" /&gt;&lt;p&gt;&amp;ldquo;I accidentally deleted a local branch using &lt;code&gt;git branch -D&lt;/code&gt;,&amp;rdquo; or &amp;ldquo;I ran &lt;code&gt;git reset --hard HEAD~1&lt;/code&gt; and lost my unpushed commits!&amp;rdquo; If you have worked with Git for any length of time, you have likely experienced one of these stomach-dropping moments.&lt;/p&gt;
&lt;p&gt;While standard &lt;code&gt;git log&lt;/code&gt; commands won&amp;rsquo;t 디스플레이 references to deleted branches or detached commits, you don&amp;rsquo;t need to panic. Git has a built-in safety net called &lt;strong&gt;&lt;code&gt;git reflog&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Designing Reusable Docker Compose Configs for Dev and Prod</title><link>https://takao.blog/ko/web/docker-compose-production-best-practice/</link><pubDate>Mon, 20 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/docker-compose-production-best-practice/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-compose-production-best-practice-ko.png" alt="Featured image of post Designing Reusable Docker Compose Configs for Dev and Prod" /&gt;&lt;h2 id="designing-reusable-docker-compose-configs-for-dev-and-prod"&gt;Designing Reusable Docker Compose Configs for Dev and Prod
&lt;/h2&gt;&lt;p&gt;Docker Compose is the standard tool for defining and running multi-container applications. But many teams fall into the trap of maintaining separate &lt;code&gt;docker-compose.yml&lt;/code&gt; files for development, staging, and production — leading to duplication, drift, and configuration bugs.&lt;/p&gt;
&lt;p&gt;A better approach uses &lt;strong&gt;compose file overlays&lt;/strong&gt;, &lt;strong&gt;profiles&lt;/strong&gt;, and &lt;strong&gt;environment variables&lt;/strong&gt; to keep a single source of truth that adapts to each environment.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-base-composeyml-pattern"&gt;The Base &lt;code&gt;compose.yml&lt;/code&gt; Pattern
&lt;/h2&gt;&lt;p&gt;Start with a single &lt;code&gt;compose.yml&lt;/code&gt; that defines the shared service definitions — the image, command, ports, and environment that remain the same across environments.&lt;/p&gt;</description></item><item><title>Speeding Up assets Loading using DNS-Prefetch and Preconnect</title><link>https://takao.blog/ko/web/performance-dns-prefetch-preconnect/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/performance-dns-prefetch-preconnect/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/performance-dns-prefetch-preconnect-ko.png" alt="Featured image of post Speeding Up assets Loading using DNS-Prefetch and Preconnect" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Every external resource — fonts, scripts, images, API endpoints — requires a 네트워크 연결. The overhead of &lt;strong&gt;DNS 해상도&lt;/strong&gt;, &lt;strong&gt;TCP handshake&lt;/strong&gt;, and &lt;strong&gt;TLS negotiation&lt;/strong&gt; can add hundreds of milliseconds to page load time. &lt;strong&gt;Resource hints&lt;/strong&gt; like &lt;code&gt;dns-prefetch&lt;/code&gt; and &lt;code&gt;preconnect&lt;/code&gt; let you tell the browser to perform these steps &lt;strong&gt;in advance&lt;/strong&gt;, before the resource is actually needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-cost-of-연결"&gt;The Cost of 연결
&lt;/h2&gt;&lt;p&gt;Establishing an HTTPS 연결 involves multiple round trips:&lt;/p&gt;</description></item><item><title>Building Complex string Parsers inside TypeScript Type System</title><link>https://takao.blog/ko/web/typescript-template-literal-type-level-parsers/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-template-literal-type-level-parsers/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-template-literal-type-level-parsers-ko.png" alt="Featured image of post Building Complex string Parsers inside TypeScript Type System" /&gt;&lt;h2 id="parsing-at-the-type-level"&gt;Parsing at the Type Level
&lt;/h2&gt;&lt;p&gt;TypeScript&amp;rsquo;s template literal types, combined with recursive conditional types and &lt;code&gt;infer&lt;/code&gt;, allow you to parse and transform string literals entirely within the type system. This is not a runtime parser—it is a compile-time parser that extracts structure from string constants, enabling strongly typed APIs for URL routing, SQL queries, command-line arguments, and more.&lt;/p&gt;
&lt;h2 id="template-literal-types-primer"&gt;Template Literal Types Primer
&lt;/h2&gt;&lt;p&gt;Template literal types can interpolate other types and infer parts of a string.&lt;/p&gt;</description></item><item><title>Transitioning from WebGL to WebGPU for Faster Graphics</title><link>https://takao.blog/ko/web/webgpu-native-browser-graphics-generation/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/webgpu-native-browser-graphics-generation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/webgpu-native-browser-graphics-generation-ko.png" alt="Featured image of post Transitioning from WebGL to WebGPU for Faster Graphics" /&gt;&lt;h2 id="transitioning-from-webgl-to-webgpu-for-faster-그래픽"&gt;Transitioning from WebGL to WebGPU for Faster 그래픽
&lt;/h2&gt;&lt;p&gt;For over a decade, &lt;strong&gt;WebGL&lt;/strong&gt; has been the sole standard for hardware-accelerated 3D 그래픽 in the browser. Built on OpenGL ES, it exposed a state-machine API that worked well for its era but imposed significant CPU overhead and lacked direct access to modern GPU 기능. Enter &lt;strong&gt;WebGPU&lt;/strong&gt; — a next-generation 그래픽 and compute API designed from the ground up for modern GPU architectures.&lt;/p&gt;</description></item><item><title>Migrating from git checkout to git switch and restore</title><link>https://takao.blog/ko/web/git-checkout-restore-switch-commands/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-checkout-restore-switch-commands/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-checkout-restore-switch-commands-ko.png" alt="Featured image of post Migrating from git checkout to git switch and restore" /&gt;&lt;p&gt;One of the very first commands developers learn when starting out with Git is &lt;code&gt;git checkout&lt;/code&gt;. However, &lt;code&gt;git checkout&lt;/code&gt; is a notoriously overloaded command. It handles too many responsibilities, making it a common source of confusion and accidental file loss for 초보자 and experienced developers alike.&lt;/p&gt;
&lt;p&gt;To solve this, Git 버전 2.23 (released in 2019) introduced two dedicated, task-focused alternatives: &lt;strong&gt;&lt;code&gt;git switch&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;git restore&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll discuss the design problems surrounding &lt;code&gt;git checkout&lt;/code&gt;, explain the roles of the newer commands, and show you how to transition to using them today.&lt;/p&gt;</description></item><item><title>Comparing JWT Tokens vs Stateful Sessions in Web Security</title><link>https://takao.blog/ko/web/security-jwt-vs-session-auth/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/security-jwt-vs-session-auth/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-jwt-vs-session-auth-ko.png" alt="Featured image of post Comparing JWT Tokens vs Stateful Sessions in Web Security" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;인증 is the backbone of every web application. Two dominant patterns have emerged: &lt;strong&gt;stateless JWT (JSON Web Token)&lt;/strong&gt; auth and &lt;strong&gt;stateful session-based&lt;/strong&gt; auth. Both solve the same problem — verifying who a user is on subsequent requests — but they differ fundamentally in storage, revocation, and security properties. This article provides a detailed comparison to help you choose the right approach for your application.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="jwt-structure"&gt;JWT Structure
&lt;/h2&gt;&lt;p&gt;A JWT is a self-contained token consisting of three base64url-encoded segments separated by dots:&lt;/p&gt;</description></item><item><title>Optimizing Web Font Loading: Preventing FOUT and FOIT</title><link>https://takao.blog/ko/web/performance-fonts-loading-optimization/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/performance-fonts-loading-optimization/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/performance-fonts-loading-optimization-ko.png" alt="Featured image of post Optimizing Web Font Loading: Preventing FOUT and FOIT" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Web fonts enhance design but come at a cost. While a custom font loads, browsers must decide: show invisible text (&lt;strong&gt;FOIT&lt;/strong&gt; — Flash of Invisible Text) or show a fallback font (&lt;strong&gt;FOUT&lt;/strong&gt; — Flash of Unstyled Text). Either choice impacts &lt;strong&gt;CLS (Cumulative Layout Shift)&lt;/strong&gt; and user experience. This article covers strategies to load fonts reliably while minimizing layout shifts.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-font-디스플레이-descriptor"&gt;The font-디스플레이 Descriptor
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;font-display&lt;/code&gt; property in &lt;code&gt;@font-face&lt;/code&gt; controls how a font is displayed during loading:&lt;/p&gt;</description></item><item><title>Creative CSS Recipes with Parent Selector :has()</title><link>https://takao.blog/ko/web/css-has-pseudo-selector-recipes/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-has-pseudo-selector-recipes/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-has-pseudo-selector-recipes-ko.png" alt="Featured image of post Creative CSS Recipes with Parent Selector :has()" /&gt;&lt;h2 id="creative-css-recipes-with-parent-selector-has"&gt;Creative CSS Recipes with Parent Selector &lt;code&gt;:has()&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;For years, CSS developers dreamed of a &lt;strong&gt;parent selector&lt;/strong&gt; — a way to style an element based on its children. JavaScript and extra class names were the only workarounds. Then came &lt;code&gt;:has()&lt;/code&gt;, the CSS pseudo-class that finally makes &amp;ldquo;if this element contains X, style it accordingly&amp;rdquo; a native reality.&lt;/p&gt;
&lt;p&gt;As of 2026, &lt;code&gt;:has()&lt;/code&gt; is supported in all major browsers, opening a world of markup simplification and creative styling without touching JavaScript.&lt;/p&gt;</description></item><item><title>Building Apps using Gemini 1.5 Pro's Massive Context Length</title><link>https://takao.blog/ko/web/gemini-api-pro-latest-utilization/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/gemini-api-pro-latest-utilization/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/gemini-api-pro-latest-utilization-ko.png" alt="Featured image of post Building Apps using Gemini 1.5 Pro's Massive Context Length" /&gt;&lt;h2 id="the-context-window-revolution"&gt;The Context Window Revolution
&lt;/h2&gt;&lt;p&gt;Gemini 1.5 Pro redefined what&amp;rsquo;s possible with large language models by offering a context window of up to &lt;strong&gt;2 million tokens&lt;/strong&gt;. This means you can pass entire codebases, hours of video, or thousands of pages of documents in a single request — fundamentally changing how we interact with AI.&lt;/p&gt;
&lt;h2 id="understanding-gemini-15-pros-capabilities"&gt;Understanding Gemini 1.5 Pro&amp;rsquo;s Capabilities
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;기능&lt;/th&gt;
					&lt;th&gt;Capability&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Context window&lt;/td&gt;
					&lt;td&gt;Up to 2M tokens (1M standard)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Input modalities&lt;/td&gt;
					&lt;td&gt;Text, image, audio, video, code&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Output&lt;/td&gt;
					&lt;td&gt;Text, code, structured data&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Max output tokens&lt;/td&gt;
					&lt;td&gt;8,192&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Languages&lt;/td&gt;
					&lt;td&gt;100+ languages&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Pricing (input)&lt;/td&gt;
					&lt;td&gt;$1.25–$10.00 per 1M tokens&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Pricing (output)&lt;/td&gt;
					&lt;td&gt;$10.00–$40.00 per 1M tokens&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="multimodal-input-handling"&gt;Multimodal Input Handling
&lt;/h2&gt;&lt;p&gt;Gemini 1.5 Pro natively processes multiple modalities in a single request. You can combine text, images, audio, and video seamlessly:&lt;/p&gt;</description></item><item><title>Git Merge vs Git Rebase: Operational Guidelines</title><link>https://takao.blog/ko/web/git-merge-vs-rebase-best-practice/</link><pubDate>Wed, 25 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-merge-vs-rebase-best-practice/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-merge-vs-rebase-best-practice-ko.png" alt="Featured image of post Git Merge vs Git Rebase: Operational Guidelines" /&gt;&lt;p&gt;When integrating changes from one branch into another in Git, developers generally rely on two primary commands: &lt;code&gt;git merge&lt;/code&gt; and &lt;code&gt;git rebase&lt;/code&gt;. While both serve the same ultimate purpose—bringing code from two branches together—they approach the problem differently, resulting in vastly different commit histories.&lt;/p&gt;</description></item><item><title>Replacing LocalStorage: Dynamic IndexedDB wrapper localForage</title><link>https://takao.blog/ko/web/js-indexeddb-localforage-localstorage/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/js-indexeddb-localforage-localstorage/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-indexeddb-localforage-localstorage-ko.png" alt="Featured image of post Replacing LocalStorage: Dynamic IndexedDB wrapper localForage" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Client-side storage is a fundamental requirement for modern web applications — offline caches, user preferences, draft data, and session state all need to persist in the browser. For years, &lt;strong&gt;localStorage&lt;/strong&gt; has been the simplest go-to solution, but its limitations become painful as applications grow. This article compares localStorage, raw IndexedDB, and the &lt;strong&gt;localForage&lt;/strong&gt; wrapper library, providing practical guidance for choosing the right storage engine.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-limits-of-localstorage"&gt;The Limits of localStorage
&lt;/h2&gt;&lt;p&gt;localStorage offers a straightforward synchronous key-value API — &lt;code&gt;setItem(key, value)&lt;/code&gt; and &lt;code&gt;getItem(key)&lt;/code&gt; — but it comes with hard constraints:&lt;/p&gt;</description></item><item><title>Domain Safety: Setting Up SPF, DKIM, and DMARC Settings</title><link>https://takao.blog/ko/web/web-security-dnssec-spf-dkim-dmarc/</link><pubDate>Sun, 15 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/web-security-dnssec-spf-dkim-dmarc/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-security-dnssec-spf-dkim-dmarc-ko.png" alt="Featured image of post Domain Safety: Setting Up SPF, DKIM, and DMARC Settings" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Email 인증 is essential to prevent domain spoofing, phishing, and spam folder rejection. Three DNS-based standards — &lt;strong&gt;SPF&lt;/strong&gt;, &lt;strong&gt;DKIM&lt;/strong&gt;, and &lt;strong&gt;DMARC&lt;/strong&gt; — work together to verify that emails claiming to be from your domain are legitimate. Without these records, attackers can send forged emails on your behalf, and legitimate emails may land in recipients&amp;rsquo; spam folders. This 가이드 explains each standard and shows how to configure them on Cloudflare or your DNS provider.&lt;/p&gt;</description></item><item><title>PPR (Partial Prerendering): Merging Static and Dynamic routes</title><link>https://takao.blog/ko/web/nextjs-partial-prerendering-ppr/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/nextjs-partial-prerendering-ppr/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-partial-prerendering-ppr-ko.png" alt="Featured image of post PPR (Partial Prerendering): Merging Static and Dynamic routes" /&gt;&lt;h2 id="the-problem-static-vs-dynamic-tradeoffs"&gt;The Problem: Static vs Dynamic Tradeoffs
&lt;/h2&gt;&lt;p&gt;Traditionally, Next.js developers faced a binary choice: &lt;strong&gt;static generation&lt;/strong&gt; (fast but stale) or &lt;strong&gt;서버-side rendering&lt;/strong&gt; (fresh but slower). Partial Prerendering (PPR) eliminates this tradeoff by combining both approaches in a single page — a static HTML shell streams instantly, while dynamic content is loaded via React Suspense.&lt;/p&gt;
&lt;h2 id="how-ppr-works"&gt;How PPR Works
&lt;/h2&gt;&lt;p&gt;PPR works by identifying &lt;strong&gt;static and dynamic boundaries&lt;/strong&gt; using React Suspense. During build time, Next.js prerenders the static shell. At request time, it replaces Suspense fallbacks with streaming dynamic content:&lt;/p&gt;</description></item><item><title>Tailwind CSS v4.0 Release and Pure CSS Configuration</title><link>https://takao.blog/ko/web/tailwind-css-v4-release-changes/</link><pubDate>Thu, 05 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/tailwind-css-v4-release-changes/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/tailwind-css-v4-release-changes-ko.png" alt="Featured image of post Tailwind CSS v4.0 Release and Pure CSS Configuration" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Tailwind CSS v4.0 marks a paradigm shift from JavaScript-based configuration to a &lt;strong&gt;CSS-first architecture&lt;/strong&gt;. The &lt;code&gt;tailwind.config.js&lt;/code&gt; file is gone; design tokens are now defined directly in CSS using &lt;code&gt;@theme&lt;/code&gt;. This release also integrates &lt;strong&gt;Lightning CSS&lt;/strong&gt; for blazing-fast builds, adopts modern CSS 기능 like CSS nesting and &lt;code&gt;@layer&lt;/code&gt;, and ships a completely rewritten engine. This article breaks down the key changes and provides a practical migration 가이드 from v3.&lt;/p&gt;</description></item><item><title>Conventional Commits for Automated Release Workflows</title><link>https://takao.blog/ko/web/git-semantic-commit-messages-standard/</link><pubDate>Sun, 25 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-semantic-commit-messages-standard/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-semantic-commit-messages-standard-ko.png" alt="Featured image of post Conventional Commits for Automated Release Workflows" /&gt;&lt;p&gt;In a collaborative software development team, inconsistencies in commit message structures can make tracking changes difficult. Vague commit messages like &lt;code&gt;fix bug&lt;/code&gt;, &lt;code&gt;update code&lt;/code&gt;, or &lt;code&gt;minor changes&lt;/code&gt; complicate code auditing and delay release documentation.&lt;/p&gt;
&lt;p&gt;To resolve this issue and maintain a clean, machine-readable commit history, developers around the world adopt the &lt;strong&gt;Conventional Commits&lt;/strong&gt; specification.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll explain the structure of Conventional Commits, standard prefix classifications, and how this discipline enables automated release operations.&lt;/p&gt;</description></item><item><title>Robust Frontend Exception Management with Error Boundaries</title><link>https://takao.blog/ko/web/frontend-error-boundaries-logging/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/frontend-error-boundaries-logging/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/frontend-error-boundaries-logging-ko.png" alt="Featured image of post Robust Frontend Exception Management with Error Boundaries" /&gt;&lt;h2 id="why-error-boundaries-matter"&gt;Why Error Boundaries Matter
&lt;/h2&gt;&lt;p&gt;In React applications, a single uncaught JavaScript error in a component can crash the entire UI. Before Error Boundaries, this meant users would see a white 화면 with no indication of what went wrong. Error Boundaries are React components that catch JavaScript errors anywhere in their child component tree and render a fallback UI instead of crashing.&lt;/p&gt;
&lt;h2 id="implementing-an-error-boundary"&gt;Implementing an Error Boundary
&lt;/h2&gt;&lt;p&gt;Error Boundaries are class components that implement one or both of the static lifecycle methods &lt;code&gt;getDerivedStateFromError&lt;/code&gt; and &lt;code&gt;componentDidCatch&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Enforcing HTTPS Connections Securely using HSTS policies</title><link>https://takao.blog/ko/web/web-security-http-strict-transport-hsts-hacks/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/web-security-http-strict-transport-hsts-hacks/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-security-http-strict-transport-hsts-hacks-ko.png" alt="Featured image of post Enforcing HTTPS Connections Securely using HSTS policies" /&gt;&lt;h2 id="the-first-request-problem"&gt;The First-Request Problem
&lt;/h2&gt;&lt;p&gt;HTTPS encrypts traffic after the 연결 is established, but the initial request to an HTTP URL is still sent in cleartext. An attacker on the same 네트워크 can intercept that first request, perform an &lt;strong&gt;SSL stripping&lt;/strong&gt; attack, and downgrade the user to HTTP for the entire session.&lt;/p&gt;
&lt;p&gt;HTTP Strict Transport Security (HSTS) closes this window. Once a browser receives an HSTS header, it &lt;strong&gt;automatically upgrades all future HTTP requests&lt;/strong&gt; to HTTPS and refuses to connect if the certificate is invalid.&lt;/p&gt;</description></item><item><title>Branching in TS Type System: Intro to Conditional Types</title><link>https://takao.blog/ko/web/typescript-conditional-types/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-conditional-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-conditional-types-ko.png" alt="Featured image of post Branching in TS Type System: Intro to Conditional Types" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;TypeScript&amp;rsquo;s type system is &lt;strong&gt;Turing-complete&lt;/strong&gt;, and one of the key 기능 that unlocks its full power is &lt;strong&gt;conditional types&lt;/strong&gt;. Just like ternary operators in JavaScript (&lt;code&gt;condition ? a : b&lt;/code&gt;), conditional types let you create type-level logic: &lt;code&gt;T extends U ? X : Y&lt;/code&gt;. This enables dynamic, context-aware type 해상도.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="basic-syntax"&gt;Basic Syntax
&lt;/h2&gt;&lt;p&gt;A conditional type checks whether a type &lt;strong&gt;extends&lt;/strong&gt; another type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IsString&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;T&lt;/span&gt;&amp;gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;T&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;A&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IsString&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;B&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IsString&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;42&lt;/span&gt;&amp;gt;; &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The condition &lt;code&gt;T extends U&lt;/code&gt; asks: &amp;ldquo;Is &lt;code&gt;T&lt;/code&gt; assignable to &lt;code&gt;U&lt;/code&gt;?&amp;rdquo; If yes, resolve to the true branch; otherwise, the false branch.&lt;/p&gt;</description></item><item><title>React Compiler: Say Goodbye to Manual Memoization</title><link>https://takao.blog/ko/web/react-compiler-automated-memoization/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/react-compiler-automated-memoization/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-compiler-automated-memoization-ko.png" alt="Featured image of post React Compiler: Say Goodbye to Manual Memoization" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For years, React developers have manually optimized re-renders with &lt;code&gt;useMemo&lt;/code&gt;, &lt;code&gt;useCallback&lt;/code&gt;, &lt;code&gt;React.memo&lt;/code&gt;, and various state-management heuristics. The &lt;strong&gt;React Compiler&lt;/strong&gt; (formerly known as React Forget) changes this paradigm entirely. It is a build-time tool that automatically memoizes React components, hooks, and values by analyzing reactive dependencies at compile time, eliminating the need for manual 최적화 hooks.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-problem-with-manual-memoization"&gt;The Problem with Manual Memoization
&lt;/h2&gt;&lt;p&gt;Consider a typical filtered list component:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserList&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;users&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt; }) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;filtered&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useMemo&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; () =&amp;gt; &lt;span style="color:#a6e22e"&gt;users&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;u&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;u&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;includes&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#a6e22e"&gt;users&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handleClick&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useCallback&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Clicked:&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, []);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#a6e22e"&gt;filtered&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt; =&amp;gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;UserRow&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;} &lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;} &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;handleClick&lt;/span&gt;} /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ))}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserRow&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;memo&lt;/span&gt;(({ &lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt; }) =&amp;gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{() =&amp;gt; &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;)}&amp;gt;{&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;}&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works, but it is verbose, error-prone (missing or incorrect dependency arrays), and easy to forget. A missing &lt;code&gt;useMemo&lt;/code&gt; on a large list causes unnecessary re-renders; an incorrect dependency array causes stale closures.&lt;/p&gt;</description></item><item><title>Leveraging WebAssembly in Cloudflare Workers at the Edge</title><link>https://takao.blog/ko/web/cloudflare-workers-wasm-edge-developments/</link><pubDate>Mon, 05 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/cloudflare-workers-wasm-edge-developments/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/cloudflare-workers-wasm-edge-developments-ko.png" alt="Featured image of post Leveraging WebAssembly in Cloudflare Workers at the Edge" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Cloudflare Workers revolutionized serverless computing by bringing code execution to the 네트워크 edge — over 330 locations worldwide. By integrating &lt;strong&gt;WebAssembly (Wasm)&lt;/strong&gt; modules into Workers, you can run computationally intensive tasks (image processing, cryptography, video encoding, scientific calculations) at near-native speeds while maintaining the low-latency benefits of edge distribution. This article explores how to compile languages like Rust and AssemblyScript to Wasm, deploy them on Workers, and the 성능 trade-offs involved.&lt;/p&gt;</description></item><item><title>Cleaning Orphan Remote Branches with git fetch --prune</title><link>https://takao.blog/ko/web/git-prune-clean-remote-branches/</link><pubDate>Thu, 25 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-prune-clean-remote-branches/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-prune-clean-remote-branches-ko.png" alt="Featured image of post Cleaning Orphan Remote Branches with git fetch --prune" /&gt;&lt;p&gt;In modern development workflows using GitHub or GitLab, 기능 branches are typically deleted on the remote host as soon as their corresponding pull request (PR) is merged.&lt;/p&gt;
&lt;p&gt;However, when you run &lt;code&gt;git branch -a&lt;/code&gt; in your local terminal, you will notice that &lt;strong&gt;the references pointing to those deleted remote branches (e.g., &lt;code&gt;remotes/origin/feature-xxx&lt;/code&gt;) remain in your branch list indefinitely.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This occurs because Git does not automatically sync deletions from remote configurations to your local cache by default.&lt;/p&gt;</description></item><item><title>Optimizing Browser Rendering Pipelines (Critical Path)</title><link>https://takao.blog/ko/web/performance-critical-rendering-path-optimizations/</link><pubDate>Sat, 20 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/performance-critical-rendering-path-optimizations/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/performance-critical-rendering-path-optimizations-ko.png" alt="Featured image of post Optimizing Browser Rendering Pipelines (Critical Path)" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;The &lt;strong&gt;Critical Rendering Path (CRP)&lt;/strong&gt; is the sequence of steps the browser performs to convert HTML, CSS, and JavaScript into visible pixels on the 화면. Optimizing this pipeline directly impacts &lt;strong&gt;First Contentful Paint (FCP)&lt;/strong&gt; and &lt;strong&gt;Largest Contentful Paint (LCP)&lt;/strong&gt;. This article breaks down each CRP stage — DOM construction, CSSOM construction, render tree, layout, paint, and composite — and provides actionable 최적화 strategies.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="stage-1-dom-construction"&gt;Stage 1: DOM Construction
&lt;/h2&gt;&lt;p&gt;When the browser receives HTML bytes, it:&lt;/p&gt;</description></item><item><title>How CORS Works and Fixing Access Block Errors</title><link>https://takao.blog/ko/web/web-security-http-headers-cors/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/web-security-http-headers-cors/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-security-http-headers-cors-ko.png" alt="Featured image of post How CORS Works and Fixing Access Block Errors" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;CORS (Cross-Origin Resource Sharing)&lt;/strong&gt; is a browser security mechanism that controls how web pages from one origin can request resources from a different origin. When a frontend at &lt;code&gt;https://app.example.com&lt;/code&gt; tries to fetch data from &lt;code&gt;https://api.example.org&lt;/code&gt;, the browser enforces a &lt;strong&gt;same-origin policy&lt;/strong&gt; by default. CORS provides a controlled way to relax this policy through HTTP headers. This article explains the complete CORS flow, preflight requests, and how to fix common access-block errors.&lt;/p&gt;</description></item><item><title>Preventing Cumulative Layout Shift with CSS aspect-ratio</title><link>https://takao.blog/ko/web/css-aspect-ratio-cumulative-layout-shift/</link><pubDate>Wed, 10 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-aspect-ratio-cumulative-layout-shift/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-aspect-ratio-cumulative-layout-shift-ko.png" alt="Featured image of post Preventing Cumulative Layout Shift with CSS aspect-ratio" /&gt;&lt;h2 id="understanding-cumulative-layout-shift"&gt;Understanding Cumulative Layout Shift
&lt;/h2&gt;&lt;p&gt;Cumulative Layout Shift (CLS) is one of Google&amp;rsquo;s &lt;strong&gt;Core Web Vitals&lt;/strong&gt; metrics that measures visual stability. It quantifies how often users experience unexpected layout shifts. A high CLS score harms user experience and SEO rankings. The primary cause? Media elements (images, videos, iframes) loading without reserved space.&lt;/p&gt;
&lt;h2 id="how-css-aspect-ratio-works"&gt;How CSS aspect-ratio Works
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;aspect-ratio&lt;/code&gt; CSS property lets you declare the ratio of width to height for any element. The browser reserves space accordingly, preventing the layout from jumping when content loads.&lt;/p&gt;</description></item><item><title>Third-Party Cookie Deprecation and Web Privacy APIs</title><link>https://takao.blog/ko/web/cloudflare-privacy-sandbox-thirdparty-cookie-deprecation/</link><pubDate>Fri, 05 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/cloudflare-privacy-sandbox-thirdparty-cookie-deprecation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/cloudflare-privacy-sandbox-thirdparty-cookie-deprecation-ko.png" alt="Featured image of post Third-Party Cookie Deprecation and Web Privacy APIs" /&gt;&lt;h2 id="the-end-of-third-party-cookies"&gt;The End of Third-Party Cookies
&lt;/h2&gt;&lt;p&gt;The third-party cookie era is ending. After years of delays and industry pushback, Chrome has begun phasing out cross-site tracking cookies. This fundamentally changes how web analytics, advertising, and 개인화 function. Understanding the deprecation timeline and replacement APIs is essential for every web developer.&lt;/p&gt;
&lt;h2 id="chrome-phase-out-timeline"&gt;Chrome Phase-Out Timeline
&lt;/h2&gt;&lt;p&gt;Google&amp;rsquo;s Privacy Sandbox initiative has followed this trajectory:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Date&lt;/th&gt;
					&lt;th&gt;Milestone&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;2024 Q1&lt;/td&gt;
					&lt;td&gt;1% Chrome users have 3PC restricted&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2025 Q2&lt;/td&gt;
					&lt;td&gt;Testing phase with expanded cohorts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2025 Q3-Q4&lt;/td&gt;
					&lt;td&gt;Graduated rollout begins&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2026&lt;/td&gt;
					&lt;td&gt;Full deprecation for all Chrome users&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="privacy-sandbox-apis"&gt;Privacy Sandbox APIs
&lt;/h2&gt;&lt;p&gt;The Privacy Sandbox replaces third-party cookies with several purpose-built APIs:&lt;/p&gt;</description></item><item><title>Undoing Merge Commits Safely using git revert -m</title><link>https://takao.blog/ko/web/git-revert-merge-commit-safe/</link><pubDate>Tue, 25 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-revert-merge-commit-safe/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-revert-merge-commit-safe-ko.png" alt="Featured image of post Undoing Merge Commits Safely using git revert -m" /&gt;&lt;p&gt;Directly after merging a 기능 branch into your primary release branch (&lt;code&gt;main&lt;/code&gt;), you might discover a severe bug that requires you to immediately roll back the integration.&lt;/p&gt;
&lt;p&gt;With standard commits, you can easily undo changes using &lt;code&gt;git revert &amp;lt;commit-hash&amp;gt;&lt;/code&gt;. However, attempting to revert a merge commit directly results in a Git error: &lt;code&gt;fatal: commit &amp;lt;hash&amp;gt; is a merge but no -m option was given.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In this 가이드, we&amp;rsquo;ll explain why merge reverts require special handling, walk through using the &lt;code&gt;git revert -m&lt;/code&gt; option, and reveal the hidden trap of re-merging reverted 기능 later.&lt;/p&gt;</description></item><item><title>Accelerating GitHub Actions Workflows via actions/cache</title><link>https://takao.blog/ko/web/github-actions-caching-setup/</link><pubDate>Thu, 20 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/github-actions-caching-setup/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/github-actions-caching-setup-ko.png" alt="Featured image of post Accelerating GitHub Actions Workflows via actions/cache" /&gt;&lt;p&gt;Automated CI/CD pipelines (like GitHub Actions) are a cornerstone of modern software quality control. However, if your workflows fetch external packages, boot container environments, and rebuild entire applications from scratch on every pull request, execution times can quickly balloon to several minutes.&lt;/p&gt;
&lt;p&gt;Long feedback loops slow developer productivity and lead to higher billing costs.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll demonstrate how to utilize GitHub&amp;rsquo;s official caching mechanisms to speed up your workflows from minutes to seconds.&lt;/p&gt;</description></item><item><title>Auditing NPM Dependencies: Snyk and automated patch management</title><link>https://takao.blog/ko/web/security-dependency-vulnerabilities-npm-audit/</link><pubDate>Sat, 15 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/security-dependency-vulnerabilities-npm-audit/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-dependency-vulnerabilities-npm-audit-ko.png" alt="Featured image of post Auditing NPM Dependencies: Snyk and automated patch management" /&gt;&lt;h2 id="the-supply-chain-problem"&gt;The Supply Chain Problem
&lt;/h2&gt;&lt;p&gt;Modern JavaScript applications ship tens of thousands of transitive dependencies. Each one is a potential attack vector. The &lt;strong&gt;event-stream&lt;/strong&gt; incident (2018), where a malicious package was injected into a popular dependency, demonstrated that vulnerabilities can come from anywhere in the tree. Relying solely on manual review is impossible at this scale.&lt;/p&gt;
&lt;p&gt;Automated tooling is the only practical defense.&lt;/p&gt;
&lt;h2 id="npm-audit"&gt;npm audit
&lt;/h2&gt;&lt;p&gt;The built-in &lt;code&gt;npm audit&lt;/code&gt; command compares your dependency tree against a curated database of known vulnerabilities.&lt;/p&gt;</description></item><item><title>Transforming Types dynamically using Mapped Types</title><link>https://takao.blog/ko/web/typescript-mapped-types/</link><pubDate>Mon, 10 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-mapped-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-mapped-types-ko.png" alt="Featured image of post Transforming Types dynamically using Mapped Types" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Mapped types&lt;/strong&gt; let you transform an existing object type by iterating over its keys. Think of them as &lt;code&gt;Array.prototype.map()&lt;/code&gt; but at the &lt;strong&gt;type level&lt;/strong&gt;. The syntax &lt;code&gt;{ [K in keyof T]: T[K] }&lt;/code&gt; creates a new type by applying a transformation to each property of &lt;code&gt;T&lt;/code&gt;. This is how many of TypeScript&amp;rsquo;s built-in utility types work under the hood.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="basic-mapped-type"&gt;Basic Mapped Type
&lt;/h2&gt;&lt;p&gt;The simplest mapped type creates a clone of an existing type:&lt;/p&gt;</description></item><item><title>Node.js Stable Support for Requiring ESM Modules</title><link>https://takao.blog/ko/web/node-esm-require-support-stable/</link><pubDate>Wed, 05 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/node-esm-require-support-stable/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/node-esm-require-support-stable-ko.png" alt="Featured image of post Node.js Stable Support for Requiring ESM Modules" /&gt;&lt;h2 id="nodejs-stable-support-for-requiring-esm-modules"&gt;Node.js Stable Support for Requiring ESM Modules
&lt;/h2&gt;&lt;p&gt;For years, Node.js developers faced a painful divide: &lt;strong&gt;CommonJS&lt;/strong&gt; (CJS) and &lt;strong&gt;ES Modules&lt;/strong&gt; (ESM) coexisted with limited interoperability. CJS code could &lt;code&gt;import()&lt;/code&gt; ESM modules asynchronously, but &lt;code&gt;require()&lt;/code&gt; — the synchronous loading mechanism at the heart of CJS — could not load ESM at all. This forced codebase migrations to be all-or-nothing affairs.&lt;/p&gt;
&lt;p&gt;That changed with Node.js 22 and 23, which stabilized the &lt;code&gt;--experimental-require-module&lt;/code&gt; flag. As of Node 23, synchronous &lt;code&gt;require()&lt;/code&gt; can load ES modules, provided the ESM graph does not use top-level await.&lt;/p&gt;</description></item><item><title>Finding Regression Commits Quickly using git bisect</title><link>https://takao.blog/ko/web/git-bisect-debug-regression/</link><pubDate>Mon, 20 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-bisect-debug-regression/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-bisect-debug-regression-ko.png" alt="Featured image of post Finding Regression Commits Quickly using git bisect" /&gt;&lt;p&gt;&amp;ldquo;It worked yesterday, but it is broken today.&amp;rdquo; In any active software project, regression bugs are bound to slip in. Finding the exact commit that introduced a bug out of hundreds or thousands of commits can feel like searching for a needle in a haystack.&lt;/p&gt;
&lt;p&gt;Instead of manually checking out commits one by one or spending hours analyzing code changes, you can use Git&amp;rsquo;s built-in debugging tool: &lt;strong&gt;&lt;code&gt;git bisect&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll explain how to use the binary search algorithm of &lt;code&gt;git bisect&lt;/code&gt; to locate the origin of a bug in minutes.&lt;/p&gt;</description></item><item><title>Unlocking JavaScript RegExp Power with the v Flag</title><link>https://takao.blog/ko/web/js-regex-v-flag/</link><pubDate>Wed, 15 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/js-regex-v-flag/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-regex-v-flag-ko.png" alt="Featured image of post Unlocking JavaScript RegExp Power with the v Flag" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Regular expressions in JavaScript have evolved significantly. ES2024 introduces the &lt;strong&gt;&lt;code&gt;v&lt;/code&gt; flag&lt;/strong&gt; — a superset of the &lt;code&gt;u&lt;/code&gt; flag that unlocks powerful set notation, character class subtraction, intersection, and proper Unicode emoji matching. If you&amp;rsquo;ve struggled with complex character class logic or emoji regex patterns, the &lt;code&gt;v&lt;/code&gt; flag is a game-changer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="what-is-the-v-flag"&gt;What Is the v Flag?
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;v&lt;/code&gt; flag replaces and extends the &lt;code&gt;u&lt;/code&gt; (unicode) flag. Enable it by appending &lt;code&gt;v&lt;/code&gt; to your regex:&lt;/p&gt;</description></item><item><title>Implementing Simple Dark Mode with CSS light-dark()</title><link>https://takao.blog/ko/web/css-light-dark-color-scheme/</link><pubDate>Fri, 10 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-light-dark-color-scheme/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-light-dark-color-scheme-ko.png" alt="Featured image of post Implementing Simple Dark Mode with CSS light-dark()" /&gt;&lt;h2 id="the-problem-with-traditional-dark-mode"&gt;The Problem with Traditional Dark Mode
&lt;/h2&gt;&lt;p&gt;Implementing dark mode traditionally required duplicate CSS rules wrapped in &lt;code&gt;@media (prefers-color-scheme: dark)&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --bg: &lt;span style="color:#ae81ff"&gt;#ffffff&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --text: &lt;span style="color:#ae81ff"&gt;#111111&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#66d9ef"&gt;media&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;prefers-color-scheme&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;dark&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --bg: &lt;span style="color:#ae81ff"&gt;#1a1a2e&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --text: &lt;span style="color:#ae81ff"&gt;#e0e0e0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works but creates maintenance overhead, especially when managing multiple color properties across large stylesheets. The &lt;code&gt;light-dark()&lt;/code&gt; CSS function eliminates this duplication entirely.&lt;/p&gt;
&lt;h2 id="the-light-dark-function"&gt;The light-dark() Function
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;light-dark()&lt;/code&gt; function accepts two color values and automatically returns the one matching the user&amp;rsquo;s current color scheme:&lt;/p&gt;</description></item><item><title>Next.js 15 Stable Release: Best Practices in Production</title><link>https://takao.blog/ko/web/nextjs-15-stable-features-overview/</link><pubDate>Sun, 05 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/nextjs-15-stable-features-overview/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-15-stable-features-overview-ko.png" alt="Featured image of post Next.js 15 Stable Release: Best Practices in Production" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Next.js 15 ships as a stable release with &lt;strong&gt;React 19 support&lt;/strong&gt;, a redesigned caching model, and major API improvements for async request handling. This 버전 defaults to &lt;strong&gt;no caching&lt;/strong&gt; for fetch requests and GET Route handlers, simplifying behavior predictability. It also introduces &lt;code&gt;async&lt;/code&gt; variants for &lt;code&gt;cookies()&lt;/code&gt;, &lt;code&gt;headers()&lt;/code&gt;, and &lt;code&gt;params()&lt;/code&gt;, aligning with React 19&amp;rsquo;s async rendering paradigm. This article covers every breaking change and best practice for production adoption.&lt;/p&gt;</description></item><item><title>Signing Git Commits with GPG or SSH and Verified Badges</title><link>https://takao.blog/ko/web/git-commit-signing-gpg/</link><pubDate>Thu, 25 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-commit-signing-gpg/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-commit-signing-gpg-ko.png" alt="Featured image of post Signing Git Commits with GPG or SSH and Verified Badges" /&gt;&lt;p&gt;When reviewing commit logs on GitHub, you&amp;rsquo;ve likely noticed a green &amp;ldquo;&lt;strong&gt;Verified&lt;/strong&gt;&amp;rdquo; badge next to some commits. This label indicates that the commit has been cryptographically signed and confirmed to originate from a legitimate, validated user.&lt;/p&gt;
&lt;p&gt;By default, Git allows developers to configure any name and email address they choose using simple commands like &lt;code&gt;git config user.email&lt;/code&gt;. This means impersonation is trivial. To guarantee identity 인증 and protect against unauthorized contributions, &lt;strong&gt;commit signing&lt;/strong&gt; is highly recommended.&lt;/p&gt;</description></item><item><title>Maximizing Docker Build Cache for Faster Deployment Pipelines</title><link>https://takao.blog/ko/web/docker-build-caches-speedup/</link><pubDate>Sat, 20 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/docker-build-caches-speedup/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-build-caches-speedup-ko.png" alt="Featured image of post Maximizing Docker Build Cache for Faster Deployment Pipelines" /&gt;&lt;p&gt;Whether you are trying to speed up local iterative container runs or aiming to shave minutes off your CI/CD pipelines, optimizing your &lt;strong&gt;Docker image build speeds&lt;/strong&gt; is a crucial aspect of engineering productivity. Long build wait times disrupt developer focus and drive up 클라우드 컴퓨팅 costs.&lt;/p&gt;
&lt;p&gt;One of the most powerful and easiest ways to optimize build speeds is by configuring Docker files to maximize the use of the &lt;strong&gt;Docker Build Cache&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Accessibility Essentials: When and How to Write WAI-ARIA</title><link>https://takao.blog/ko/web/web-accessibility-aria-basics/</link><pubDate>Mon, 15 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/web-accessibility-aria-basics/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-accessibility-aria-basics-ko.png" alt="Featured image of post Accessibility Essentials: When and How to Write WAI-ARIA" /&gt;&lt;p&gt;In modern web development, digital 접근성 (commonly abbreviated as A11y) is no longer a luxury or an afterthought—it is a core quality standard. Creating interfaces that everyone can navigate, regardless of physical or cognitive ability, begins with semantic HTML.&lt;/p&gt;
&lt;p&gt;However, when building complex, custom UI components like accordions, modal dialogs, and tab panels, standard native HTML elements sometimes fall short in describing their role or state to assistive technologies. That is where &lt;strong&gt;WAI-ARIA (Web 접근성 Initiative - Accessible Rich Internet Applications)&lt;/strong&gt; comes into play.&lt;/p&gt;</description></item><item><title>Type-Safe State Transitions using Discriminated Unions</title><link>https://takao.blog/ko/web/typescript-discriminated-unions/</link><pubDate>Wed, 10 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-discriminated-unions/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-discriminated-unions-ko.png" alt="Featured image of post Type-Safe State Transitions using Discriminated Unions" /&gt;&lt;p&gt;In modern frontend and backend development with TypeScript, ensuring type safety during state transitions is a crucial element in building robust and crash-free applications. When handling asynchronous API communications (such as transitioning between loading, success, and error states) or complex user interactions, ambiguous type definitions can easily lead to unexpected runtime errors.&lt;/p&gt;
&lt;p&gt;In this article, we will explore how to harness the power of &lt;strong&gt;Discriminated Unions&lt;/strong&gt; (also known as Tagged Unions) in TypeScript to manage state safely, elegantly, and with minimum boilerplate.&lt;/p&gt;</description></item><item><title>How GitHub Copilot Workspace Alters Development Workflows</title><link>https://takao.blog/ko/web/github-copilot-workspace-developer-agent/</link><pubDate>Fri, 05 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/github-copilot-workspace-developer-agent/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/github-copilot-workspace-developer-agent-ko.png" alt="Featured image of post How GitHub Copilot Workspace Alters Development Workflows" /&gt;&lt;h2 id="beyond-autocomplete"&gt;Beyond Autocomplete
&lt;/h2&gt;&lt;p&gt;GitHub Copilot Chat and inline completions help developers write code faster, but they operate at the micro level—a function here, a comment there. &lt;strong&gt;GitHub Copilot Workspace&lt;/strong&gt; shifts the paradigm to the macro level: it takes a GitHub issue (a bug report, 기능 request, or task) and produces a complete pull request with multi-file changes, tests, and documentation.&lt;/p&gt;
&lt;p&gt;This is not an autocomplete tool. It is an &lt;strong&gt;AI-powered developer agent&lt;/strong&gt; that understands the full repository context and translates natural language specifications into executable code.&lt;/p&gt;</description></item><item><title>Mitigating CSRF: SameSite Cookie Attributes and CSRF Tokens</title><link>https://takao.blog/ko/web/security-csrf-tokens-samesite-cookies/</link><pubDate>Mon, 25 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/security-csrf-tokens-samesite-cookies/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-csrf-tokens-samesite-cookies-ko.png" alt="Featured image of post Mitigating CSRF: SameSite Cookie Attributes and CSRF Tokens" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Cookies are a convenient mechanism for managing user 인증 state. When a session ID is stored in a cookie, the browser automatically attaches it to outgoing HTTP requests targeting the domain.&lt;/p&gt;
&lt;p&gt;However, this automatic attachment 기능 is exploited by &lt;strong&gt;Cross-Site Request Forgery (CSRF)&lt;/strong&gt; attacks.&lt;/p&gt;
&lt;p&gt;Although modern browsers default to safer cookie behaviors (such as applying &lt;code&gt;SameSite=Lax&lt;/code&gt; automatically), developers must understand CSRF defense patterns to prevent serious 인증 vulnerabilities. This article reviews SameSite cookie attributes and CSRF token verification patterns.&lt;/p&gt;</description></item><item><title>Advanced git stash: Saving Untracked and Restoring Partially</title><link>https://takao.blog/ko/web/git-stash-advanced-techniques/</link><pubDate>Wed, 20 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-stash-advanced-techniques/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-stash-advanced-techniques-ko.png" alt="Featured image of post Advanced git stash: Saving Untracked and Restoring Partially" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In team development, you often need to switch branches to address an urgent bug fix while in the middle of writing code for a 기능 branch.&lt;/p&gt;
&lt;p&gt;While you can commit your half-finished work as a temporary &amp;ldquo;WIP&amp;rdquo; commit, a cleaner approach is to use &lt;strong&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This article covers advanced &lt;code&gt;git stash&lt;/code&gt; techniques, including saving untracked files, labeling stash items, and restoring specific files from a stash.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-the-basics-of-git-stash"&gt;1. The Basics of Git stash
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s review the most common commands:&lt;/p&gt;</description></item><item><title>Standard Syntax of CSS Nesting without Preprocessors</title><link>https://takao.blog/ko/web/css-nesting-standard-syntax/</link><pubDate>Fri, 15 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-nesting-standard-syntax/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-nesting-standard-syntax-ko.png" alt="Featured image of post Standard Syntax of CSS Nesting without Preprocessors" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Historically, writing nested CSS rules required preprocessing tools like Sass (SCSS), Less, or PostCSS.&lt;/p&gt;
&lt;p&gt;However, browser vendors have standardized the &lt;strong&gt;CSS Nesting specification&lt;/strong&gt;. Today, you can write nested selectors directly in plain CSS files and run them natively in all modern web browsers.&lt;/p&gt;
&lt;p&gt;This article reviews the standard syntax of native CSS nesting and explains how its behavior differs from Sass compilations.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-the-basics-of-native-css-nesting"&gt;1. The Basics of Native CSS Nesting
&lt;/h2&gt;&lt;p&gt;Standard CSS Nesting looks very similar to the nested structures used in Sass.&lt;/p&gt;</description></item><item><title>Designing Clean React Custom Hooks for Reusability</title><link>https://takao.blog/ko/web/react-custom-hooks-rules/</link><pubDate>Sun, 10 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/react-custom-hooks-rules/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-custom-hooks-rules-ko.png" alt="Featured image of post Designing Clean React Custom Hooks for Reusability" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;As you develop React components, you may find that files grow to hundreds of lines. This happens when &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useEffect&lt;/code&gt;, API queries, and validation logic mix with rendering markup, making the component hard to read and maintain.&lt;/p&gt;
&lt;p&gt;This mixing of concerns makes writing unit tests difficult and increases the risk of copy-paste bugs when reusing logic across different views.&lt;/p&gt;
&lt;p&gt;The best way to separate UI (presentation) from business logic (behavior) in React is to create &lt;strong&gt;Custom Hooks&lt;/strong&gt;. This 가이드 outlines the core design guidelines for building reusable custom hooks.&lt;/p&gt;</description></item><item><title>Current Trends: Vite 6 and Rust-based Bundler Rspack</title><link>https://takao.blog/ko/web/vite-6-rspack-bundler-speeds/</link><pubDate>Tue, 05 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/vite-6-rspack-bundler-speeds/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vite-6-rspack-bundler-speeds-ko.png" alt="Featured image of post Current Trends: Vite 6 and Rust-based Bundler Rspack" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In frontend development, the speed of your development 서버 startup and your production compilation cycles directly impact developer experience (DX).&lt;/p&gt;
&lt;p&gt;In recent years, the 커뮤니티 has migrated away from standard Webpack configs toward native, Go-based (ESBuild) and Rust-based (SWC) build helpers.&lt;/p&gt;
&lt;p&gt;This trend has accelerated with the stable release of &lt;strong&gt;Vite 6&lt;/strong&gt; and the rise of &lt;strong&gt;Rspack&lt;/strong&gt;—a Webpack-compatible bundler written in Rust. This article reviews these two technologies and discusses how to select the right tool for your codebase.&lt;/p&gt;</description></item><item><title>ESM vs CommonJS Interop Challenges in Node.js</title><link>https://takao.blog/ko/web/node-esm-cjs-interoperability/</link><pubDate>Fri, 25 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/node-esm-cjs-interoperability/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/node-esm-cjs-interoperability-ko.png" alt="Featured image of post ESM vs CommonJS Interop Challenges in Node.js" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Node.js has supported ECMAScript Modules (ESM) since v12, but the ecosystem remains deeply rooted in CommonJS (CJS). Mixing the two module systems in a single project — or consuming CJS packages from ESM code — introduces subtle pitfalls around exports, default imports, and globals. This article maps the interop boundary and provides concrete strategies for a smooth migration.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cjs-vs-esm-at-a-glance"&gt;CJS vs ESM at a Glance
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Aspect&lt;/th&gt;
					&lt;th&gt;CommonJS&lt;/th&gt;
					&lt;th&gt;ESM&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;File extensions&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.cjs&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.mjs&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Default in &lt;code&gt;package.json&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;commonjs&amp;quot;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;module&amp;quot;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Loading&lt;/td&gt;
					&lt;td&gt;Synchronous (&lt;code&gt;require()&lt;/code&gt;)&lt;/td&gt;
					&lt;td&gt;Asynchronous (&lt;code&gt;import&lt;/code&gt;)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Top-level &lt;code&gt;this&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;module.exports&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;__dirname&lt;/code&gt; / &lt;code&gt;__filename&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Available&lt;/td&gt;
					&lt;td&gt;Not available&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Live bindings&lt;/td&gt;
					&lt;td&gt;Copy exports&lt;/td&gt;
					&lt;td&gt;Live bindings&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="configuring-the-module-system"&gt;Configuring the Module System
&lt;/h2&gt;&lt;p&gt;You control the module system via the &lt;code&gt;package.json&lt;/code&gt; &lt;code&gt;&amp;quot;type&amp;quot;&lt;/code&gt; field:&lt;/p&gt;</description></item><item><title>Executing Non-Blocking Scripts with requestIdleCallback</title><link>https://takao.blog/ko/web/web-performance-requestidlecallback-optimizations/</link><pubDate>Fri, 25 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/web-performance-requestidlecallback-optimizations/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-performance-requestidlecallback-optimizations-ko.png" alt="Featured image of post Executing Non-Blocking Scripts with requestIdleCallback" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;When building complex web applications, maintaining smooth animations and 반응형 user inputs (ideally matching 60+ fps frame rates) is essential for a good user experience.&lt;/p&gt;
&lt;p&gt;However, modern applications often require executing low-priority background operations—such as sending analytics data, syncing caches, parsing telemetry logs, or pre-fetching assets.&lt;/p&gt;
&lt;p&gt;Executing these non-urgent tasks as standard async promises or immediate timers can block the main thread mid-frame, causing 인터페이스 jank or increasing your Interaction to Next Paint (INP) score.&lt;/p&gt;</description></item><item><title>Boosting Initial Page Speeds with Lazy-Loaded Frames and Images</title><link>https://takao.blog/ko/web/web-performance-lazyloading-iframe/</link><pubDate>Sun, 20 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/web-performance-lazyloading-iframe/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-performance-lazyloading-iframe-ko.png" alt="Featured image of post Boosting Initial Page Speeds with Lazy-Loaded Frames and Images" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;An effective but frequently overlooked strategy for optimizing web page speeds is &lt;strong&gt;deferring off-화면 asset loading&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;By default, when a user loads a web page, the browser immediately requests all images and &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; elements (like YouTube embeds, interactive maps, social widgets, or advertising scripts) on the page, even if they are located far below the fold. This concurrent downloading blocks the main thread and slows down your page&amp;rsquo;s First Contentful Paint (FCP) time.&lt;/p&gt;</description></item><item><title>Ignoring Formatting Commits in git blame with .git-blame-ignore-revs</title><link>https://takao.blog/ko/web/git-blame-ignore-revs/</link><pubDate>Sun, 20 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-blame-ignore-revs/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-blame-ignore-revs-ko.png" alt="Featured image of post Ignoring Formatting Commits in git blame with .git-blame-ignore-revs" /&gt;&lt;p&gt;When auditing a codebase to find out when and why a line of code was introduced, &lt;code&gt;git blame&lt;/code&gt; is a developer&amp;rsquo;s best friend. However, large styling updates, code formatter adoptions (like Prettier), or global linter autofixes can clutter this history. A single bulk reformatting commit can rewrite code authorship labels for the entire repository, hiding the original developers and commits that introduced the actual business logic.&lt;/p&gt;
&lt;p&gt;To solve this problem, Git (since 버전 2.23) introduced a native 기능 that allows developers to ignore specific commits during blame evaluations: the &lt;strong&gt;&lt;code&gt;.git-blame-ignore-revs&lt;/code&gt;&lt;/strong&gt; file.&lt;/p&gt;</description></item><item><title>Optimizing Images: WebP vs. AVIF and Responsive Sizes</title><link>https://takao.blog/ko/web/web-performance-image-optimizations/</link><pubDate>Tue, 15 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/web-performance-image-optimizations/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-performance-image-optimizations-ko.png" alt="Featured image of post Optimizing Images: WebP vs. AVIF and Responsive Sizes" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Optimizing image assets is one of the most effective ways to improve web 성능 metrics like Lighthouse scores and LCP (Largest Contentful Paint).&lt;/p&gt;
&lt;p&gt;In many web applications, images make up more than half of the total payload size. Slow image loading times directly degrade user experience.&lt;/p&gt;
&lt;p&gt;Replacing legacy formats like JPEG and PNG with next-generation formats like &lt;strong&gt;WebP&lt;/strong&gt; and &lt;strong&gt;AVIF&lt;/strong&gt; has become standard practice in modern web development. This article compares these two formats and explains how to configure 반응형, optimized image delivery.&lt;/p&gt;</description></item><item><title>Designing Modular layouts with CSS Container Queries</title><link>https://takao.blog/ko/web/css-container-queries-vs-media-queries/</link><pubDate>Thu, 10 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-container-queries-vs-media-queries/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-container-queries-vs-media-queries-ko.png" alt="Featured image of post Designing Modular layouts with CSS Container Queries" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For years, &lt;strong&gt;Media Queries (&lt;code&gt;@media&lt;/code&gt;)&lt;/strong&gt; have been the foundation of 반응형 web design.&lt;/p&gt;
&lt;p&gt;Media queries trigger layout changes based on the viewport width of the browser window. However, in modern component-driven development (using React, Vue, or Web Components), styling components based on the viewport has notable limitations.&lt;/p&gt;
&lt;p&gt;For example, if you want to reuse a card component in both a wide main column and a narrow sidebar, media queries cannot detect the space available to the component, causing the layout to break.&lt;/p&gt;</description></item><item><title>How to Use Standard Decorators in TypeScript</title><link>https://takao.blog/ko/web/typescript-5-decorations-adoption/</link><pubDate>Sat, 05 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-5-decorations-adoption/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-5-decorations-adoption-ko.png" alt="Featured image of post How to Use Standard Decorators in TypeScript" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In TypeScript, &lt;strong&gt;decorators&lt;/strong&gt; have long been a key 기능, popularized by major frameworks like Angular, NestJS, and TypeORM to manage metadata and dependency injection.&lt;/p&gt;
&lt;p&gt;However, for years, decorators remained an experimental 기능 (requiring the &lt;code&gt;experimentalDecorators&lt;/code&gt; flag), relying on a legacy proposal that differed from the evolving ECMAScript (JavaScript) standard.&lt;/p&gt;
&lt;p&gt;With the release of TypeScript 5.0, &lt;strong&gt;official support for the standard ECMAScript Decorators (Stage 3/4)&lt;/strong&gt; was introduced. This brings improved type safety and runtime consistency to the decorator syntax. This article explains how to write standard decorators in modern TypeScript.&lt;/p&gt;</description></item><item><title>Essential Linux Commands and Pipes for Web Developers</title><link>https://takao.blog/ko/web/linux-shell-commands-for-webdevelopers/</link><pubDate>Wed, 25 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/linux-shell-commands-for-webdevelopers/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/linux-shell-commands-for-webdevelopers-ko.png" alt="Featured image of post Essential Linux Commands and Pipes for Web Developers" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Whether you work on the frontend or backend, shell command proficiency is an important skill for web developers.&lt;/p&gt;
&lt;p&gt;Command-line tasks arise constantly: sshing into AWS/VPS instances, debugging inside Docker containers, or writing automated CI/CD pipeline shell scripts (such as GitHub Actions).&lt;/p&gt;
&lt;p&gt;This article covers essential Linux commands and explains how to chain them together using &lt;strong&gt;pipelines (&lt;code&gt;|&lt;/code&gt;)&lt;/strong&gt; to troubleshoot 서버 issues and parse log files.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-searching-files-and-parsing-logs"&gt;1. Searching Files and Parsing Logs
&lt;/h2&gt;&lt;p&gt;When a 서버 crashes or behaves erratically, you must be able to search through massive text files quickly to locate the error.&lt;/p&gt;</description></item><item><title>Stop Overusing useMemo and useCallback in React</title><link>https://takao.blog/ko/web/react-hooks-usememo-usecallback/</link><pubDate>Fri, 20 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/react-hooks-usememo-usecallback/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-hooks-usememo-usecallback-ko.png" alt="Featured image of post Stop Overusing useMemo and useCallback in React" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;When optimizing React application 성능, developers often reach for &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;useCallback&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It is tempting to wrap every object and function in these hooks, assuming that caching outputs will automatically speed up the application. However, this is a common misconception.&lt;/p&gt;
&lt;p&gt;Unnecessary memoization does not just make code harder to read; it adds &lt;strong&gt;성능 overhead from shallow dependency comparisons and garbage collection memory allocations&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This article outlines the specific scenarios where these hooks are beneficial and when they should be avoided.&lt;/p&gt;</description></item><item><title>Why and How to Adopt 'strict-dynamic' in CSP</title><link>https://takao.blog/ko/web/security-csp-strict-dynamic-implementation/</link><pubDate>Sun, 15 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/security-csp-strict-dynamic-implementation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-csp-strict-dynamic-implementation-ko.png" alt="Featured image of post Why and How to Adopt 'strict-dynamic' in CSP" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Implementing a &lt;strong&gt;Content Security Policy (CSP)&lt;/strong&gt; is a highly effective way to mitigate Cross-Site Scripting (XSS) risks. However, configuring and maintaining the policy can become a major headache.&lt;/p&gt;
&lt;p&gt;For websites utilizing third-party SDKs (such as Google Tag Manager, analytics beacons, payment widgets, or social sharing buttons), these scripts often dynamically load (inject) additional scripts from nested domains. This forces developers to maintain a long, fragile whitelist of external domains in the &lt;code&gt;script-src&lt;/code&gt; directive.&lt;/p&gt;</description></item><item><title>Creating Powerful String Types with TS Template Literals</title><link>https://takao.blog/ko/web/typescript-template-literal-types/</link><pubDate>Tue, 10 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-template-literal-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-template-literal-types-ko.png" alt="Featured image of post Creating Powerful String Types with TS Template Literals" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;TypeScript offers an advanced type system that allows developers to model complex runtime constraints at compile time.&lt;/p&gt;
&lt;p&gt;Among these 기능, &lt;strong&gt;Template Literal Types&lt;/strong&gt; (introduced in TypeScript 4.1) allow you to define structured string constraints by combining string literals.&lt;/p&gt;
&lt;p&gt;By applying JavaScript&amp;rsquo;s template literal syntax (&lt;code&gt;`hello ${name}`&lt;/code&gt;) to type space, you can enforce safe CSS class name patterns, automate API route mappings, and construct typed design systems. This 가이드 reviews the core patterns of Template Literal Types.&lt;/p&gt;</description></item><item><title>WWDC 25: Safari 19 and Web Platform Advancements</title><link>https://takao.blog/ko/web/apple-wwdc-2025-safari-updates/</link><pubDate>Thu, 05 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/apple-wwdc-2025-safari-updates/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/apple-wwdc-2025-safari-updates-ko.png" alt="Featured image of post WWDC 25: Safari 19 and Web Platform Advancements" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;At Apple&amp;rsquo;s annual developer conference &lt;strong&gt;WWDC 2025&lt;/strong&gt;, major updates were announced for iOS 19 and macOS, along with the release of &lt;strong&gt;Safari 19&lt;/strong&gt; powered by the WebKit rendering engine.&lt;/p&gt;
&lt;p&gt;In recent years, the WebKit team has accelerated its adoption of web standards to improve layout compatibility across browser engines (Blink and Gecko).&lt;/p&gt;
&lt;p&gt;This article highlights key Safari 19 announcements from WWDC 2025, focusing on WebGPU integration, browser fingerprinting shields, and newly supported CSS properties.&lt;/p&gt;</description></item><item><title>Intro to DB Indexing: Resolving Query Latencies</title><link>https://takao.blog/ko/web/backend-database-indexing-basics/</link><pubDate>Sun, 25 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/backend-database-indexing-basics/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/backend-database-indexing-basics-ko.png" alt="Featured image of post Intro to DB Indexing: Resolving Query Latencies" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;As web applications scale and data volumes grow, backend systems often face database bottleneck issues like query latencies.&lt;/p&gt;
&lt;p&gt;Running join (&lt;code&gt;JOIN&lt;/code&gt;) operations or complex search queries on tables with hundreds of thousands of records without proper index optimizations can cause database CPU spikes, leading to slow response times for end users.&lt;/p&gt;
&lt;p&gt;Designing database indices is a powerful way to address these 성능 bottlenecks. This article explains how database indices work, details B-Tree structures, and shares guidelines for designing effective indices.&lt;/p&gt;</description></item><item><title>Using git worktree for Concurrent Branch Development</title><link>https://takao.blog/ko/web/git-worktree-multi-branches/</link><pubDate>Tue, 20 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-worktree-multi-branches/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-worktree-multi-branches-ko.png" alt="Featured image of post Using git worktree for Concurrent Branch Development" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In daily software development, it is common to get interrupted by an urgent hotfix request while in the middle of writing code for a 기능 branch.&lt;/p&gt;
&lt;p&gt;Traditionally, developers handle this in one of two ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Temporarily shelf active changes using &lt;code&gt;git stash&lt;/code&gt;, switch branches to fix the bug, commit, switch back, and run &lt;code&gt;git stash pop&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone a completely separate copy of the repository into another directory to work on the hotfix.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;However, stash runs the risk of conflict errors on restore, and cloning multiple copies of the same repository wastes disk space and complicates local commit synchronization.&lt;/p&gt;</description></item><item><title>Exciting Features in ECMAScript 2025 (ES16)</title><link>https://takao.blog/ko/web/js-es2025-new-features/</link><pubDate>Thu, 15 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/js-es2025-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-es2025-new-features-ko.png" alt="Featured image of post Exciting Features in ECMAScript 2025 (ES16)" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Each year, the TC39 committee updates the ECMAScript specifications, introducing new language 기능 and APIs to the JavaScript ecosystem.&lt;/p&gt;
&lt;p&gt;For the upcoming &lt;strong&gt;ECMAScript 2025 (ES16)&lt;/strong&gt; standard, several proposals have reached Stage 3 or Stage 4, indicating they are in the final stages of browser implementation and adoption.&lt;/p&gt;
&lt;p&gt;This article highlights some of the new 기능 coming in ES2025, detailing how they simplify coding patterns.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-promisetry-unifying-synchronous-and-asynchronous-error-handling"&gt;1. Promise.try: Unifying Synchronous and Asynchronous Error Handling
&lt;/h2&gt;&lt;p&gt;A common challenge in JavaScript development is handling both synchronous exceptions and asynchronous Promise rejections in a clean, unified way.&lt;/p&gt;</description></item><item><title>Perfect Alignment with CSS Grid Subgrid</title><link>https://takao.blog/ko/web/css-subgrid-grid-nesting/</link><pubDate>Sat, 10 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-subgrid-grid-nesting/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-subgrid-grid-nesting-ko.png" alt="Featured image of post Perfect Alignment with CSS Grid Subgrid" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Aligning nested components across columns in card layouts is a common layout challenge in 반응형 web design.&lt;/p&gt;
&lt;p&gt;While CSS Grid and Flexbox make it easy to equalise the height of sibling card containers, aligning the internal elements (such as headers, body copy, and CTA buttons) remains difficult. If one card has a multi-line title and another has a single line, the following elements will misalign, resulting in an inconsistent UI.&lt;/p&gt;</description></item><item><title>Google I/O 2025: Integrating Web Technologies and AI</title><link>https://takao.blog/ko/web/google-io-2025-web-updates/</link><pubDate>Mon, 05 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/google-io-2025-web-updates/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/google-io-2025-web-updates-ko.png" alt="Featured image of post Google I/O 2025: Integrating Web Technologies and AI" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;At Google&amp;rsquo;s annual developer conference, &lt;strong&gt;Google I/O 2025&lt;/strong&gt;, major announcements highlighted the convergence of artificial intelligence and the web platform.&lt;/p&gt;
&lt;p&gt;For web developers, the focus has expanded beyond cloud-hosted model endpoints. The industry is seeing a shift toward &lt;strong&gt;on-device AI execution&lt;/strong&gt;, allowing developers to run lightweight LLMs directly inside the client browser.&lt;/p&gt;
&lt;p&gt;This article reviews the key web-focused AI announcements from Google I/O 2025 and explains how they will influence frontend application architecture.&lt;/p&gt;</description></item><item><title>Best Practices for Designing REST API Endpoints</title><link>https://takao.blog/ko/web/web-api-design-rest-best-practices/</link><pubDate>Fri, 25 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/web-api-design-rest-best-practices/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-api-design-rest-best-practices-ko.png" alt="Featured image of post Best Practices for Designing REST API Endpoints" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In modern web development, &lt;strong&gt;API consistency&lt;/strong&gt; plays a critical role in developer productivity.&lt;/p&gt;
&lt;p&gt;Inconsistent endpoints (URLs), improper HTTP methods, and wrapping all errors in &lt;code&gt;200 OK&lt;/code&gt; status codes lead to confusion, bugs, and wasted development cycles.&lt;/p&gt;
&lt;p&gt;This article reviews the best practices for designing scalable, self-documenting REST APIs that are easy to understand and integrate.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-principle-1-resource-oriented-urls-use-nouns"&gt;1. Principle 1: Resource-Oriented URLs (Use Nouns)
&lt;/h2&gt;&lt;p&gt;The core principle of REST is that &lt;strong&gt;URIs represent resources (nouns)&lt;/strong&gt;, while the &lt;strong&gt;HTTP methods (verbs)&lt;/strong&gt; represent the actions performed on those resources.&lt;/p&gt;</description></item><item><title>Automating Pre-Commit Checks with Husky and Git Hooks</title><link>https://takao.blog/ko/web/git-hooks-husky-prevent-bugs/</link><pubDate>Sun, 20 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-hooks-husky-prevent-bugs/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-hooks-husky-prevent-bugs-ko.png" alt="Featured image of post Automating Pre-Commit Checks with Husky and Git Hooks" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In team development, simple mistakes like committing code with syntax errors or bad formatting are common. These issues can break the CI build or lead to messy formatting wars during code reviews.&lt;/p&gt;
&lt;p&gt;Instead of relying on developer vigilance to enforce guidelines, you can automate these checks.&lt;/p&gt;
&lt;p&gt;By combining &lt;strong&gt;Git Hooks&lt;/strong&gt; with &lt;strong&gt;Husky&lt;/strong&gt;, you can automatically trigger linters (ESLint), formatters (Prettier), and unit tests (Jest) before any commit or push is finalized. This 가이드 walks you through 설정 up this workflow.&lt;/p&gt;</description></item><item><title>Comparing Package Managers: npm, pnpm, and yarn</title><link>https://takao.blog/ko/web/npm-pnpm-yarn-package-managers/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/npm-pnpm-yarn-package-managers/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/npm-pnpm-yarn-package-managers-ko.png" alt="Featured image of post Comparing Package Managers: npm, pnpm, and yarn" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In JavaScript and Node.js development, package managers are essential daily tools.&lt;/p&gt;
&lt;p&gt;While &lt;strong&gt;npm&lt;/strong&gt; remains the default industry standard, modern alternatives like &lt;strong&gt;pnpm&lt;/strong&gt; (famous for saving disk space and speed) and &lt;strong&gt;yarn&lt;/strong&gt; (featuring zero-installs and Plug&amp;rsquo;n&amp;rsquo;Play modes) offer distinct architectures.&lt;/p&gt;
&lt;p&gt;Although they resolve the same &lt;code&gt;package.json&lt;/code&gt; specifications, their internal storage structures, dependency resolutions, and security 기능 differ. This article compares these three package managers to help you choose the best tool for your next project.&lt;/p&gt;</description></item><item><title>Demystifying Next.js App Router Caching Mechanisms</title><link>https://takao.blog/ko/web/nextjs-app-router-caching/</link><pubDate>Thu, 10 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/nextjs-app-router-caching/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-app-router-caching-ko.png" alt="Featured image of post Demystifying Next.js App Router Caching Mechanisms" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Next.js App Router 기능 a robust caching architecture designed to optimize loading speeds and reduce backend API overhead.&lt;/p&gt;
&lt;p&gt;However, because Next.js integrates multiple caching layers, developers often run into debugging issues. Common issues include pages displaying stale data or APIs firing too frequently.&lt;/p&gt;
&lt;p&gt;This article clears up the confusion by explaining the &lt;strong&gt;four caching mechanisms&lt;/strong&gt; in Next.js, along with techniques to configure, refresh, and invalidate them.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-the-four-caching-layers-of-nextjs-app-router"&gt;1. The Four Caching Layers of Next.js App Router
&lt;/h2&gt;&lt;p&gt;The Next.js App Router uses four separate caching layers:&lt;/p&gt;</description></item><item><title>Smooth Page Transitions with View Transitions API</title><link>https://takao.blog/ko/web/css-view-transitions-single-page-api/</link><pubDate>Sat, 05 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-view-transitions-single-page-api/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-view-transitions-single-page-api-ko.png" alt="Featured image of post Smooth Page Transitions with View Transitions API" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Providing dynamic page transitions is a key factor in elevating the overall user experience (UX) of modern web applications.&lt;/p&gt;
&lt;p&gt;Historically, to morph or fade elements smoothly between page navigations, developers had to import heavy JavaScript libraries like Framer Motion or GSAP. These libraries require deep hooks into rendering lifecycles to delay unmounting while animating old DOM nodes.&lt;/p&gt;
&lt;p&gt;The introduction of the W3C standard &lt;strong&gt;View Transitions API&lt;/strong&gt; simplifies this. It allows browsers to natively capture states and interpolate page layout updates with minimal CSS and JavaScript.&lt;/p&gt;</description></item><item><title>Safe Usecases of git cherry-pick for Specific Commits</title><link>https://takao.blog/ko/web/git-cherry-pick-usecases/</link><pubDate>Tue, 25 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-cherry-pick-usecases/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-cherry-pick-usecases-ko.png" alt="Featured image of post Safe Usecases of git cherry-pick for Specific Commits" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In team development, you often encounter situations where you need to deploy a specific bug fix from an ongoing 기능 branch to your production branch (&lt;code&gt;main&lt;/code&gt;) immediately, without releasing the half-finished 기능 itself.&lt;/p&gt;
&lt;p&gt;Merging the entire branch would pull in unfinished code.&lt;/p&gt;
&lt;p&gt;This is where the &lt;strong&gt;&lt;code&gt;git cherry-pick&lt;/code&gt;&lt;/strong&gt; command comes in handy. This article reviews how to safely apply individual commits to a target branch, handle conflicts during execution, and avoid common history pitfalls.&lt;/p&gt;</description></item><item><title>Reducing Docker Image Sizes with Multi-Stage Builds</title><link>https://takao.blog/ko/web/docker-multi-stage-build-reduction/</link><pubDate>Thu, 20 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/docker-multi-stage-build-reduction/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-multi-stage-build-reduction-ko.png" alt="Featured image of post Reducing Docker Image Sizes with Multi-Stage Builds" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Keeping Docker image footprints small is critical for accelerating 배포 cycles, lowering storage costs, and tightening security by shrinking the container&amp;rsquo;s attack surface.&lt;/p&gt;
&lt;p&gt;However, a naive Dockerfile construction often bundles compile-time dependencies (like gcc, headers, build caches) and testing tools directly into the final runtime image. This inflates the image size from a few megabytes to hundreds or gigabytes.&lt;/p&gt;
&lt;p&gt;To solve this, Docker introduced &lt;strong&gt;Multi-Stage Builds&lt;/strong&gt;. This article reviews the core practices of multi-stage architectures, demonstrating image footprint 최적화 using a TypeScript Node.js project.&lt;/p&gt;</description></item><item><title>Approaches to Improving Interaction to Next Paint (INP)</title><link>https://takao.blog/ko/web/performance-web-vitals-inp/</link><pubDate>Sat, 15 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/performance-web-vitals-inp/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/performance-web-vitals-inp-ko.png" alt="Featured image of post Approaches to Improving Interaction to Next Paint (INP)" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In Google&amp;rsquo;s &lt;strong&gt;Core Web Vitals&lt;/strong&gt; metrics, which measure the user experience of web pages, FID (First Input Delay) has officially been replaced by &lt;strong&gt;INP (Interaction to Next Paint)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;While FID only measured the response speed of the very first user interaction, INP evaluates the responsiveness of all clicks, taps, and keyboard inputs across the entire lifecycle of the page visit. It logs the delay between an interaction and the subsequent visual 업데이트 (the &amp;ldquo;Next Paint&amp;rdquo;).&lt;/p&gt;</description></item><item><title>Mastering the TypeScript satisfies Operator</title><link>https://takao.blog/ko/web/typescript-satisfies-operator/</link><pubDate>Mon, 10 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-satisfies-operator/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-satisfies-operator-ko.png" alt="Featured image of post Mastering the TypeScript satisfies Operator" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Introduced in TypeScript 4.9, the &lt;strong&gt;&lt;code&gt;satisfies&lt;/code&gt; operator&lt;/strong&gt; is a powerful 기능 designed to improve type safety while preserving developer flexibility.&lt;/p&gt;
&lt;p&gt;However, distinguishing the difference between &lt;code&gt;satisfies&lt;/code&gt;, type annotations (&lt;code&gt;: Type&lt;/code&gt;), and type assertions (&lt;code&gt;as Type&lt;/code&gt;) can be confusing. This 가이드 breaks down the mechanics of the &lt;code&gt;satisfies&lt;/code&gt; operator and shares practical use cases for production codebases.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-the-limitation-of-standard-type-annotations-"&gt;1. The Limitation of Standard Type Annotations (:)
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s review the limitations of standard type annotations.&lt;/p&gt;</description></item><item><title>React 19 Official Release and Practical Features Guide</title><link>https://takao.blog/ko/web/react-19-new-features-practical/</link><pubDate>Wed, 05 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/react-19-new-features-practical/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-19-new-features-practical-ko.png" alt="Featured image of post React 19 Official Release and Practical Features Guide" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;React 19 represents a major paradigm shift for frontend development.&lt;/p&gt;
&lt;p&gt;기능 that were previously restricted to meta-frameworks like Next.js—such as &lt;strong&gt;React 서버 Components (RSC)&lt;/strong&gt; and the &lt;strong&gt;Actions API&lt;/strong&gt; for form handling—are now officially integrated into the stable core React library.&lt;/p&gt;
&lt;p&gt;This 가이드 highlights the most important 기능 in React 19, offering practical code examples and upgrading 팁 to clean up your codebase.&lt;/p&gt;</description></item><item><title>Defense Principles of XSS in Web Development</title><link>https://takao.blog/ko/web/security-basics-xss-prevention/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/security-basics-xss-prevention/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-basics-xss-prevention-ko.png" alt="Featured image of post Defense Principles of XSS in Web Development" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In web security, &lt;strong&gt;Cross-Site Scripting (XSS)&lt;/strong&gt; stands as one of the oldest and most persistent vulnerabilities.&lt;/p&gt;
&lt;p&gt;If malicious scripts run on a victim&amp;rsquo;s browser, they can compromise the entire session, steal session tokens (cookies), hijack accounts, or dynamically alter page content to harvest sensitive credentials.&lt;/p&gt;
&lt;p&gt;This article reviews the fundamental defense principles required to eliminate XSS vulnerabilities in modern web applications. We will explore contextual escaping, sanitization, secure DOM manipulation, and defensive depth mechanisms.&lt;/p&gt;</description></item><item><title>Cleaning Commit History with Interactive Git Rebase</title><link>https://takao.blog/ko/web/git-rebase-interactive-flow/</link><pubDate>Thu, 20 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-rebase-interactive-flow/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-rebase-interactive-flow-ko.png" alt="Featured image of post Cleaning Commit History with Interactive Git Rebase" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;During daily software development, it is common to end up with a messy commit history full of logs like &amp;ldquo;WIP,&amp;rdquo; &amp;ldquo;fix typo,&amp;rdquo; or &amp;ldquo;testing 배포.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;If you merge these commits directly into your main branch, finding where a specific bug was introduced or understanding why a line of code was added becomes extremely difficult.&lt;/p&gt;
&lt;p&gt;Git&amp;rsquo;s &lt;strong&gt;interactive rebase (&lt;code&gt;git rebase -i&lt;/code&gt;)&lt;/strong&gt; allows you to clean up your commit history before creating a pull request. You can squash multiple commits into one, edit commit messages, reorder history, or delete redundant changes. This article covers the step-by-step workflow of utilizing interactive rebasing.&lt;/p&gt;</description></item><item><title>Patterns to Avoid with JavaScript Async/Await</title><link>https://takao.blog/ko/web/javascript-async-await-tips/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/javascript-async-await-tips/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/javascript-async-await-tips-ko.png" alt="Featured image of post Patterns to Avoid with JavaScript Async/Await" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Since the introduction of &lt;code&gt;async/await&lt;/code&gt; in ES2017, writing asynchronous JavaScript has become far more intuitive. It allows developers to express asynchronous logic in a synchronous-looking structure, drastically improving codebase readability compared to nested Promise chains (&lt;code&gt;.then().catch()&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;However, this clean synchronous-like syntax can hide 성능 pitfalls and error-handling bugs. In this article, we&amp;rsquo;ll dive into common async/await antipatterns and learn how to refactor them into high-성능, resilient code.&lt;/p&gt;</description></item><item><title>Introduction to CSS Anchor Positioning and Examples</title><link>https://takao.blog/ko/web/css-anchor-positioning-guide/</link><pubDate>Mon, 10 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-anchor-positioning-guide/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-anchor-positioning-guide-ko.png" alt="Featured image of post Introduction to CSS Anchor Positioning and Examples" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In web development, positioning floating elements—such as tooltips, popovers, dropdown menus, and hover cards—relative to a specific reference element (the anchor) has historically been a complex challenge.&lt;/p&gt;
&lt;p&gt;To make floating elements follow anchor points on window resizing or page scrolling, developers traditionally relied on continuous JavaScript coordinate calculations (using &lt;code&gt;getBoundingClientRect()&lt;/code&gt;) to dynamically alter inline styles. Libraries like Popper.js or Floating UI became industry standards for this reason. However, executing script loops on the main thread during scroll events frequently caused rendering 렉 and jank, especially on mobile devices.&lt;/p&gt;</description></item><item><title>Understanding OpenAI's New Reasoning Models and Their Inner Workings</title><link>https://takao.blog/ko/web/ai-reasoning-models-openai/</link><pubDate>Wed, 05 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/ai-reasoning-models-openai/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ai-reasoning-models-openai-ko.png" alt="Featured image of post Understanding OpenAI's New Reasoning Models and Their Inner Workings" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In recent years, the evolutionary pace of 생성형 AI has been nothing short of extraordinary. Among these developments, the new reasoning models released by OpenAI (such as the o1 and o3 series) employ a fundamentally different architecture and approach compared to conventional large language models like GPT-4o.&lt;/p&gt;
&lt;p&gt;Traditional Large Language Models (LLMs) excel at predicting and generating the &amp;ldquo;most likely next word&amp;rdquo; at high speeds. However, when faced with tasks demanding deep logical deduction—such as complex logic puzzles, advanced mathematics, or refactoring large-scale codebases—they often rely on intuitive leaps, leading to logical inconsistencies known as hallucinations.&lt;/p&gt;</description></item><item><title>Proxmox Backup Strategies: vzdump, PBS, and Disaster Recovery</title><link>https://takao.blog/ko/web/proxmox-backup-disaster-recovery/</link><pubDate>Mon, 20 Jan 2025 00:00:00 +0000</pubDate><guid>https://takao.blog/ko/web/proxmox-backup-disaster-recovery/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-backup-disaster-recovery-ko.png" alt="Featured image of post Proxmox Backup Strategies: vzdump, PBS, and Disaster Recovery" /&gt;&lt;p&gt;Backups are not optional. Bit rot, accidental deletion, and ransomware all target hypervisor storage. Proxmox VE offers two backup paths: the built-in &lt;code&gt;vzdump&lt;/code&gt; and the dedicated Proxmox Backup 서버 (PBS).&lt;/p&gt;
&lt;h2 id="why-backup-matters"&gt;Why Backup Matters
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Threat&lt;/th&gt;
					&lt;th&gt;Impact&lt;/th&gt;
					&lt;th&gt;Mitigation&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Bit rot&lt;/td&gt;
					&lt;td&gt;Silent single-bit corruption&lt;/td&gt;
					&lt;td&gt;Integrity-verified (PBS)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Accidental deletion&lt;/td&gt;
					&lt;td&gt;VM lost instantly&lt;/td&gt;
					&lt;td&gt;Retention + off-site&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Ransomware&lt;/td&gt;
					&lt;td&gt;Encrypted disks&lt;/td&gt;
					&lt;td&gt;Immutable off-site backups&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="vzdump-the-built-in-tool"&gt;vzdump: The Built-In Tool
&lt;/h2&gt;&lt;p&gt;vzdump creates consistent backups of VMs and containers. For VMs, install the Qemu Guest Agent so vzdump can quiesce the filesystem before snapshotting:&lt;/p&gt;</description></item><item><title>Task Management Tools for Beginners: Choosing the Right One</title><link>https://takao.blog/ko/web/task-managenemt/</link><pubDate>Tue, 14 Jan 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/task-managenemt/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/task-management-ko.png" alt="Featured image of post Task Management Tools for Beginners: Choosing the Right One" /&gt;&lt;p&gt;Hello! Today, I will explain “how to choose a task management tool” to manage your daily tasks more efficiently. It is very important to organize “things to do” in your daily life, whether it is work, schoolwork, or housework. But finding the right tool for you may be a bit difficult. So, here are some 팁 for 초보자 to help you choose the right one without hesitation!&lt;/p&gt;</description></item><item><title>CDN Caching Strategies: Maximize Performance and Freshness</title><link>https://takao.blog/ko/web/cdn-caching-strategies/</link><pubDate>Mon, 30 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/cdn-caching-strategies/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/cdn-caching-strategies-ko.png" alt="Featured image of post CDN Caching Strategies: Maximize Performance and Freshness" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Content Delivery Networks (CDNs) are the backbone of modern web 성능. By caching content at edge nodes distributed globally, CDNs dramatically reduce latency and offload traffic from origin servers. However, effective caching is not simply a matter of enabling a CDN and forgetting about it. Striking the right balance between 성능 — high cache hit rates and low latency — and freshness — minimal staleness and fast invalidation — requires deliberate strategy.&lt;/p&gt;</description></item><item><title>File System Access API: Powerful Local File Operations</title><link>https://takao.blog/ko/web/file-system-access-api/</link><pubDate>Sat, 28 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/file-system-access-api/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/file-system-access-api-ko.png" alt="Featured image of post File System Access API: Powerful Local File Operations" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For decades, web applications were limited to reading files through a clunky &lt;code&gt;&amp;lt;input type=&amp;quot;file&amp;quot;&amp;gt;&lt;/code&gt; element and had no reliable way to save changes back to the original file. The File System Access API changes this entirely. It enables web applications to read, write, and manage files and directories directly on the user&amp;rsquo;s local file system — with user permission, of course. This opens the door to building text editors, image editors, IDEs, and productivity tools that feel native.&lt;/p&gt;</description></item><item><title>Mobile Web Performance Optimization: 2024 Techniques</title><link>https://takao.blog/ko/web/mobile-performance/</link><pubDate>Thu, 26 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/mobile-performance/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/mobile-performance-ko.png" alt="Featured image of post Mobile Web Performance Optimization: 2024 Techniques" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Mobile web 성능 is no longer a secondary concern. With mobile traffic accounting for over 60% of global web traffic and growing rapidly in emerging markets, the 성능 characteristics of your site on mobile devices directly impact user retention, conversion, and search rankings. Users expect fast, fluid experiences — 53% abandon sites that take longer than 3 seconds to load. This article covers the key techniques for optimizing mobile web 성능 in 2024, from 네트워크-aware loading to touch event 최적화 and Core Web Vitals.&lt;/p&gt;</description></item><item><title>Git Hooks for Automation: Beyond Code Quality</title><link>https://takao.blog/ko/web/git-hooks-automation/</link><pubDate>Tue, 24 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-hooks-automation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-hooks-automation-ko.png" alt="Featured image of post Git Hooks for Automation: Beyond Code Quality" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Git hooks are executable scripts that run automatically at specific points in the Git lifecycle. While many developers associate them solely with code formatting and linting, their potential extends far beyond—into workflow automation, project management, and team collaboration. This article explores how to leverage Git hooks for comprehensive automation strategies.&lt;/p&gt;
&lt;h2 id="understanding-git-hooks"&gt;Understanding Git Hooks
&lt;/h2&gt;&lt;p&gt;Git hooks reside in the &lt;code&gt;.git/hooks/&lt;/code&gt; directory of every repository. They are standard executable scripts written in any language—bash, Python, Node.js, or Ruby. Hooks fall into two categories: &lt;strong&gt;client-side hooks&lt;/strong&gt; (pre-commit, pre-push, commit-msg) that run on a developer&amp;rsquo;s machine, and &lt;strong&gt;서버-side hooks&lt;/strong&gt; (pre-receive, 업데이트, post-receive) that execute on the remote repository.&lt;/p&gt;</description></item><item><title>TypeScript Path Aliases: Clean Imports at Scale</title><link>https://takao.blog/ko/web/typescript-path-aliases/</link><pubDate>Sun, 22 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-path-aliases/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-path-aliases-ko.png" alt="Featured image of post TypeScript Path Aliases: Clean Imports at Scale" /&gt;&lt;p&gt;TypeScript path aliases eliminate the pain of deep relative imports like &lt;code&gt;../../../utils/helpers&lt;/code&gt;, replacing them with clean, intention-revealing paths such as &lt;code&gt;@utils/helpers&lt;/code&gt;. This article covers configuration, bundler integration, testing, and migration strategies.&lt;/p&gt;
&lt;h2 id="configuring-baseurl-and-paths"&gt;Configuring baseUrl and paths
&lt;/h2&gt;&lt;p&gt;The foundation of path aliases is the &lt;code&gt;paths&lt;/code&gt; mapping in &lt;code&gt;tsconfig.json&lt;/code&gt;, combined with &lt;code&gt;baseUrl&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;compilerOptions&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;baseUrl&amp;#34;: &amp;#34;.&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;paths&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;@/*&amp;#34;: [&amp;#34;./src/*&amp;#34;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;@components/*&amp;#34;: [&amp;#34;./src/components/*&amp;#34;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;@utils/*&amp;#34;: [&amp;#34;./src/utils/*&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;baseUrl&lt;/code&gt; sets the base directory for resolving non-relative module names. &lt;code&gt;paths&lt;/code&gt; maps alias prefixes to file system locations relative to &lt;code&gt;baseUrl&lt;/code&gt;. The wildcard &lt;code&gt;*&lt;/code&gt; matches any path segment after the prefix.&lt;/p&gt;</description></item><item><title>Subresource Integrity: Protecting Your CDN Dependencies</title><link>https://takao.blog/ko/web/subresource-integrity/</link><pubDate>Fri, 20 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/subresource-integrity/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/subresource-integrity-ko.png" alt="Featured image of post Subresource Integrity: Protecting Your CDN Dependencies" /&gt;&lt;p&gt;Subresource Integrity (SRI) is a security 기능 that lets browsers verify that resources fetched from CDNs or third-party origins have not been tampered with. In an era of supply chain attacks — the British Airways Magecart breach, the Polyfill.io compromise, and numerous CDN incidents — SRI provides cryptographic assurance that the resource your page loads is exactly what you intended.&lt;/p&gt;
&lt;h2 id="how-sri-works"&gt;How SRI Works
&lt;/h2&gt;&lt;p&gt;When you add an &lt;code&gt;integrity&lt;/code&gt; attribute to a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;/code&gt; tag, the browser computes the hash of the fetched resource and compares it to the attribute value. If they don&amp;rsquo;t match, the browser refuses to execute or apply the resource.&lt;/p&gt;</description></item><item><title>Node.js Performance Monitoring: Metrics That Matter</title><link>https://takao.blog/ko/web/nodejs-performance/</link><pubDate>Wed, 18 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/nodejs-performance/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-performance-ko.png" alt="Featured image of post Node.js Performance Monitoring: Metrics That Matter" /&gt;&lt;p&gt;Node.js 성능 monitoring requires a different approach than traditional 서버 environments. The single-threaded event loop, garbage-collected memory model, and asynchronous I/O create unique failure modes that generic CPU and memory metrics alone cannot capture. This article covers the essential metrics and tools you need to keep Node.js applications running smoothly in production.&lt;/p&gt;
&lt;h2 id="why-nodejs-성능-monitoring-is-different"&gt;Why Node.js 성능 Monitoring Is Different
&lt;/h2&gt;&lt;p&gt;Unlike multi-threaded servers where a slow operation blocks only one thread, a single CPU-heavy operation in Node.js blocks the entire event loop, stalling all concurrent requests. Garbage collection pauses can introduce unpredictable latency spikes. Common failure modes include event loop starvation, memory leaks from uncleaned closures, callback thrashing, and unhandled promise rejections silently swallowing errors. Understanding these characteristics is the first step toward effective monitoring.&lt;/p&gt;</description></item><item><title>CSS Scoped Styles: @scope and Encapsulation Strategies</title><link>https://takao.blog/ko/web/css-scoped-styles/</link><pubDate>Sun, 15 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-scoped-styles/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-scoped-styles-ko.png" alt="Featured image of post CSS Scoped Styles: @scope and Encapsulation Strategies" /&gt;&lt;p&gt;CSS scoping has always been a challenge. Styles cascade globally by default, meaning a selector in one component can unintentionally affect elements in another. Over the years, developers have adopted naming conventions, build-time tools, and full DOM isolation to solve this. The newest addition to this toolkit is the CSS &lt;code&gt;@scope&lt;/code&gt; at-rule, which introduces proximity-based cascade control. This article compares all major scoping strategies and helps you choose the right one.&lt;/p&gt;</description></item><item><title>JavaScript Array Methods: From Basics to Advanced Patterns</title><link>https://takao.blog/ko/web/js-array-methods/</link><pubDate>Thu, 12 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/js-array-methods/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-array-methods-ko.png" alt="Featured image of post JavaScript Array Methods: From Basics to Advanced Patterns" /&gt;&lt;p&gt;JavaScript arrays are the backbone of data manipulation in modern web development. With the ES2023 specification introducing immutable alternatives to long-standing mutating methods, now is the perfect time to revisit how we work with arrays. This article covers the full landscape of array methods, from the familiar &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, and &lt;code&gt;reduce&lt;/code&gt; to cutting-edge additions, with practical examples and 성능 insights.&lt;/p&gt;
&lt;h2 id="the-array-method-landscape"&gt;The Array Method Landscape
&lt;/h2&gt;&lt;p&gt;Array methods fall into two broad categories: mutating and non-mutating. Methods like &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pop&lt;/code&gt;, &lt;code&gt;splice&lt;/code&gt;, &lt;code&gt;sort&lt;/code&gt;, and &lt;code&gt;reverse&lt;/code&gt; modify the array in place, while &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;slice&lt;/code&gt;, and the ES2023 additions create new arrays. The industry trend is shifting toward immutability, which reduces bugs caused by unintended side effects.&lt;/p&gt;</description></item><item><title>Secure Cookie Configuration: A Complete Web Developer Guide</title><link>https://takao.blog/ko/web/secure-cookies/</link><pubDate>Mon, 09 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/secure-cookies/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/secure-cookies-ko.png" alt="Featured image of post Secure Cookie Configuration: A Complete Web Developer Guide" /&gt;&lt;p&gt;Cookies remain one of the most frequently misconfigured security controls on the web. A single missing attribute can expose your application to session hijacking, CSRF, or cross-site information leakage. Modern browsers have pushed stricter defaults, but understanding each attribute and combining them correctly is essential for defense-in-depth.&lt;/p&gt;
&lt;p&gt;The core security attributes are &lt;code&gt;Secure&lt;/code&gt;, &lt;code&gt;HttpOnly&lt;/code&gt;, &lt;code&gt;SameSite&lt;/code&gt;, and the &lt;code&gt;__Host-&lt;/code&gt; / &lt;code&gt;__Secure-&lt;/code&gt; prefixes. Each serves a distinct purpose, and they work best when combined.&lt;/p&gt;</description></item><item><title>React Concurrent Features: Building Responsive UIs</title><link>https://takao.blog/ko/web/react-concurrent/</link><pubDate>Fri, 06 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/react-concurrent/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-concurrent-ko.png" alt="Featured image of post React Concurrent Features: Building Responsive UIs" /&gt;&lt;p&gt;React 18 introduced concurrent 기능 that fundamentally change how rendering works. These 기능 let React prepare multiple 버전 of the UI at once, interrupt work in progress, and prioritize urgent updates over non-urgent ones. The result is more 반응형 applications without giving up the declarative programming model that makes React productive.&lt;/p&gt;
&lt;p&gt;Concurrency in React is not an all-or-nothing mode. Unlike the abandoned &amp;ldquo;Concurrent Mode&amp;rdquo; concept from earlier experimental builds, React 18+ makes concurrent 기능 opt-in. You adopt them 기능 by 기능, where they provide the most value. The underlying Fiber architecture makes this possible: React&amp;rsquo;s render phase can be paused and resumed, so the reconciler can switch between different units of work as priorities change.&lt;/p&gt;</description></item><item><title>GraphQL vs REST in 2024: Making the Right Choice</title><link>https://takao.blog/ko/web/graphql-vs-rest-2024/</link><pubDate>Tue, 03 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/graphql-vs-rest-2024/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/graphql-vs-rest-2024-ko.png" alt="Featured image of post GraphQL vs REST in 2024: Making the Right Choice" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;The debate between GraphQL and REST has matured significantly by 2024. Both approaches have evolved, adopted 기능 from each other, and found their niches. The question is no longer which is universally superior, but which fits your specific project context. This article provides a balanced comparison to help teams make informed API architecture decisions.&lt;/p&gt;
&lt;h2 id="state-of-rest-in-2024"&gt;State of REST in 2024
&lt;/h2&gt;&lt;p&gt;REST remains the dominant API paradigm, powering the majority of web APIs. Its strengths lie in maturity, simplicity, and universal HTTP caching. The OpenAPI 3.1 specification brought JSON Schema compatibility, improving interoperability. Tooling like Swagger UI, Redoc, and Postman collections provide excellent documentation and testing capabilities.&lt;/p&gt;</description></item><item><title>WebAssembly for Browser Applications: Beyond the Hype</title><link>https://takao.blog/ko/web/wasm-browser-apps/</link><pubDate>Sat, 30 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/wasm-browser-apps/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/wasm-browser-apps-ko.png" alt="Featured image of post WebAssembly for Browser Applications: Beyond the Hype" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;WebAssembly has matured from a niche curiosity into a production-ready tool for browser-based applications. While early demos focused on gaming engines and scientific simulations, today Wasm is used in image editors, video transcoders, compression libraries, and cryptographic utilities — all running in the browser at near-native speed.&lt;/p&gt;
&lt;p&gt;The key shift in 2024 is ecosystem maturity. WasmGC ships in Chrome 119+, SIMD is available across all major browsers, and reference types allow passing DOM nodes directly into Wasm modules. This article cuts through the hype to examine realistic use cases, compile-target decisions, memory management strategies, and integration patterns for production applications.&lt;/p&gt;</description></item><item><title>Git LFS: Managing Large Files in Your Repository</title><link>https://takao.blog/ko/web/git-lfs/</link><pubDate>Tue, 26 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-lfs/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-lfs-ko.png" alt="Featured image of post Git LFS: Managing Large Files in Your Repository" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Git was designed for text files, not large binaries. When large files enter a Git repository, clone times increase, repository size balloons, and operations like &lt;code&gt;git log&lt;/code&gt; slow down. Git LFS (Large File Storage) solves this by replacing large files with text pointer files in the repository while storing the actual content on a remote 서버.&lt;/p&gt;
&lt;p&gt;A pointer file is a small text file that maps to content on the LFS 서버:&lt;/p&gt;</description></item><item><title>Third-Party Script Optimization: Taming Page Bloat</title><link>https://takao.blog/ko/web/third-party-scripts/</link><pubDate>Tue, 19 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/third-party-scripts/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/third-party-scripts-ko.png" alt="Featured image of post Third-Party Script Optimization: Taming Page Bloat" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Third-party scripts are the hidden tax of modern web development. The average page loads 15–25 third-party requests, accounting for 60–80% of total page weight. Data from the HTTP Archive confirms that third-party JavaScript is growing faster than first-party code. Each external script adds 네트워크 latency, parse and compile time, main-thread contention, and potential security risks. The good news: you can optimize third-party scripts without removing their functionality. The goal is to minimize 성능 impact while preserving business value.&lt;/p&gt;</description></item><item><title>Docker Compose for Production: Deployment Best Practices</title><link>https://takao.blog/ko/web/docker-compose-production/</link><pubDate>Tue, 12 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/docker-compose-production/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-compose-production-ko.png" alt="Featured image of post Docker Compose for Production: Deployment Best Practices" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Docker Compose is often relegated to local development, but it is increasingly used for single-host production deployments of small-to-medium applications. The common criticism that &amp;ldquo;Compose is not for production&amp;rdquo; overlooks a key point: for many workloads, a well-configured Compose stack on a single VM provides the right balance of simplicity and reliability.&lt;/p&gt;
&lt;p&gt;This 가이드 covers production-grade Compose practices — treating your compose files as infrastructure-as-code with proper 버전 control, CI/CD integration, and production-specific hardening.&lt;/p&gt;</description></item><item><title>CSS Trigonometric Functions: Math in Your Stylesheets</title><link>https://takao.blog/ko/web/css-trig-functions/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-trig-functions/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-trig-functions-ko.png" alt="Featured image of post CSS Trigonometric Functions: Math in Your Stylesheets" /&gt;&lt;p&gt;CSS has evolved from a simple styling language into a powerful computation engine. The introduction of trigonometric functions in CSS Values and Units Module Level 4 &amp;ndash; shipping in Chrome 111+, Firefox 108+, and Safari 15.4+ &amp;ndash; marks a paradigm shift. Developers can now perform geometric calculations directly in stylesheets without preprocessors or JavaScript.&lt;/p&gt;
&lt;h2 id="function-reference-and-syntax"&gt;Function Reference and Syntax
&lt;/h2&gt;&lt;p&gt;Six trigonometric functions are now available in CSS:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Function&lt;/th&gt;
					&lt;th&gt;Input&lt;/th&gt;
					&lt;th&gt;Output&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;sin(angle)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;angle&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; [-1, 1]&lt;/td&gt;
					&lt;td&gt;Sine of an angle&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;cos(angle)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;angle&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; [-1, 1]&lt;/td&gt;
					&lt;td&gt;Cosine of an angle&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;tan(angle)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;angle&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Tangent of an angle&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;atan2(y, x)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Arctangent of y/x (full 360°)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;asin(value)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; [-1, 1]&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Arcsine&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;acos(value)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; [-1, 1]&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Arccosine&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Angle units include &lt;code&gt;deg&lt;/code&gt;, &lt;code&gt;rad&lt;/code&gt;, &lt;code&gt;grad&lt;/code&gt;, and &lt;code&gt;turn&lt;/code&gt;. Common pitfalls include forgetting units, division by zero in &lt;code&gt;atan2&lt;/code&gt;, and domain errors with &lt;code&gt;asin&lt;/code&gt;/&lt;code&gt;acos&lt;/code&gt; inputs outside [-1, 1].&lt;/p&gt;</description></item><item><title>AI Content Generation Strategies for Developers in 2024</title><link>https://takao.blog/ko/web/ai-content-generation/</link><pubDate>Tue, 29 Oct 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/ai-content-generation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ai-content-generation-ko.png" alt="Featured image of post AI Content Generation Strategies for Developers in 2024" /&gt;&lt;p&gt;AI content generation has moved from experimentation to production. Developers are no longer asking whether AI can generate content but how to integrate it reliably, at scale, and with quality control. This article provides a practical 가이드 for building content systems with AI, focusing on technical architecture, quality assurance, and ethical 배포 rather than prompt engineering 팁.&lt;/p&gt;
&lt;h2 id="llm-powered-content-pipelines"&gt;LLM-Powered Content Pipelines
&lt;/h2&gt;&lt;p&gt;A well-architected AI content pipeline consists of several stages. It starts with content specification input including structured metadata, topic briefs, and tone guidelines. A prompt construction layer uses a template system with variable injection, guardrails, and few-shot examples. The LLM API dispatch routes requests to providers such as OpenAI, Anthropic, or open-source models via vLLM or Ollama. Post-processing handles format validation, content extraction, and cleanup before the result enters a human review queue.&lt;/p&gt;</description></item><item><title>JavaScript Bundle Size Optimization: From Analysis to Action</title><link>https://takao.blog/ko/web/bundle-size-optimization/</link><pubDate>Tue, 22 Oct 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/bundle-size-optimization/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/bundle-size-optimization-ko.png" alt="Featured image of post JavaScript Bundle Size Optimization: From Analysis to Action" /&gt;&lt;p&gt;JavaScript bundle size directly impacts user experience. Larger bundles mean longer 다운로드 times, slower parsing and compilation, and worse Core Web Vitals. A 100KB increase in JavaScript reduces conversion rates by 2 to 3 percent. Bundle 최적화 is an ongoing 투자, not a one-time fix, and follows a cycle of analysis, identification, 최적화, and monitoring.&lt;/p&gt;
&lt;h2 id="bundle-analysis-tools"&gt;Bundle Analysis Tools
&lt;/h2&gt;&lt;p&gt;Understanding what is in your bundle is the first step. webpack-bundle-analyzer provides an interactive treemap visualization that highlights large dependencies and duplicate modules. Vite users can leverage rollup-plugin-visualizer with sunburst and 네트워크 graphs, while esbuild offers the &amp;ndash;metafile flag for detailed output analysis. source-map-explorer maps compiled code back to source files.&lt;/p&gt;</description></item><item><title>TypeScript Branded Types: Preventing Primitive Confusion</title><link>https://takao.blog/ko/web/typescript-branded-types/</link><pubDate>Tue, 15 Oct 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-branded-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-branded-types-ko.png" alt="Featured image of post TypeScript Branded Types: Preventing Primitive Confusion" /&gt;&lt;p&gt;TypeScript uses structural typing (duck typing): two types with identical shapes are interchangeable. This causes bugs when primitive types back domain concepts — passing a &lt;code&gt;userId&lt;/code&gt; where an &lt;code&gt;orderId&lt;/code&gt; is expected, both typed as &lt;code&gt;string&lt;/code&gt;. Consider a function that sends an email but accidentally receives a database ID instead of an address because both are &lt;code&gt;string&lt;/code&gt;. Branded types solve this by adding a phantom type marker that differentiates structurally identical types at compile time with zero runtime cost.&lt;/p&gt;</description></item><item><title>Next.js Internationalization: Routing and Content Strategy</title><link>https://takao.blog/ko/web/nextjs-i18n-routing/</link><pubDate>Tue, 08 Oct 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/nextjs-i18n-routing/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-i18n-routing-ko.png" alt="Featured image of post Next.js Internationalization: Routing and Content Strategy" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Internationalization is a fundamental requirement for modern web applications. Next.js has evolved its i18n support from an integrated routing system in Pages Router to a flexible middleware-based approach in App Router. This article covers routing strategies, locale detection, content management, and SEO 최적화 for multi-language Next.js applications.&lt;/p&gt;
&lt;p&gt;The key concepts are locales, default locale, locale detection, and the trade-offs between sub-path routing and domain routing. The App Router approach offers more flexibility but requires more manual setup than its predecessor.&lt;/p&gt;</description></item><item><title>SQL Injection Prevention: Modern Database Security Guide</title><link>https://takao.blog/ko/web/sql-injection-prevention/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/sql-injection-prevention/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/sql-injection-prevention-ko.png" alt="Featured image of post SQL Injection Prevention: Modern Database Security Guide" /&gt;&lt;p&gt;SQL injection remains in the OWASP Top 10 despite decades of awareness. The 2023-2024 period saw high-프로필 breaches in healthcare, e-commerce, and government sectors involving SQLi. While the classic &lt;code&gt;' OR 1=1 --&lt;/code&gt; attack is well-known, modern variants include second-order injection, blind SQLi (time-based and boolean-based), and out-of-band exfiltration. Prevention is well-understood but poorly executed due to legacy code, ORM misuse, and insufficient testing automation.&lt;/p&gt;</description></item><item><title>Monorepo Management with Turborepo: Scaling Development</title><link>https://takao.blog/ko/web/monorepo-turborepo/</link><pubDate>Tue, 24 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/monorepo-turborepo/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/monorepo-turborepo-ko.png" alt="Featured image of post Monorepo Management with Turborepo: Scaling Development" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;As JavaScript monorepos grow, build times spiral, CI pipelines saturate, and developer productivity drops. Turborepo, created by Vercel, addresses these challenges with intelligent caching and parallel task execution. Unlike Lerna or Nx, Turborepo focuses on being a task runner rather than a build tool, delegating compilation to tools like esbuild, webpack, and tsc.&lt;/p&gt;
&lt;h2 id="core-architecture--the-cache-system"&gt;Core Architecture — The Cache System
&lt;/h2&gt;&lt;p&gt;Turborepo&amp;rsquo;s cache is its defining 기능. Cache keys are computed from file contents, environment variables, and dependency graphs. The cache lives in &lt;code&gt;node_modules/.cache/turbo&lt;/code&gt; as tar.gz archives, and the cache hit/miss lifecycle determines whether a task executes or skips.&lt;/p&gt;</description></item><item><title>Serverless Architecture Patterns: Beyond Lambda Functions</title><link>https://takao.blog/ko/web/serverless-patterns/</link><pubDate>Tue, 17 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/serverless-patterns/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/serverless-patterns-ko.png" alt="Featured image of post Serverless Architecture Patterns: Beyond Lambda Functions" /&gt;&lt;p&gt;Serverless computing has evolved far beyond replacing simple REST APIs with Lambda functions behind API Gateway. Modern serverless architectures are fully event-driven, asynchronous, and decompose monoliths into coordinated function workflows. Major enterprises now run production workloads on AWS Lambda, Azure Functions, and Cloudflare Workers. This article explores patterns that go beyond the basics.&lt;/p&gt;
&lt;h2 id="event-driven-architecture-foundation"&gt;Event-Driven Architecture Foundation
&lt;/h2&gt;&lt;p&gt;At the core of serverless is the event-driven model: event producers emit events, event routers deliver them, and event consumers React. AWS offers multiple routing services — EventBridge for schema-aware event buses, SQS for queue-based decoupling, SNS for pub/sub messaging, and Kafka for high-throughput streaming.&lt;/p&gt;</description></item><item><title>JavaScript Typed Arrays: Binary Data Processing in the Browser</title><link>https://takao.blog/ko/web/js-typed-arrays/</link><pubDate>Tue, 10 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/js-typed-arrays/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-typed-arrays-ko.png" alt="Featured image of post JavaScript Typed Arrays: Binary Data Processing in the Browser" /&gt;&lt;p&gt;JavaScript&amp;rsquo;s native &lt;code&gt;Number&lt;/code&gt; type — an IEEE 754 double-precision float — is inefficient for binary data. Early solutions involved manual byte packing in plain arrays, which was slow and error-prone. ECMAScript 2015 formalized Typed Arrays, bringing C-like memory management to JavaScript. This three-layer architecture — &lt;code&gt;ArrayBuffer&lt;/code&gt;, TypedArray views, and &lt;code&gt;DataView&lt;/code&gt; — enables high-성능 binary data processing in the browser and Node.js.&lt;/p&gt;
&lt;h2 id="arraybuffer-foundation"&gt;ArrayBuffer Foundation
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;ArrayBuffer&lt;/code&gt; represents a fixed-length raw binary buffer. It cannot be read or written directly — you must use a view:&lt;/p&gt;</description></item><item><title>React Portals: Advanced Patterns for Modals and Overlays</title><link>https://takao.blog/ko/web/react-portal-patterns/</link><pubDate>Tue, 03 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/react-portal-patterns/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-portal-patterns-ko.png" alt="Featured image of post React Portals: Advanced Patterns for Modals and Overlays" /&gt;&lt;p&gt;React portals solve a fundamental problem: DOM hierarchy constraints. A modal rendered inside a deeply nested component inherits its parent&amp;rsquo;s &lt;code&gt;z-index&lt;/code&gt; stacking context and can be clipped by &lt;code&gt;overflow: hidden&lt;/code&gt;. Portals let you render children into a different DOM node while preserving the React tree, so context, event handling, and component lifecycle all work as expected.&lt;/p&gt;
&lt;p&gt;The key insight is the separation of DOM position from React tree position. A portal&amp;rsquo;s children are physically rendered elsewhere in the DOM, but events bubble through the React component hierarchy, not the DOM hierarchy. This mental model is essential for understanding all portal patterns.&lt;/p&gt;</description></item><item><title>Docker Networking: From Bridge to Overlay Networks</title><link>https://takao.blog/ko/web/docker-networking/</link><pubDate>Tue, 27 Aug 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/docker-networking/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-networking-ko.png" alt="Featured image of post Docker Networking: From Bridge to Overlay Networks" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Docker containers are designed to be portable and isolated, but they rarely run in isolation. Containers need to communicate with each other, with the host system, and with external services. Understanding Docker&amp;rsquo;s networking model is essential for building reliable, secure, and performant containerized applications.&lt;/p&gt;
&lt;p&gt;Docker provides several built-in 네트워크 drivers — bridge, host, overlay, macvlan, ipvlan, and none — each suited to different use cases. This 가이드 covers each driver in depth, along with DNS 해상도, port mapping, security isolation, and Docker Compose networking patterns.&lt;/p&gt;</description></item><item><title>CSS Popover API: Native Overlays Without JavaScript</title><link>https://takao.blog/ko/web/css-popover-api/</link><pubDate>Tue, 20 Aug 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-popover-api/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-popover-api-ko.png" alt="Featured image of post CSS Popover API: Native Overlays Without JavaScript" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Building overlays like tooltips, dropdown menus, and modals has traditionally required a significant amount of JavaScript. Developers have relied on CSS &lt;code&gt;position: absolute&lt;/code&gt; with manual coordinate calculations, ARIA attributes for 접근성, and framework-specific solutions such as React portals or Floating UI. The CSS Popover API changes this by providing a native, declarative way to create overlays that handle positioning, show/hide toggling, focus management, and light dismiss without any JavaScript.&lt;/p&gt;</description></item><item><title>Proxmox VE ZFS Storage: Pool Setup, Snapshots, and Optimization</title><link>https://takao.blog/ko/web/proxmox-zfs-storage/</link><pubDate>Wed, 14 Aug 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/ko/web/proxmox-zfs-storage/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-zfs-storage-ko.png" alt="Featured image of post Proxmox VE ZFS Storage: Pool Setup, Snapshots, and Optimization" /&gt;&lt;h2 id="why-zfs-on-proxmox"&gt;Why ZFS on Proxmox
&lt;/h2&gt;&lt;p&gt;ZFS brings enterprise-grade 기능 to Proxmox VE: data integrity via checksumming (detects and repairs silent corruption), transparent compression, instant snapshots and clones, and flexible RAID-like pooling. It replaces traditional volume management and filesystem layers with a single, unified stack.&lt;/p&gt;
&lt;h2 id="creating-a-pool"&gt;Creating a Pool
&lt;/h2&gt;&lt;p&gt;A pool is built from virtual devices (vdevs). Common vdev types:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Vdev type&lt;/th&gt;
					&lt;th&gt;Minimum disks&lt;/th&gt;
					&lt;th&gt;Usable capacity&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Mirror&lt;/td&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;50%&lt;/td&gt;
					&lt;td&gt;Data mirrored across two disks&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAIDZ1&lt;/td&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;67%&lt;/td&gt;
					&lt;td&gt;Single parity (max 1 disk failure)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAIDZ2&lt;/td&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;50%&lt;/td&gt;
					&lt;td&gt;Double parity (max 2 failures)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAIDZ3&lt;/td&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;40%&lt;/td&gt;
					&lt;td&gt;Triple parity (max 3 failures)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Stripe&lt;/td&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;100%&lt;/td&gt;
					&lt;td&gt;No redundancy (not recommended)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Create a mirrored pool:&lt;/p&gt;</description></item><item><title>TypeScript Project References: Scaling Large Codebases</title><link>https://takao.blog/ko/web/typescript-project-references/</link><pubDate>Tue, 13 Aug 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-project-references/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-project-references-ko.png" alt="Featured image of post TypeScript Project References: Scaling Large Codebases" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;As TypeScript codebases grow, the monolithic &lt;code&gt;tsconfig.json&lt;/code&gt; approach breaks down. Every invocation of &lt;code&gt;tsc&lt;/code&gt; type-checks and emits the entire project — a process that can take minutes even with &lt;code&gt;--noEmit&lt;/code&gt; in large monorepos. Worse, without module boundaries, any file can import any other file, creating tangled dependency graphs that are difficult to refactor. &lt;strong&gt;TypeScript Project References&lt;/strong&gt; solve this by allowing you to split your codebase into independent sub-projects, each with its own &lt;code&gt;tsconfig.json&lt;/code&gt;, enabling incremental builds, enforced API boundaries, and dramatically faster type-checking.&lt;/p&gt;</description></item><item><title>Node.js Logging Best Practices: Structured and Scalable</title><link>https://takao.blog/ko/web/nodejs-logging/</link><pubDate>Tue, 06 Aug 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/nodejs-logging/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-logging-ko.png" alt="Featured image of post Node.js Logging Best Practices: Structured and Scalable" /&gt;&lt;p&gt;Production-grade logging is one of the most overlooked aspects of Node.js application development. While &lt;code&gt;console.log&lt;/code&gt; works for debugging locally, it falls apart in distributed environments where logs must be searchable, structured, and actionable. This article covers the essential patterns for building a logging strategy that scales.&lt;/p&gt;
&lt;h2 id="why-structured-logging"&gt;Why Structured Logging
&lt;/h2&gt;&lt;p&gt;Traditional unstructured logging outputs plain text that is difficult to parse programmatically. Consider &lt;code&gt;console.log(&amp;quot;User logged in:&amp;quot;, userId)&lt;/code&gt;. Grepping this across hundreds of service instances is slow and error-prone. Structured logging outputs each log event as a JSON object, making it machine-readable and queryable by log aggregation systems.&lt;/p&gt;</description></item><item><title>Machine Learning in the Browser with TensorFlow.js</title><link>https://takao.blog/ko/web/ml-in-browser/</link><pubDate>Tue, 30 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/ml-in-browser/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ml-in-browser-ko.png" alt="Featured image of post Machine Learning in the Browser with TensorFlow.js" /&gt;&lt;p&gt;머신러닝 in the browser eliminates 서버 costs, preserves user privacy, and enables offline-capable intelligent applications. TensorFlow.js brings ML to JavaScript developers with GPU-accelerated inference and training, powered by WebGL and WebGPU backends. This article covers loading pre-trained models, transfer learning, real-time pose detection, and production 배포 considerations.&lt;/p&gt;
&lt;h2 id="why-ml-in-the-browser"&gt;Why ML in the Browser?
&lt;/h2&gt;&lt;p&gt;Running ML models client-side offers four key advantages: zero 서버 costs (inference runs on the user&amp;rsquo;s device), complete privacy (data never leaves the machine), offline capability (no 네트워크 required after model load), and low latency (no round-trip for predictions). The trade-offs include limited compute power, memory constraints, 배터리 drain on mobile devices, and large model 다운로드 sizes (5-200 MB).&lt;/p&gt;</description></item><item><title>Web Bluetooth API: Connecting Hardware from the Browser</title><link>https://takao.blog/ko/web/web-bluetooth-api/</link><pubDate>Tue, 23 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/web-bluetooth-api/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-bluetooth-api-ko.png" alt="Featured image of post Web Bluetooth API: Connecting Hardware from the Browser" /&gt;&lt;p&gt;The Web 블루투스 API brings hardware interaction to the browser, enabling web applications to communicate with 블루투스 Low Energy (BLE) devices. This opens up IoT use cases like connecting heart rate monitors, temperature sensors, and smart lights directly from web pages.&lt;/p&gt;
&lt;h2 id="how-web-블루투스-works"&gt;How Web 블루투스 Works
&lt;/h2&gt;&lt;p&gt;Web 블루투스 operates over the GATT (Generic Attribute 프로필) protocol, which is standard for BLE communication. In this model, the BLE device acts as a peripheral that exposes services and characteristics, while the browser acts as the central that consumes them.&lt;/p&gt;</description></item><item><title>Container Security Scanning: Protecting Your Supply Chain</title><link>https://takao.blog/ko/web/container-security/</link><pubDate>Tue, 16 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/container-security/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/container-security-ko.png" alt="Featured image of post Container Security Scanning: Protecting Your Supply Chain" /&gt;&lt;p&gt;Container security is no longer optional. With supply chain attacks on the rise, securing container images from build to runtime is a fundamental requirement for any organization running containerized workloads. Runtime security alone is insufficient; supply chain security must start at the image build stage.&lt;/p&gt;
&lt;h2 id="the-container-supply-chain-threat-landscape"&gt;The Container Supply Chain Threat Landscape
&lt;/h2&gt;&lt;p&gt;Attack vectors in the container supply chain include compromised base images, vulnerable dependencies, leaked secrets, and malicious packages. Real-world incidents such as the Codecov breach exposing credentials, dependency confusion attacks, and cryptominers found in public images highlight the severity of these threats. The shared responsibility model means that while platforms like Docker provide base infrastructure, the security of your built images is your responsibility.&lt;/p&gt;</description></item><item><title>JavaScript Module Federation: Micro-Frontends in Practice</title><link>https://takao.blog/ko/web/module-federation/</link><pubDate>Tue, 09 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/module-federation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/module-federation-ko.png" alt="Featured image of post JavaScript Module Federation: Micro-Frontends in Practice" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Module Federation, introduced in Webpack 5, provides a runtime integration mechanism for building micro-frontend architectures. Unlike build-time integration approaches, it enables independently deployed applications to share code at runtime, facilitating team autonomy and incremental migration without coordinated releases.&lt;/p&gt;
&lt;p&gt;At its core, Module Federation allows a JavaScript application to dynamically load code from another application at runtime. Each participating application exposes a &lt;code&gt;remoteEntry.js&lt;/code&gt; file that serves as the entry point. When a host application needs a component from a remote, it fetches the &lt;code&gt;remoteEntry.js&lt;/code&gt; at runtime and resolves the required module on demand.&lt;/p&gt;</description></item><item><title>Image Optimization Strategies 2024: AVIF, WebP, and Beyond</title><link>https://takao.blog/ko/web/image-optimization-2024/</link><pubDate>Tue, 02 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/image-optimization-2024/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/image-optimization-2024-ko.png" alt="Featured image of post Image Optimization Strategies 2024: AVIF, WebP, and Beyond" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Images 계정 for over half of the typical webpage&amp;rsquo;s total weight. As web applications grow more visual, optimizing image delivery has become critical for 성능, user experience, and Core Web Vitals scores. This article explores modern image 최적화 strategies, from next-generation formats to 반응형 delivery techniques.&lt;/p&gt;
&lt;h2 id="image-formats-in-2024"&gt;Image Formats in 2024
&lt;/h2&gt;&lt;p&gt;The image format landscape has shifted dramatically. Three modern formats now compete for dominance alongside legacy JPEG and PNG.&lt;/p&gt;</description></item><item><title>CSS Scroll-Driven Animations: The Future of Scroll-Based Effects</title><link>https://takao.blog/ko/web/css-scroll-driven-animations/</link><pubDate>Tue, 25 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-scroll-driven-animations/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-scroll-driven-animations-ko.png" alt="Featured image of post CSS Scroll-Driven Animations: The Future of Scroll-Based Effects" /&gt;&lt;h2 id="the-problem-with-javascript-scroll-events"&gt;The Problem with JavaScript Scroll Events
&lt;/h2&gt;&lt;p&gt;Scroll-based effects have traditionally relied on JavaScript scroll event listeners running on the main thread, which often causes jank, dropped frames, and poor user experience. Even with passive listeners and &lt;code&gt;requestAnimationFrame&lt;/code&gt; throttling, layout thrashing remains a persistent issue. CSS Scroll-Driven Animations solve this by moving scroll tracking to the compositor thread, enabling smooth 60fps effects without any JavaScript overhead.&lt;/p&gt;
&lt;h2 id="key-concepts"&gt;Key Concepts
&lt;/h2&gt;&lt;p&gt;Three core concepts power this 기능. A &lt;strong&gt;scroll-timeline&lt;/strong&gt; links an animation to the scroll position of a scroll container. A &lt;strong&gt;view-timeline&lt;/strong&gt; ties an animation to an element&amp;rsquo;s visibility within a scroll container. The &lt;strong&gt;animation-timeline&lt;/strong&gt; property binds a named animation to either timeline type. Use &lt;code&gt;timeline-scope&lt;/code&gt; to share timelines across elements in the DOM tree.&lt;/p&gt;</description></item><item><title>Managing SSH Keys with Vaultwarden and Bitwarden SSH Agent</title><link>https://takao.blog/ko/web/vaultwarden-ssh-key/</link><pubDate>Thu, 20 Jun 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/ko/web/vaultwarden-ssh-key/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vaultwarden-ssh-key-ko.png" alt="Featured image of post Managing SSH Keys with Vaultwarden and Bitwarden SSH Agent" /&gt;&lt;h2 id="why-store-ssh-keys-in-a-비밀번호-manager"&gt;Why Store SSH Keys in a 비밀번호 Manager
&lt;/h2&gt;&lt;p&gt;SSH keys are the gold standard for authenticating to remote servers, Git providers, and internal infrastructure. Yet most developers store them as plain files under &lt;code&gt;~/.ssh/&lt;/code&gt; — unprotected, unsynced, and unaudited. Moving SSH keys into Vaultwarden (or Bitwarden) solves three fundamental problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Centralized management&lt;/strong&gt;: All keys live in one vault, not scattered across machines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-device sync&lt;/strong&gt;: Add a key once; it appears on every device automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit trail&lt;/strong&gt;: Every key access and client operation is logged by the 서버.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Bitwarden SSH agent bridges the gap between a locked-down vault and the day-to-day need to use SSH keys transparently.&lt;/p&gt;</description></item><item><title>Next.js Middleware: Routing, Auth, and Edge Computing</title><link>https://takao.blog/ko/web/nextjs-middleware/</link><pubDate>Tue, 18 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/nextjs-middleware/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-middleware-ko.png" alt="Featured image of post Next.js Middleware: Routing, Auth, and Edge Computing" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Next.js Middleware executes before every request, running at the Edge or serverless region. A single &lt;code&gt;middleware.ts&lt;/code&gt; file at the project root intercepts incoming requests and can redirect, rewrite, manipulate headers, or perform 인증 checks before the request reaches the matched route.&lt;/p&gt;
&lt;p&gt;Middleware is ideal for fast, edge-based decisions that should happen before page rendering. It does not run on static assets or &lt;code&gt;_next/static&lt;/code&gt; by default.&lt;/p&gt;
&lt;h2 id="basic-structure"&gt;Basic Structure
&lt;/h2&gt;&lt;p&gt;The middleware file exports a function that receives &lt;code&gt;NextRequest&lt;/code&gt; and returns &lt;code&gt;NextResponse&lt;/code&gt;, along with a &lt;code&gt;config&lt;/code&gt; object that defines which paths trigger execution.&lt;/p&gt;</description></item><item><title>CSS @layer: Managing Cascade with Layer Architecture</title><link>https://takao.blog/ko/web/css-layer-architecture/</link><pubDate>Tue, 11 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-layer-architecture/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-layer-architecture-ko.png" alt="Featured image of post CSS @layer: Managing Cascade with Layer Architecture" /&gt;&lt;p&gt;If you have ever battled specificity wars in a large CSS project — overriding third-party styles, sprinkling &lt;code&gt;!important&lt;/code&gt; declarations, or restructuring HTML just to win the cascade — &lt;code&gt;@layer&lt;/code&gt; is the solution you have been waiting for. The CSS &lt;code&gt;@layer&lt;/code&gt; at-rule gives developers explicit control over the cascade order, independent of specificity or source order.&lt;/p&gt;
&lt;h2 id="the-cascade-problem-before-layer"&gt;The Cascade Problem Before @layer
&lt;/h2&gt;&lt;p&gt;Before &lt;code&gt;@layer&lt;/code&gt;, cascade management relied entirely on conventions: BEM naming, SMACSS categories, ITCSS architecture. These conventions worked, but they were not enforced by the browser. Third-party CSS could override carefully crafted component styles, and source-order fragility meant that a single &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tag reorder could break an entire design system.&lt;/p&gt;</description></item><item><title>JavaScript Proxy and Reflect API: Metaprogramming Patterns</title><link>https://takao.blog/ko/web/js-proxy-reflect/</link><pubDate>Tue, 04 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/js-proxy-reflect/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-proxy-reflect-ko.png" alt="Featured image of post JavaScript Proxy and Reflect API: Metaprogramming Patterns" /&gt;&lt;p&gt;JavaScript&amp;rsquo;s &lt;code&gt;Proxy&lt;/code&gt; and &lt;code&gt;Reflect&lt;/code&gt; APIs are among the most powerful metaprogramming tools available in the language. They allow developers to intercept and 커스터마이즈 fundamental operations on objects — property access, assignment, enumeration, function invocation, and even constructor calls. This article explores all 13 proxy traps, the complementary &lt;code&gt;Reflect&lt;/code&gt; API, and real-world patterns used in production frameworks like Vue 3, MobX, and Immer.&lt;/p&gt;
&lt;h2 id="understanding-the-proxy-pattern"&gt;Understanding the Proxy Pattern
&lt;/h2&gt;&lt;p&gt;A &lt;code&gt;Proxy&lt;/code&gt; wraps a target object and intercepts operations via handler functions called traps:&lt;/p&gt;</description></item><item><title>AI Code Review Tools in 2024: Boosting Development Quality</title><link>https://takao.blog/ko/web/ai-code-review-tools/</link><pubDate>Tue, 28 May 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/ai-code-review-tools/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ai-code-review-tools-ko.png" alt="Featured image of post AI Code Review Tools in 2024: Boosting Development Quality" /&gt;&lt;p&gt;Code review remains one of the most effective practices for improving software quality, yet it is time-consuming and subject to human fatigue. In 2024, AI-powered code review tools have matured significantly, offering automated analysis that complements human reviewers. This article surveys the leading tools, their capabilities, integration patterns, and guidance for incorporating them into development workflows.&lt;/p&gt;
&lt;h2 id="github-copilot-code-review"&gt;GitHub Copilot Code Review
&lt;/h2&gt;&lt;p&gt;GitHub Copilot&amp;rsquo;s code review capabilities extend well beyond inline code completion. The Copilot Chat integration provides pull request-level analysis including automated summaries of changes, specific improvement recommendations with code examples, security vulnerability identification within diffs, and consistency checks against project conventions. You can trigger a Copilot review directly from the CLI:&lt;/p&gt;</description></item><item><title>Proxmox LXC Containers: Complete Management Guide</title><link>https://takao.blog/ko/web/proxmox-lxc-containers/</link><pubDate>Wed, 22 May 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/ko/web/proxmox-lxc-containers/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-lxc-containers-ko.png" alt="Featured image of post Proxmox LXC Containers: Complete Management Guide" /&gt;&lt;h2 id="what-is-lxc"&gt;What is LXC?
&lt;/h2&gt;&lt;p&gt;LXC (Linux Containers) is an OS-level virtualization method that runs multiple isolated Linux systems on a single host using a shared kernel. Unlike full virtual machines, LXC containers share the host OS kernel while maintaining their own filesystem, processes, and 네트워크 stack. This design makes them extremely lightweight and fast to start.&lt;/p&gt;
&lt;h2 id="lxc-vs-virtual-machines"&gt;LXC vs Virtual Machines
&lt;/h2&gt;&lt;p&gt;The choice between LXC containers and VMs depends on your isolation and 성능 requirements:&lt;/p&gt;</description></item><item><title>Git Squash Merge: Clean History Strategies for Teams</title><link>https://takao.blog/ko/web/git-squash-merge/</link><pubDate>Tue, 21 May 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-squash-merge/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-squash-merge-ko.png" alt="Featured image of post Git Squash Merge: Clean History Strategies for Teams" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Git history is a communication tool for your team and your future self. A clean, readable history makes debugging, code review, and release management significantly easier. Squash merge is one of the primary strategies for maintaining a clean history, but knowing when and how to use it—and when to choose alternatives—requires understanding the trade-offs involved. This article provides a comprehensive 가이드 to squash merge strategies for teams.&lt;/p&gt;</description></item><item><title>WebSocket for Real-Time Applications: Complete Guide</title><link>https://takao.blog/ko/web/websocket-applications/</link><pubDate>Tue, 14 May 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/websocket-applications/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/websocket-applications-ko.png" alt="Featured image of post WebSocket for Real-Time Applications: Complete Guide" /&gt;&lt;p&gt;Real-time functionality has become a baseline expectation for modern web applications. WebSocket provides full-duplex communication channels over a single TCP 연결, enabling low-latency data 거래소 between client and 서버. This 가이드 covers the WebSocket protocol, implementation patterns, scaling strategies, and practical considerations for building production-grade real-time applications.&lt;/p&gt;
&lt;h2 id="websocket-protocol-overview"&gt;WebSocket Protocol Overview
&lt;/h2&gt;&lt;p&gt;WebSocket begins with an HTTP 업그레이드 handshake. The client sends an HTTP request with an &lt;code&gt;Upgrade: websocket&lt;/code&gt; header, and the 서버 responds with &lt;code&gt;101 Switching Protocols&lt;/code&gt; to establish the 연결. Once established, the 연결 transitions from HTTP to the WebSocket protocol on the same underlying TCP socket.&lt;/p&gt;</description></item><item><title>API Rate Limiting Strategies: Protecting Your Services</title><link>https://takao.blog/ko/web/api-rate-limiting/</link><pubDate>Tue, 07 May 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/api-rate-limiting/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/api-rate-limiting-ko.png" alt="Featured image of post API Rate Limiting Strategies: Protecting Your Services" /&gt;&lt;p&gt;Rate limiting is a critical component of any production API. It protects backend services from abuse, ensures fair resource allocation, maintains 성능 under load, and mitigates denial-of-service attacks. This article examines the major rate limiting algorithms, their trade-offs, and best practices for designing robust systems.&lt;/p&gt;
&lt;h2 id="token-bucket-algorithm"&gt;Token Bucket Algorithm
&lt;/h2&gt;&lt;p&gt;The token bucket is one of the most widely used rate limiting algorithms. A bucket holds tokens that refill at a steady rate, and each request consumes one token. If the bucket is empty, the request is denied. This approach allows bursts up to the bucket capacity while smoothing traffic over time.&lt;/p&gt;</description></item><item><title>LLM Prompt Engineering: A Developer's Practical Guide</title><link>https://takao.blog/ko/web/llm-prompt-engineering/</link><pubDate>Tue, 30 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/llm-prompt-engineering/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/llm-prompt-engineering-ko.png" alt="Featured image of post LLM Prompt Engineering: A Developer's Practical Guide" /&gt;&lt;p&gt;Prompt engineering has become an essential skill for developers building applications with large language models. As LLMs integrate deeper into software products, effective prompt design directly impacts output quality, reliability, and cost. This article provides a practical, developer-focused 가이드 to prompt engineering techniques that work in production.&lt;/p&gt;
&lt;h2 id="prompt-structure-fundamentals"&gt;Prompt Structure Fundamentals
&lt;/h2&gt;&lt;p&gt;A well-structured prompt follows a consistent architecture: system message (behavior and persona), context (background information), task description (what the model should do), examples (few-shot demonstrations), input (the actual data), and output format (expected response structure).&lt;/p&gt;</description></item><item><title>Node.js Worker Threads: Parallel Processing in Practice</title><link>https://takao.blog/ko/web/nodejs-worker-threads/</link><pubDate>Tue, 23 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/nodejs-worker-threads/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-worker-threads-ko.png" alt="Featured image of post Node.js Worker Threads: Parallel Processing in Practice" /&gt;&lt;p&gt;Node.js has traditionally been single-threaded, relying on asynchronous I/O for concurrency. While this model excels at I/O-bound workloads, CPU-intensive operations block the event loop and degrade application responsiveness. Worker Threads, stabilized in Node.js 12, provide true parallel execution within a single process by running JavaScript in separate V8 isolates. This article covers practical patterns for using worker threads in production.&lt;/p&gt;
&lt;h2 id="worker-lifecycle-and-communication"&gt;Worker Lifecycle and Communication
&lt;/h2&gt;&lt;p&gt;Creating a worker requires a separate JavaScript file that executes in its own V8 isolate with its own heap and event loop.&lt;/p&gt;</description></item><item><title>GitHub Actions Advanced: Workflows Beyond CI/CD Basics</title><link>https://takao.blog/ko/web/github-actions-advanced/</link><pubDate>Tue, 16 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/github-actions-advanced/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/github-actions-advanced-ko.png" alt="Featured image of post GitHub Actions Advanced: Workflows Beyond CI/CD Basics" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;GitHub Actions has evolved from a simple CI/CD tool into a comprehensive automation platform. While basic workflows are well-documented, the platform&amp;rsquo;s advanced 기능—reusable workflows, composite actions, matrix strategies, and 배포 patterns—enable sophisticated automation pipelines. This article explores these advanced capabilities for teams building complex CI/CD systems.&lt;/p&gt;</description></item><item><title>CSS Custom Properties: Strategic Patterns for Scalable Styles</title><link>https://takao.blog/ko/web/css-custom-properties/</link><pubDate>Tue, 09 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-custom-properties/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-custom-properties-ko.png" alt="Featured image of post CSS Custom Properties: Strategic Patterns for Scalable Styles" /&gt;&lt;p&gt;CSS Custom Properties (also known as CSS variables) have fundamentally changed how we write and maintain stylesheets. Unlike preprocessor variables from Sass or Less, custom properties are live, dynamic, and participate in the cascade and inheritance. This article explores strategic patterns for using them in production applications — from design token management to runtime manipulation.&lt;/p&gt;
&lt;h2 id="design-token-management"&gt;Design Token Management
&lt;/h2&gt;&lt;p&gt;Custom properties are the ideal vehicle for design tokens — the atomic values that define a design system&amp;rsquo;s visual language. A well-organized token structure groups colors, spacing, typography, and shadows under a clear naming convention.&lt;/p&gt;</description></item><item><title>WebAuthn and Passkeys: Passwordless Authentication in 2024</title><link>https://takao.blog/ko/web/webauthn-passkeys/</link><pubDate>Tue, 02 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/webauthn-passkeys/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/webauthn-passkeys-ko.png" alt="Featured image of post WebAuthn and Passkeys: Passwordless Authentication in 2024" /&gt;&lt;p&gt;Passwords have been the primary 인증 mechanism for decades, but they come with well-documented security and usability problems. WebAuthn (Web 인증) and the emerging 패스키 ecosystem promise to replace passwords with cryptographically secure, phishing-resistant 인증. As of 2024, 패스키 support has reached critical mass across all major platforms, making this the ideal time to implement 비밀번호 없는 인증.&lt;/p&gt;</description></item><item><title>Next.js Image Optimization: From Setup to Advanced Patterns</title><link>https://takao.blog/ko/web/nextjs-image-optimization/</link><pubDate>Tue, 26 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/nextjs-image-optimization/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-image-optimization-ko.png" alt="Featured image of post Next.js Image Optimization: From Setup to Advanced Patterns" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Images 계정 for over 50% of total webpage bytes on average, making 최적화 essential for 성능. Next.js provides a comprehensive image 최적화 pipeline through the &lt;code&gt;next/image&lt;/code&gt; component and its built-in Image 최적화 API. This article covers setup, configuration, and advanced patterns with a focus on Core Web Vitals impact.&lt;/p&gt;
&lt;h2 id="the-nextimage-component"&gt;The next/image Component
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;next/image&lt;/code&gt; component extends the HTML &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element with automatic 최적화 기능: lazy loading, 반응형 srcset generation, width and height enforcement to prevent Cumulative Layout Shift, blur-up placeholders, and automatic format negotiation.&lt;/p&gt;</description></item><item><title>React State Management in 2024: Choosing the Right Tool</title><link>https://takao.blog/ko/web/react-state-management-2024/</link><pubDate>Tue, 19 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/react-state-management-2024/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-state-management-2024-ko.png" alt="Featured image of post React State Management in 2024: Choosing the Right Tool" /&gt;&lt;p&gt;By 2024, React&amp;rsquo;s state management landscape has matured to the point where choosing the right tool is a matter of understanding state categories rather than picking a winner. The core library provides &lt;code&gt;useState&lt;/code&gt; and &lt;code&gt;useReducer&lt;/code&gt; for local concerns, while the ecosystem offers specialized solutions for global UI state and 서버 state. The key insight is that different categories of state benefit from different tools, and mixing them appropriately produces the most maintainable applications.&lt;/p&gt;</description></item><item><title>Vaultwarden: Self-Hosted Password Manager Installation Guide</title><link>https://takao.blog/ko/web/vaultwarden-install/</link><pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/ko/web/vaultwarden-install/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vaultwarden-install-ko.png" alt="Featured image of post Vaultwarden: Self-Hosted Password Manager Installation Guide" /&gt;&lt;h2 id="what-is-vaultwarden"&gt;What is Vaultwarden?
&lt;/h2&gt;&lt;p&gt;Vaultwarden is an open-source, self-hosted implementation of the Bitwarden 서버 API, written in Rust. It is designed to be lightweight and resource-efficient compared to the official Bitwarden 서버, which requires a Microsoft SQL 서버 database and substantial system resources. Vaultwarden supports all official Bitwarden clients — 데스크탑, browser extensions, mobile apps, and CLI — without any modification.&lt;/p&gt;
&lt;p&gt;By self-hosting Vaultwarden, you retain full control over your 비밀번호 data. No third-party service ever touches your encrypted vault. The project is mature, actively maintained, and suitable for both single-user deployments and small teams.&lt;/p&gt;</description></item><item><title>ES2024 New Features: What's Coming in JavaScript</title><link>https://takao.blog/ko/web/es2024-new-features/</link><pubDate>Tue, 12 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/es2024-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/es2024-new-features-ko.png" alt="Featured image of post ES2024 New Features: What's Coming in JavaScript" /&gt;&lt;p&gt;ECMAScript 2024 (ES15) introduces several long-anticipated 기능 to JavaScript. This article covers the new capabilities with practical examples and guidance on adoption timelines.&lt;/p&gt;
&lt;h2 id="array-grouping-objectgroupby-and-mapgroupby"&gt;Array Grouping: Object.groupBy and Map.groupBy
&lt;/h2&gt;&lt;p&gt;One of the most requested JavaScript 기능 has finally arrived. &lt;code&gt;Object.groupBy&lt;/code&gt; and &lt;code&gt;Map.groupBy&lt;/code&gt; partition array elements into groups based on a callback:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;inventory&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;asparagus&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;vegetables&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;quantity&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bananas&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fruit&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;quantity&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;goat&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;meat&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;quantity&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;23&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;byType&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Object.&lt;span style="color:#a6e22e"&gt;groupBy&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;inventory&lt;/span&gt;, ({ &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt; }) =&amp;gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// { vegetables: [{ name: &amp;#34;asparagus&amp;#34;, ... }],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// fruit: [{ name: &amp;#34;bananas&amp;#34;, ... }],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// meat: [{ name: &amp;#34;goat&amp;#34;, ... }] }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Map.groupBy&lt;/code&gt; preserves non-string keys, making it ideal for grouping by objects or symbols. This eliminates the need for external libraries or manual &lt;code&gt;reduce&lt;/code&gt; patterns.&lt;/p&gt;</description></item><item><title>TypeScript Generic Constraints: Building Type-Safe APIs</title><link>https://takao.blog/ko/web/typescript-generic-constraints/</link><pubDate>Tue, 05 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-generic-constraints/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-generic-constraints-ko.png" alt="Featured image of post TypeScript Generic Constraints: Building Type-Safe APIs" /&gt;&lt;p&gt;TypeScript generics let you write reusable, type-safe code, but without constraints they are too permissive. The &lt;code&gt;extends&lt;/code&gt; keyword restricts type parameters to shapes that have specific properties, giving you both flexibility and safety.&lt;/p&gt;
&lt;h2 id="the-extends-constraint"&gt;The extends Constraint
&lt;/h2&gt;&lt;p&gt;The foundation of generic constraints is the &lt;code&gt;extends&lt;/code&gt; keyword. It ensures a type parameter satisfies a required structure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;function getProperty&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;T, K &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; keyof T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(obj: T, key: K): T[K] {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; obj[key];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here &lt;code&gt;K extends keyof T&lt;/code&gt; guarantees &lt;code&gt;key&lt;/code&gt; is a valid property of &lt;code&gt;obj&lt;/code&gt;. Attempting to pass an invalid key triggers a compile-time error. Common patterns include constraining to interfaces (&lt;code&gt;T extends { id: string }&lt;/code&gt;), union members, or primitive types.&lt;/p&gt;</description></item><item><title>ESLint Flat Config: Migration Guide from Legacy .eslintrc</title><link>https://takao.blog/ko/web/eslint-flat-config/</link><pubDate>Mon, 26 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/eslint-flat-config/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/eslint-flat-config-ko.png" alt="Featured image of post ESLint Flat Config: Migration Guide from Legacy .eslintrc" /&gt;&lt;p&gt;ESLint v9.0, released in 2024, made the flat config system (&lt;code&gt;eslint.config.js&lt;/code&gt;) the default, replacing the legacy &lt;code&gt;.eslintrc&lt;/code&gt; format that had been in use for over a decade. This migration 가이드 covers the complete transition process, new concepts, and practical examples.&lt;/p&gt;
&lt;h2 id="why-flat-config"&gt;Why Flat Config?
&lt;/h2&gt;&lt;p&gt;The legacy &lt;code&gt;.eslintrc&lt;/code&gt; system had several problems: configuration cascading made behavior unpredictable, directory-based 해상도 was complex, JSON/YAML lacked support for functions and comments, and shareable configs were difficult to compose. Flat config addresses these with a single configuration file, explicit composition via JavaScript arrays, simplified plugin 해상도, and full JavaScript-native syntax.&lt;/p&gt;</description></item><item><title>JavaScript Event Loop Deep Dive: Microtasks, Macrotasks, and Beyond</title><link>https://takao.blog/ko/web/js-event-loop/</link><pubDate>Mon, 19 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/js-event-loop/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-event-loop-ko.png" alt="Featured image of post JavaScript Event Loop Deep Dive: Microtasks, Macrotasks, and Beyond" /&gt;&lt;p&gt;The JavaScript event loop is one of the most important yet misunderstood concepts in the language. Despite JavaScript being single-threaded, its event loop enables non-blocking concurrency through a sophisticated queue system. This article builds a complete mental model of how JavaScript handles asynchronous execution, from the call stack to the microtask queue and everything in between.&lt;/p&gt;
&lt;h2 id="the-call-stack-and-execution-model"&gt;The Call Stack and Execution Model
&lt;/h2&gt;&lt;p&gt;JavaScript uses a call stack with a LIFO (Last In, First Out) structure. When a function is called, a new stack frame is pushed onto the stack. When the function returns, the frame is popped off. The key principle is run-to-completion: each function runs to completion before any other code can interrupt it.&lt;/p&gt;</description></item><item><title>Proxmox VE VM Management: From Creation to Optimization</title><link>https://takao.blog/ko/web/proxmox-vm-management/</link><pubDate>Sun, 18 Feb 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/ko/web/proxmox-vm-management/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-vm-management-ko.png" alt="Featured image of post Proxmox VE VM Management: From Creation to Optimization" /&gt;&lt;h2 id="creating-a-vm-step-by-step"&gt;Creating a VM Step by Step
&lt;/h2&gt;&lt;p&gt;Proxmox VE provides a guided wizard for VM creation accessible from the web UI at &lt;strong&gt;Create VM&lt;/strong&gt; or via the &lt;code&gt;qm&lt;/code&gt; CLI tool. The wizard walks through eight configuration pages.&lt;/p&gt;
&lt;h3 id="general"&gt;General
&lt;/h3&gt;&lt;p&gt;Set a unique VM ID (an integer, typically starting at 100) and a descriptive name. The name does not affect guest networking — it is purely for identification. Optionally, select a resource pool to organize related VMs.&lt;/p&gt;</description></item><item><title>Service Workers: Advanced Offline Strategies for Web Apps</title><link>https://takao.blog/ko/web/service-workers-offline/</link><pubDate>Mon, 12 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/service-workers-offline/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/service-workers-offline-ko.png" alt="Featured image of post Service Workers: Advanced Offline Strategies for Web Apps" /&gt;&lt;p&gt;Service workers are the foundation of offline-capable progressive web apps. With browser support now universal across Chrome, Firefox, Safari, and Edge, building resilient offline experiences is a production requirement, not a progressive enhancement. This 가이드 covers advanced strategies for caching, synchronization, and offline-first architecture.&lt;/p&gt;
&lt;h2 id="service-worker-lifecycle-and-fundamentals"&gt;Service Worker Lifecycle and Fundamentals
&lt;/h2&gt;&lt;p&gt;A service worker goes through three key events: &lt;code&gt;install&lt;/code&gt;, &lt;code&gt;activate&lt;/code&gt;, and &lt;code&gt;fetch&lt;/code&gt;. During 설치, you pre-cache static assets. Activation handles cleanup of old caches. Every fetch request passes through the worker, giving you full control over the response.&lt;/p&gt;</description></item><item><title>Vite Plugin Development: From Zero to Production</title><link>https://takao.blog/ko/web/vite-plugin-dev/</link><pubDate>Mon, 05 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/vite-plugin-dev/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vite-plugin-dev-ko.png" alt="Featured image of post Vite Plugin Development: From Zero to Production" /&gt;&lt;p&gt;Vite&amp;rsquo;s plugin system is one of its most powerful 기능, allowing developers to extend and 커스터마이즈 the build pipeline. Whether you need to transform file types, inject build-time constants, or integrate with other tools, the Vite plugin API gives you full control.&lt;/p&gt;
&lt;h2 id="understanding-vites-plugin-system"&gt;Understanding Vite&amp;rsquo;s Plugin System
&lt;/h2&gt;&lt;p&gt;Vite plugins are objects with hook functions that execute at specific points in the build lifecycle. Plugins operate in three phases: serve (dev 서버), build (production), and SSR. A basic plugin looks like this:&lt;/p&gt;</description></item><item><title>OAuth 2.0 and OpenID Connect: Modern Authentication Guide</title><link>https://takao.blog/ko/web/oauth-oidc/</link><pubDate>Mon, 29 Jan 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/oauth-oidc/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/oauth-oidc-ko.png" alt="Featured image of post OAuth 2.0 and OpenID Connect: Modern Authentication Guide" /&gt;&lt;p&gt;OAuth 2.0 and OpenID Connect form the backbone of modern web 인증 and authorization. Despite their ubiquity, these protocols are frequently misunderstood and misconfigured, leading to preventable security vulnerabilities. This 가이드 covers the core concepts, implementation patterns, and security best practices you need to integrate 인증 securely in your applications.&lt;/p&gt;
&lt;h2 id="oauth-20-fundamentals"&gt;OAuth 2.0 Fundamentals
&lt;/h2&gt;&lt;p&gt;OAuth 2.0 is an authorization framework, not an 인증 protocol. This distinction is critical: OAuth defines how a client application can obtain delegated access to protected resources, but it does not specify how to verify the user&amp;rsquo;s identity. That is where OpenID Connect comes in.&lt;/p&gt;</description></item><item><title>Git Submodules: Managing Nested Repositories Effectively</title><link>https://takao.blog/ko/web/git-submodules/</link><pubDate>Mon, 22 Jan 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/git-submodules/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-submodules-ko.png" alt="Featured image of post Git Submodules: Managing Nested Repositories Effectively" /&gt;&lt;p&gt;Git submodules allow you to nest one Git repository inside another while maintaining independent 버전 control for each. They are useful for managing shared libraries, third-party dependencies, or configuration collections where you need precise commit-level control. However, submodules come with complexity that requires understanding their underlying mechanics.&lt;/p&gt;
&lt;h2 id="understanding-git-submodules"&gt;Understanding Git Submodules
&lt;/h2&gt;&lt;p&gt;A submodule is a reference from your parent repository to a specific commit in another repository. Git stores this as a tree object in the parent&amp;rsquo;s index, and the mapping of submodule paths to repository URLs lives in a &lt;code&gt;.gitmodules&lt;/code&gt; file at the root of the parent repository.&lt;/p&gt;</description></item><item><title>Core Web Vitals Optimization: Complete 2024 Guide</title><link>https://takao.blog/ko/web/core-web-vitals/</link><pubDate>Mon, 15 Jan 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/core-web-vitals/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/core-web-vitals-ko.png" alt="Featured image of post Core Web Vitals Optimization: Complete 2024 Guide" /&gt;&lt;p&gt;Core Web Vitals (CWV) are the set of user-centric 성능 metrics that Google uses to measure real-world experience on the web. In March 2024, Google replaced First Input Delay (FID) with Interaction to Next Paint (INP), making it critical to understand all three metrics: Largest Contentful Paint (LCP), INP, and Cumulative Layout Shift (CLS). This 가이드 covers every aspect of optimizing your site for good CWV scores.&lt;/p&gt;</description></item><item><title>React Server Components: The Future of Web Rendering</title><link>https://takao.blog/ko/web/react-server-components/</link><pubDate>Mon, 08 Jan 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/react-server-components/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-server-components-ko.png" alt="Featured image of post React Server Components: The Future of Web Rendering" /&gt;&lt;p&gt;React 서버 Components (RSC) represent a paradigm shift in how React applications render. Components run exclusively on the 서버, sending zero JavaScript to the client. This is not the same as 서버-Side Rendering (SSR), which renders components on the 서버 but still sends all the JavaScript for them to the client for hydration. RSC produces a special serialized format — the RSC payload — that the React reconciler on the client uses to reconstruct the component tree without executing the component code.&lt;/p&gt;</description></item><item><title>Docker Health Checks and Container Monitoring Best Practices</title><link>https://takao.blog/ko/web/docker-health-checks/</link><pubDate>Mon, 25 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/docker-health-checks/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-health-checks-ko.png" alt="Featured image of post Docker Health Checks and Container Monitoring Best Practices" /&gt;&lt;p&gt;Docker health checks are essential for building self-healing container infrastructure. They enable automatic detection of application failures and trigger container restarts, ensuring your services remain available. This 가이드 covers everything from basic &lt;code&gt;HEALTHCHECK&lt;/code&gt; implementation to advanced production patterns.&lt;/p&gt;
&lt;h2 id="the-healthcheck-instruction"&gt;The HEALTHCHECK Instruction
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;HEALTHCHECK&lt;/code&gt; instruction in a Dockerfile tells Docker how to test whether a container is still working correctly:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HEALTHCHECK&lt;/span&gt; --interval&lt;span style="color:#f92672"&gt;=&lt;/span&gt;30s --timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;3s --start-period&lt;span style="color:#f92672"&gt;=&lt;/span&gt;40s --retries&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CMD curl -f http://localhost:3000/health &lt;span style="color:#f92672"&gt;||&lt;/span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker tracks three states: &lt;code&gt;starting&lt;/code&gt; (during the start period), &lt;code&gt;healthy&lt;/code&gt; (checks pass), and &lt;code&gt;unhealthy&lt;/code&gt; (checks fail after retries). The &lt;code&gt;--start-period&lt;/code&gt; is critical for applications with slow startup times &amp;ndash; it suppresses failures during initialization.&lt;/p&gt;</description></item><item><title>Node.js Streams: Practical Guide for Data Processing</title><link>https://takao.blog/ko/web/nodejs-streams/</link><pubDate>Wed, 20 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/nodejs-streams/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-streams-ko.png" alt="Featured image of post Node.js Streams: Practical Guide for Data Processing" /&gt;&lt;p&gt;Node.js streams are one of the most powerful yet underutilized 기능 of the platform. They enable processing data piece by piece as it arrives, rather than loading entire datasets into memory. This makes them essential for working with large files, 네트워크 communication, and real-time data transformation. This 가이드 covers stream fundamentals and practical patterns for building robust data pipelines.&lt;/p&gt;
&lt;h2 id="understanding-stream-types"&gt;Understanding Stream Types
&lt;/h2&gt;&lt;p&gt;Node.js provides four fundamental stream types, each serving a distinct role in data processing pipelines.&lt;/p&gt;</description></item><item><title>CSS Grid Advanced Patterns: Complex Layouts Made Simple</title><link>https://takao.blog/ko/web/css-grid-advanced/</link><pubDate>Fri, 15 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/css-grid-advanced/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-grid-advanced-ko.png" alt="Featured image of post CSS Grid Advanced Patterns: Complex Layouts Made Simple" /&gt;&lt;p&gt;CSS Grid has transformed web layout design, but many developers only scratch the surface. Beyond the basic &lt;code&gt;grid-template-columns: 1fr 1fr 1fr&lt;/code&gt; lies a powerful set of 기능 that handle complex, 반응형 layouts with minimal code. This article explores advanced Grid patterns that every professional front-end developer should know.&lt;/p&gt;
&lt;h2 id="named-grid-areas-for-semantic-layouts"&gt;Named Grid Areas for Semantic Layouts
&lt;/h2&gt;&lt;p&gt;Line-based placement works, but it becomes unreadable as layouts grow complex. Named grid areas let you define layouts that read like a wireframe directly in CSS.&lt;/p&gt;</description></item><item><title>TypeScript Utility Types: Complete Guide with Real Examples</title><link>https://takao.blog/ko/web/typescript-utility-types/</link><pubDate>Sun, 10 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/typescript-utility-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-utility-types-ko.png" alt="Featured image of post TypeScript Utility Types: Complete Guide with Real Examples" /&gt;&lt;p&gt;TypeScript provides a rich set of built-in utility types that transform and manipulate other types. Understanding these tools lets you write more expressive and type-safe code without reinventing the wheel.&lt;/p&gt;
&lt;h2 id="property-modification-types"&gt;Property Modification Types
&lt;/h2&gt;&lt;p&gt;These types modify the optionality, mutability, and requirement of object properties:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;interface User {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id: number;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: string;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; email?: string;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;type PartialUser = Partial&amp;lt;User&amp;gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// { id?: number; name?: string; email?: string; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;type RequiredUser = Required&amp;lt;User&amp;gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// { id: number; name: string; email: string; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;type ImmutableUser = Readonly&amp;lt;User&amp;gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// { readonly id: number; readonly name: string; readonly email?: string; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Effect&lt;/th&gt;
					&lt;th&gt;Common Use&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Partial&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All properties optional&lt;/td&gt;
					&lt;td&gt;패치 request bodies&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Required&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All properties required&lt;/td&gt;
					&lt;td&gt;Form submission validation&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Readonly&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All properties read-only&lt;/td&gt;
					&lt;td&gt;Configuration objects&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;Partial&lt;/code&gt; is especially useful for API 업데이트 operations where clients should be able to send a subset of fields:&lt;/p&gt;</description></item><item><title>Advanced JavaScript Promise Patterns: Async Control Flow Mastery</title><link>https://takao.blog/ko/web/js-promise-patterns/</link><pubDate>Tue, 05 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/js-promise-patterns/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-promise-patterns-ko.png" alt="Featured image of post Advanced JavaScript Promise Patterns: Async Control Flow Mastery" /&gt;&lt;p&gt;Promises are fundamental to modern JavaScript, but mastering asynchronous control flow requires going beyond basic &lt;code&gt;.then()&lt;/code&gt; chains. This article explores advanced Promise patterns that intermediate to senior developers need for production applications, from concurrency control to error handling and cancellation.&lt;/p&gt;
&lt;h2 id="the-promise-landscape-beyond-basics"&gt;The Promise Landscape Beyond Basics
&lt;/h2&gt;&lt;p&gt;JavaScript provides four static methods on Promise for composing async operations, each suited to different scenarios:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Method&lt;/th&gt;
					&lt;th&gt;Resolves When&lt;/th&gt;
					&lt;th&gt;Rejects When&lt;/th&gt;
					&lt;th&gt;Use Case&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.all&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All promises resolve&lt;/td&gt;
					&lt;td&gt;Any promise rejects&lt;/td&gt;
					&lt;td&gt;Parallel API calls, all required&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.allSettled&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All promises settle&lt;/td&gt;
					&lt;td&gt;Never&lt;/td&gt;
					&lt;td&gt;Mixed results, log all outcomes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.race&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;First promise settles&lt;/td&gt;
					&lt;td&gt;First promise rejects&lt;/td&gt;
					&lt;td&gt;Timeout race conditions&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.any&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;First promise resolves&lt;/td&gt;
					&lt;td&gt;All promises reject&lt;/td&gt;
					&lt;td&gt;First-successful-response pattern&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;results&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; Promise.&lt;span style="color:#a6e22e"&gt;allSettled&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/users&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;()),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/posts&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;()),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/comments&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;()),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;successful&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;results&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fulfilled&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Promise.allSettled&lt;/code&gt; is particularly useful when you need to process partial results even if some operations fail, such as batch data synchronization where individual record failures should not abort the entire batch.&lt;/p&gt;</description></item><item><title>Cloudflare Pages: Static Site Hosting Guide</title><link>https://takao.blog/ko/web/cloudflare-pages/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/cloudflare-pages/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-cloudflare-pages-ko.png" alt="Featured image of post Cloudflare Pages: Static Site Hosting Guide" /&gt;&lt;h1 id="cloudflare-pages-static-site-hosting-for-modern-websites"&gt;Cloudflare Pages: Static Site Hosting for Modern Websites
&lt;/h1&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Cloudflare Pages is a static site hosting platform built on top of Cloudflare&amp;rsquo;s global 네트워크 infrastructure. It combines the speed of a world-class CDN with an intuitive 배포 pipeline, making it an excellent choice for developers who want to focus on building rather than configuring servers. From portfolio sites to full-featured web applications, Cloudflare Pages handles the heavy lifting of content delivery, SSL termination, and scaling — all with a generous free tier. This 가이드 walks through every step of 설정 up and optimizing a site on Cloudflare Pages.&lt;/p&gt;</description></item><item><title>Cloudflare Setup Guide: Security and Performance</title><link>https://takao.blog/ko/web/cloudflare/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/cloudflare/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-cloudflare-ko.png" alt="Featured image of post Cloudflare Setup Guide: Security and Performance" /&gt;&lt;h1 id="cloudflare-setup-improving-website-security-and-성능"&gt;Cloudflare Setup: Improving Website Security and 성능
&lt;/h1&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For any website owner, security and speed are two sides of the same coin. A slow site frustrates visitors and hurts conversions; an insecure site puts data and reputation at risk. Cloudflare addresses both challenges with an integrated platform that sits between your visitors and your origin 서버, acting as a reverse proxy, content delivery 네트워크, and security gateway all at once. This 가이드 walks through configuring Cloudflare&amp;rsquo;s core 기능 — from basic DNS setup to advanced security rules — so you can protect and accelerate your site with confidence.&lt;/p&gt;</description></item><item><title>Proxmox VE Installation and Initial Setup Guide</title><link>https://takao.blog/ko/web/proxmox-install-setup/</link><pubDate>Wed, 15 Nov 2023 00:00:00 +0000</pubDate><guid>https://takao.blog/ko/web/proxmox-install-setup/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-install-setup-ko.png" alt="Featured image of post Proxmox VE Installation and Initial Setup Guide" /&gt;&lt;h2 id="what-is-proxmox-ve"&gt;What is Proxmox VE?
&lt;/h2&gt;&lt;p&gt;Proxmox Virtual Environment (Proxmox VE) is an open-source 서버 virtualization platform that combines KVM-based virtual machines and LXC-based containers under a single web 인터페이스. Built on Debian Linux, it integrates enterprise 기능 such as live migration, high availability, software-defined storage, and a built-in firewall. Its agentless design and central management 인터페이스 make it a popular choice for homelabs, small businesses, and data centers alike.&lt;/p&gt;</description></item><item><title>Google Analytics: Implementation and Analytics Guide</title><link>https://takao.blog/ko/web/google-analytics/</link><pubDate>Fri, 20 Oct 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/google-analytics/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-google-analytics-ko.png" alt="Featured image of post Google Analytics: Implementation and Analytics Guide" /&gt;&lt;h1 id="google-analytics-implementation-and-analytics-가이드"&gt;Google Analytics: Implementation and Analytics 가이드
&lt;/h1&gt;&lt;p&gt;Understanding how visitors interact with your website is essential for growth. Google Analytics (GA) is the industry standard for web analytics, providing deep insights into traffic sources, user behavior, and conversion 성능. This 가이드 walks through the complete implementation process, from 계정 creation to advanced 최적화, so you can start making data-driven decisions with confidence.&lt;/p&gt;</description></item><item><title>OWASP ZAP: Web Application Security Testing Guide</title><link>https://takao.blog/ko/web/owasp-zap/</link><pubDate>Fri, 20 Oct 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/owasp-zap/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-owasp-zap-ko.png" alt="Featured image of post OWASP ZAP: Web Application Security Testing Guide" /&gt;&lt;h1 id="owasp-zap-web-application-security-testing-가이드"&gt;OWASP ZAP: Web Application Security Testing 가이드
&lt;/h1&gt;&lt;p&gt;Web application security is no longer optional — it is a fundamental requirement for protecting user data and maintaining trust. OWASP ZAP (Zed Attack Proxy) is one of the most popular open-source security testing tools available. It helps developers and security professionals identify vulnerabilities in web applications through automated scanning and manual testing 기능. This 가이드 covers the full workflow, from 설치 to remediation.&lt;/p&gt;</description></item><item><title>Wayback Machine: Exploring the Internet Archive</title><link>https://takao.blog/ko/web/waybackmachine/</link><pubDate>Mon, 11 Sep 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/waybackmachine/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/wayback-machine-ko.png" alt="Featured image of post Wayback Machine: Exploring the Internet Archive" /&gt;&lt;h1 id="wayback-machine-exploring-the-internet-archive"&gt;Wayback Machine: Exploring the Internet Archive
&lt;/h1&gt;&lt;p&gt;The Wayback Machine is a digital time capsule for the World Wide Web. Operated by the Internet Archive, a non-profit organization founded in 1996, it preserves snapshots of web pages across decades, allowing anyone to travel back in time and see what websites looked like years ago. Whether you are conducting research, recovering lost content, or simply curious about the internet&amp;rsquo;s history, the Wayback Machine is an indispensable tool.&lt;/p&gt;</description></item><item><title>Git Tutorial: From Basics to Advanced Workflows</title><link>https://takao.blog/ko/web/how-to-git/</link><pubDate>Sun, 10 Sep 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/how-to-git/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-git-ko.png" alt="Featured image of post Git Tutorial: From Basics to Advanced Workflows" /&gt;&lt;h1 id="git-튜토리얼-project-management-and-버전-control-fundamentals"&gt;Git 튜토리얼: Project Management and 버전 Control Fundamentals
&lt;/h1&gt;&lt;p&gt;Git is the de facto standard for 버전 control in modern software development. It tracks every change to your codebase, enables seamless team collaboration, and provides safety nets for experimentation. Whether you are a solo developer maintaining a personal project or part of a large engineering team, mastering Git is essential. This 가이드 covers Git from first principles through advanced workflows, with practical commands and real-world scenarios.&lt;/p&gt;</description></item><item><title>GitHub Guide: Collaboration and Project Management</title><link>https://takao.blog/ko/web/how-to-github/</link><pubDate>Sun, 10 Sep 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/how-to-github/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-github-ko.png" alt="Featured image of post GitHub Guide: Collaboration and Project Management" /&gt;&lt;h1 id="github-가이드-collaboration-and-project-management"&gt;GitHub 가이드: Collaboration and Project Management
&lt;/h1&gt;&lt;p&gt;GitHub has become an essential platform for software developers and project managers alike. It combines powerful 버전 control with social coding 기능 that make team collaboration seamless. Whether you are contributing to open-source projects or managing a private team repository, GitHub provides the tools you need to track changes, review code, and automate workflows. This 가이드 walks through everything from 계정 setup to advanced project management.&lt;/p&gt;</description></item><item><title>How to Set Up Hugo: Complete Guide for Beginners</title><link>https://takao.blog/ko/web/hugo-setup/</link><pubDate>Wed, 23 Aug 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/ko/web/hugo-setup/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/hugo-setup-ko.png" alt="Featured image of post How to Set Up Hugo: Complete Guide for Beginners" /&gt;&lt;h1 id="how-to-install-hugo---static-site-generator-설치-instructions"&gt;How to install Hugo - Static Site Generator 설치 Instructions
&lt;/h1&gt;&lt;p&gt;Hugo is a fast and simple static site generator and tool that makes building websites easy. This article details the steps to install Hugo.&lt;/p&gt;
&lt;h2 id="step-1-다운로드-hugo"&gt;Step 1: 다운로드 Hugo
&lt;/h2&gt;&lt;p&gt;To install Hugo, first 다운로드 the appropriate 버전 of the Hugo binary from the official 다운로드 page.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;go to &lt;a class="link" href="https://gohugo.io/getting-started/installing/" target="_blank" rel="noopener"
 &gt;the official Hugo 다운로드 page&lt;/a&gt;. 2.&lt;/li&gt;
&lt;li&gt;select the 설치 method appropriate for your operating system (Windows, macOS, Linux, etc.)&lt;/li&gt;
&lt;li&gt;open a terminal (command prompt) and follow the instructions to 다운로드 the Hugo binary.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="step-2-confirm-설치"&gt;Step 2: Confirm 설치
&lt;/h2&gt;&lt;p&gt;After the Hugo binary has been downloaded, verify that the 설치 was successful. 1.&lt;/p&gt;</description></item></channel></rss>