DevInsight

A developer's field notes

Dev notes

Stuff I ran into while building things

Tech I went back and forth on, problems that only showed up once it shipped. Notes I keep so I don't forget.

💡 Today's Dev Insight

#JOIN#카디널리티#실행계획

Join Performance Is Determined by Key Duplication

The size of a join result is determined not by table row counts but by the duplication of the join key. Overlapping 1:N chains makes intermediate results balloon multiplicatively, spilling past memory to disk, and when the estimated row count in an execution plan diverges sharply from the actual count, that's a sign of stale statistics.

Latest Posts

View all posts
Frontend

One 'use client' Line Splits Server and Client, and Shakes Everything From Bundle Size to State Management

In the Next.js App Router, a single 'use client' line that draws the server-client boundary reshapes your entire bundle size, data fetching, and state management strategy. Draw that boundary wrong and bundle bloat plus duplicate fetching blow up all at once, late in the game. This memo lays out the judgment principles for redrawing the boundary based on per-layer responsibilities and data ownership, plus the priority order for refactoring boundaries that were already drawn wrong.

#React#Next.js#Server Components#Client Components
Backend

Don't Trust Webhooks, Verify with Signatures

Webhook receivers must be designed with distrust of external requests. Since requests can be unstable — with retries, processing delays, and even forgery attempts — signature verification, idempotent processing, retry ID tracking, and queuing for delays are all essential for stable ingestion. Particularly, retries arriving without idempotency keys lead to duplicate processing; when delays grow too long, immediately switch to queue locking.

#webhook#signature-verification#idempotency#retry-handling
DevOps

Cache hit rate is 98%, so why does the release keep shipping an old version?

Dependency caches, build caches, and matrix strategies cut CI runtime in half, but when invalidation criteria are set wrong, stale packages sail through builds and turn into unexpected incidents. This article walks through concrete situations where a cache actually breaks a build, and lays out principles for reading invalidation points correctly in lock files, hash inputs, and matrix key design, so you have a safe standard for using caches.

#GitHub Actions#CI/CD#캐시 전략#빌드 최적화
Data

Reading the Signs in EXPLAIN: When Queries Ignore Your Indexes

Even with an index in place, seeing a full scan in EXPLAIN is common. Four patterns sever the link between a query and its index: function-wrapped columns, type mismatches, leading wildcards in LIKE, and low selectivity. This post is a decision memo that walks through each pattern with real examples of how it distorts the execution plan, and lays out a procedure for narrowing down and fixing the cause, from reading EXPLAIN to confirming the root cause.

#PostgreSQL#EXPLAIN#인덱스#풀스캔
Frontend

The Page Is Already Shifting Before the Font Even Shows

Korean web fonts carry large per-glyph payloads that delay loading, and the later a font arrives, the worse the CLS metric swings. This article walks through subsetting glyphs, nailing down preload timing, and choosing a font-display strategy with real numbers. It separates what Next.js's next/font handles from what it doesn't, and shows how to design a font pipeline that keeps text rendering stable without blowing the performance budget.

#웹 폰트#CLS#Core Web Vitals#Next.js
Tools

The Struggle of One Project's Upgrade from `any` Hell to `strict`

Suddenly enabling `strict` in a loosely-typed TypeScript project makes hundreds of errors pour out overnight. This article is a real migration log about enabling strict-family options one by one amid new feature development and bug fixes, weighing the difficulty and effect of each option to work out an optimal ordering. It covers everything from the `any` cleanup order to `strictNullChecks` and `noImplicitAny`, along with the real-world outages and regressions encountered along the way.

#TypeScript#strict#strictNullChecks#noImplicitAny

DevInsight Digest

Keep every new article in one calm feed.

Follow the full publication feed without promotional alerts.

Subscribe to RSS

Browse by Topic

From AI to developer tools, pick the stream you want to read now.