<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Devy Archive</title>
    <link>https://dev.devy.dev/en/</link>
    <description>Devy&#39;s technical blog about backend engineering, cloud infrastructure, and AI. Notes on development and operations problems and how they were solved.</description>
    <language>en</language>
    <atom:link href="https://dev.devy.dev/en/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Operating a CS Support System with Spring AI - From Function Calling to an Operator Suggestion Workflow</title>
      <link>https://dev.devy.dev/en/posts/spring-ai-cs-automation/</link>
      <guid>https://dev.devy.dev/en/posts/spring-ai-cs-automation/</guid>
      <description>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.</description>
      <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Service Internationalization (5) - From Image-Baked Documents to HTML: Multilingual PDF Rendering</title>
      <link>https://dev.devy.dev/en/posts/i18n-05-document-render/</link>
      <guid>https://dev.devy.dev/en/posts/i18n-05-document-render/</guid>
      <description>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.</description>
      <pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Service Internationalization (4) - The Backend&#39;s Part: User Language, Timezone, and Document Locale</title>
      <link>https://dev.devy.dev/en/posts/i18n-04-backend-locale/</link>
      <guid>https://dev.devy.dev/en/posts/i18n-04-backend-locale/</guid>
      <description>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&#39;s language and timezone, carried them along in the authentication context, and pushed the locale all the way through to responses and documents.</description>
      <pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Service Internationalization (3) - Zero-Downtime Rollout with a GrowthBook Kill Switch</title>
      <link>https://dev.devy.dev/en/posts/i18n-03-rollout-killswitch/</link>
      <guid>https://dev.devy.dev/en/posts/i18n-03-rollout-killswitch/</guid>
      <description>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.</description>
      <pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Service Internationalization (2) - Serving Language Packs: Bundle, GCS Runtime Load, and Cache</title>
      <link>https://dev.devy.dev/en/posts/i18n-02-language-pack-gcs/</link>
      <guid>https://dev.devy.dev/en/posts/i18n-02-language-pack-gcs/</guid>
      <description>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&#39;t change even after deploying.</description>
      <pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Service Internationalization (1) - Stripping Out Hardcoded Korean</title>
      <link>https://dev.devy.dev/en/posts/i18n-01-foundation/</link>
      <guid>https://dev.devy.dev/en/posts/i18n-01-foundation/</guid>
      <description>Frontend internationalization, kicked off ahead of our launch in Japan. Here&#39;s how we settled on a locale model, managed our messages, and flowed the locale through the entire system.</description>
      <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>JWT Signing Migration - From HS256 to RS256/JWKS/KMS</title>
      <link>https://dev.devy.dev/en/posts/jwt-hs256-to-rs256-jwks-kms/</link>
      <guid>https://dev.devy.dev/en/posts/jwt-hs256-to-rs256-jwks-kms/</guid>
      <description>How I split signing responsibility, kid, key rotation, and legacy token handling while moving symmetric JWT signing to RS256, JWKS, and KMS.</description>
      <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Splitting Login Responsibility (3) - Verifying Old Tokens and New Backend Tokens Together</title>
      <link>https://dev.devy.dev/en/posts/auth-token-verification-migration/</link>
      <guid>https://dev.devy.dev/en/posts/auth-token-verification-migration/</guid>
      <description>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.</description>
      <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Splitting Login Responsibility (2) - Connecting the authorize/callback Flow</title>
      <link>https://dev.devy.dev/en/posts/auth-authorize-callback-flow/</link>
      <guid>https://dev.devy.dev/en/posts/auth-authorize-callback-flow/</guid>
      <description>How the frontend connects the login flow from protected page access to backend authorize, callback, and token issuance.</description>
      <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Splitting Login Responsibility (1) - Why I Moved It from Frontend to Backend</title>
      <link>https://dev.devy.dev/en/posts/backend-owned-login-flow/</link>
      <guid>https://dev.devy.dev/en/posts/backend-owned-login-flow/</guid>
      <description>The responsibility boundaries I used while moving login state from a frontend-owned flow to a backend-owned authentication flow.</description>
      <pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Platform Thread vs Virtual Thread vs Coroutine - 10,000 Task Benchmark</title>
      <link>https://dev.devy.dev/en/posts/sync-virtual-coroutine-benchmark/</link>
      <guid>https://dev.devy.dev/en/posts/sync-virtual-coroutine-benchmark/</guid>
      <description>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.</description>
      <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>JDK Migration (1) - From JDK 11 to 21 and the Spring Boot 3.x Transition</title>
      <link>https://dev.devy.dev/en/posts/jdk-migration-strategy-11-to-25/</link>
      <guid>https://dev.devy.dev/en/posts/jdk-migration-strategy-11-to-25/</guid>
      <description>A practical record of upgrading a production Spring Boot service from JDK 11 to 21, including the javax to jakarta transition, AWS SDK for Java 1.x to 2.x migration, Spring Cloud AWS 3.x, and QueryDSL compatibility work.</description>
      <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>JDK Migration (2) - From JDK 21 to 25, Virtual Threads, and Modern Java</title>
      <link>https://dev.devy.dev/en/posts/jdk-migration-strategy-21-to-25/</link>
      <guid>https://dev.devy.dev/en/posts/jdk-migration-strategy-21-to-25/</guid>
      <description>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.</description>
      <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Replacing Datadog with an LGTM Stack - OTel Sidecar with Grafana, Loki, Tempo, and Mimir</title>
      <link>https://dev.devy.dev/en/posts/lgtm-stack-observability/</link>
      <guid>https://dev.devy.dev/en/posts/lgtm-stack-observability/</guid>
      <description>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.</description>
      <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Building an LGTM Stack on EKS - Practical Setup Guide for Loki, Grafana, Tempo, and Mimir</title>
      <link>https://dev.devy.dev/en/posts/lgtm-stack-setup-guide/</link>
      <guid>https://dev.devy.dev/en/posts/lgtm-stack-setup-guide/</guid>
      <description>A practical guide to deploying Grafana&#39;s LGTM stack on EKS with Helm and collecting Spring Boot logs, traces, and metrics through an OTel Collector sidecar.</description>
      <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Spring AI Guide (1) - From Project Setup to the First AI Call</title>
      <link>https://dev.devy.dev/en/posts/spring-ai-guide-01-setup/</link>
      <guid>https://dev.devy.dev/en/posts/spring-ai-guide-01-setup/</guid>
      <description>A guide to Spring AI core concepts, project setup, and the first AI call with ChatClient.</description>
      <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Spring AI Guide (2) - Multi-Provider Strategy</title>
      <link>https://dev.devy.dev/en/posts/spring-ai-guide-02-multi-provider/</link>
      <guid>https://dev.devy.dev/en/posts/spring-ai-guide-02-multi-provider/</guid>
      <description>How to abstract OpenAI, AWS Bedrock, and Google Gemini behind one ChatClient interface and switch providers dynamically at runtime.</description>
      <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Spring AI Guide (3) - Prompt Management and Structured Output</title>
      <link>https://dev.devy.dev/en/posts/spring-ai-guide-03-prompt-structured-output/</link>
      <guid>https://dev.devy.dev/en/posts/spring-ai-guide-03-prompt-structured-output/</guid>
      <description>How to use Spring AI&#39;s message model, variable templating, database-backed prompt management, and JSON Schema-based structured output.</description>
      <pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>From ECS to EKS - Building an Operating Environment with kustomize and Gateway API</title>
      <link>https://dev.devy.dev/en/posts/ecs-to-eks-migration/</link>
      <guid>https://dev.devy.dev/en/posts/ecs-to-eks-migration/</guid>
      <description>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.</description>
      <pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Standardizing API Responses and Error Handling - Getting HTTP Status Codes Right</title>
      <link>https://dev.devy.dev/en/posts/api-response-error-standardization/</link>
      <guid>https://dev.devy.dev/en/posts/api-response-error-standardization/</guid>
      <description>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.</description>
      <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Introducing the Facade Pattern to Spring MVC - Improving Layered Architecture with a @Gateway Annotation</title>
      <link>https://dev.devy.dev/en/posts/spring-facade-pattern-layered-architecture/</link>
      <guid>https://dev.devy.dev/en/posts/spring-facade-pattern-layered-architecture/</guid>
      <description>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.</description>
      <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Building a Multi-Channel Notification Server - From PHP Legacy to Java/Spring</title>
      <link>https://dev.devy.dev/en/posts/multi-channel-notification-server/</link>
      <guid>https://dev.devy.dev/en/posts/multi-channel-notification-server/</guid>
      <description>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.</description>
      <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Payment System Redesign (1) - From PHP Legacy to Java/Spring</title>
      <link>https://dev.devy.dev/en/posts/payment-system-migration-php-to-spring/</link>
      <guid>https://dev.devy.dev/en/posts/payment-system-migration-php-to-spring/</guid>
      <description>How I migrated a legacy payment system written in PHP to a Java/Spring and SQS-based event-driven architecture.</description>
      <pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Payment System Redesign (2) - Removing SQS and Moving to Synchronous APIs</title>
      <link>https://dev.devy.dev/en/posts/payment-system-redesign-sync-api/</link>
      <guid>https://dev.devy.dev/en/posts/payment-system-redesign-sync-api/</guid>
      <description>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.</description>
      <pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Spring AI in Practice - Building a Seven-Step AI Diagnostic Pipeline</title>
      <link>https://dev.devy.dev/en/posts/spring-ai-pipeline-real-world/</link>
      <guid>https://dev.devy.dev/en/posts/spring-ai-pipeline-real-world/</guid>
      <description>A real-world record of redesigning direct HTTP calls and one large synchronous prompt into a seven-step Spring AI pipeline.</description>
      <pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Building a Blog #1 - Project Overview and Tech Stack</title>
      <link>https://dev.devy.dev/en/posts/blog-dev-01-intro/</link>
      <guid>https://dev.devy.dev/en/posts/blog-dev-01-intro/</guid>
      <description>Why I rebuilt my personal blog with React 19, Vite 7, and shadcn/ui, and how the project is structured.</description>
      <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Building a Blog #2 - Command Palette Search and View Transitions</title>
      <link>https://dev.devy.dev/en/posts/blog-dev-02-search-transitions/</link>
      <guid>https://dev.devy.dev/en/posts/blog-dev-02-search-transitions/</guid>
      <description>How I implemented Cmd+K search with cmdk and added page transition animation with the View Transitions API.</description>
      <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Building a Blog #3 - Color Theme Presets and Post Series</title>
      <link>https://dev.devy.dev/en/posts/blog-dev-03-theme-series/</link>
      <guid>https://dev.devy.dev/en/posts/blog-dev-03-theme-series/</guid>
      <description>How I created six color presets with shadcn/ui&#39;s oklch color system and implemented post series navigation.</description>
      <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Building a Blog #4 - Advanced Search and SEO Optimization</title>
      <link>https://dev.devy.dev/en/posts/blog-dev-04-search-seo/</link>
      <guid>https://dev.devy.dev/en/posts/blog-dev-04-search-seo/</guid>
      <description>How I built a search page with date and tag filters, then improved SEO with meta tags, sitemap, and RSS feed generation.</description>
      <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Building a Blog #5 - Google Analytics Integration and View Counts</title>
      <link>https://dev.devy.dev/en/posts/blog-dev-05-analytics/</link>
      <guid>https://dev.devy.dev/en/posts/blog-dev-05-analytics/</guid>
      <description>How I display visitor counts and daily page view charts on a static site using GA4 data.</description>
      <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Building a Blog #6 - UX Improvements and Final SEO Polish</title>
      <link>https://dev.devy.dev/en/posts/blog-dev-06-ux-seo/</link>
      <guid>https://dev.devy.dev/en/posts/blog-dev-06-ux-seo/</guid>
      <description>Year-based post grouping, mobile sidebar UX improvements, robots.txt, OG image setup, and other small refinements that make the blog feel more complete.</description>
      <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>GitOps Deployment Automation - Building a Slack Approval Pipeline with ArgoCD, n8n, and GitHub Actions</title>
      <link>https://dev.devy.dev/en/posts/gitops-argocd-n8n-deployment/</link>
      <guid>https://dev.devy.dev/en/posts/gitops-argocd-n8n-deployment/</guid>
      <description>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.</description>
      <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>React Hooks Deep Dive</title>
      <link>https://dev.devy.dev/en/posts/react-hooks-deep-dive/</link>
      <guid>https://dev.devy.dev/en/posts/react-hooks-deep-dive/</guid>
      <description>A closer look at how React Hooks work and the practical patterns I use in real projects.</description>
      <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>
