© 2026 Devy | Privacy Policy
Search blog posts by title, description, tags, or content.
Showing 33 posts by latest date.
How a Spring AI customer-support draft system moved from function calling to parallel lookups, QA, error diagnosis, and an operator-review workflow in production.
For a long time, the language of our certificates and reports was baked into images. This is the story of moving image-based documents to HTML templates plus Cloud Run rendering, so that adding a new language became a single JSON file.
Translate the front end alone and the server keeps mixing Korean back in through its responses and documents. This is the story of how the backend stored each user's language and timezone, carried them along in the authentication context, and pushed the locale all the way through to responses and documents.
Even with all translations ready, flipping the switch for everyone at once is risky. The story of funneling locale decisions into a single choke point and rolling out i18n with zero downtime, gradually, via a GrowthBook kill switch.
If you ship translations together with the app, every one-line copy fix means a redeploy. This post covers the structure that loads language packs from GCS at runtime and falls back to the bundle, plus the cache problem where copy wouldn't change even after deploying.
Frontend internationalization, kicked off ahead of our launch in Japan. Here's how we settled on a locale model, managed our messages, and flowed the locale through the entire system.
How I split signing responsibility, kid, key rotation, and legacy token handling while moving symmetric JWT signing to RS256, JWKS, and KMS.
How I split verification order and failure handling when old frontend tokens and new backend-issued tokens had to be accepted through the same browser cookies.
How the frontend connects the login flow from protected page access to backend authorize, callback, and token issuance.
The responsibility boundaries I used while moving login state from a frontend-owned flow to a backend-owned authentication flow.
A benchmark comparing JDK 25 Platform Threads, Virtual Threads, and Kotlin Coroutines across I/O-bound, CPU-bound, and high-concurrency scenarios with 10,000 tasks repeated 100 times.
A practical record of upgrading a production Spring Boot service from JDK 11 to 21, including the javax to jakarta transition, AWS SDK migration, and QueryDSL compatibility work.
A practical record of upgrading from JDK 21 to 25, enabling Virtual Threads, handling pinning issues, applying pattern matching switch, and moving to Gradle Kotlin DSL.
How I moved from Datadog to an open-source LGTM stack and built observability with an OTel Collector sidecar, noise filtering, MDC request tracing, and IRSA-backed S3 storage.
A practical guide to deploying Grafana's LGTM stack on EKS with Helm and collecting Spring Boot logs, traces, and metrics through an OTel Collector sidecar.
A guide to Spring AI core concepts, project setup, and the first AI call with ChatClient.
How to abstract OpenAI, AWS Bedrock, and Google Gemini behind one ChatClient interface and switch providers dynamically at runtime.
How to use Spring AI's message model, variable templating, database-backed prompt management, and JSON Schema-based structured output.
What I learned while migrating from AWS ECS to EKS and building an operating model with kustomize base/overlay, Kubernetes Gateway API, Karpenter node autoscaling, and blue/green deployment.
How I migrated from a legacy structure where every API returned 200 to a shared response and error system that uses HTTP status codes properly, improving monitoring, debugging, and team communication.
How I introduced a custom @Gateway annotation and facade layer into a traditional Controller-Service-Repository architecture to clarify domain responsibilities and improve team productivity.
How I moved scattered PHP notification logic into an independent Spring Boot notification server that handles Kakao AlimTalk, SMS, email, push, and Slack through one structure.
How I migrated a legacy payment system written in PHP to a Java/Spring and SQS-based event-driven architecture.
SQS looked attractive as an event-driven architecture, but in the payment domain it added more complexity than value. This post covers how I removed SQS and stabilized payment processing with synchronous APIs and Portone webhooks.
A real-world record of redesigning direct HTTP calls and one large synchronous prompt into a seven-step Spring AI pipeline.
Why I rebuilt my personal blog with React 19, Vite 7, and shadcn/ui, and how the project is structured.
How I implemented Cmd+K search with cmdk and added page transition animation with the View Transitions API.
How I created six color presets with shadcn/ui's oklch color system and implemented post series navigation.
How I built a search page with date and tag filters, then improved SEO with meta tags, sitemap, and RSS feed generation.
How I display visitor counts and daily page view charts on a static site using GA4 data.
Year-based post grouping, mobile sidebar UX improvements, robots.txt, OG image setup, and other small refinements that make the blog feel more complete.
How I built a GitOps-based deployment automation system during the ECS to EKS migration, combining ArgoCD, n8n, and GitHub Actions with different deployment strategies per environment.
A closer look at how React Hooks work and the practical patterns I use in real projects.