KYUWON LEE
Backend Engineer | Java · Kotlin · Spring Boot · Python · Django
Seoul, South Korea · kyuwoon369@gmail.com · linkedin.com/in/eekyuwon · github.com/kyuwon53
Professional Summary
Backend engineer who adapts quickly to user-facing business domains and delivers structural impact. In commerce, I led a zero-downtime migration of a 30-year legacy membership and order/payment platform (300K+ members) and built shared capabilities such as an event-driven reward system and role-based authorization; in industrial AI, I redesigned a large-scale sensor-data pipeline, cutting dashboard queries from 5s+ to under 1s; in tax, I developed the general income-tax return — the highest-traffic program on Korea's national Hometax service (10M filings in the May peak). I quickly grasp new requirements, get to the root of problems, and build backend systems centered on stability and scalability.
Experience
HanbitN — Team Lead, Common Platform Team / Backend Engineer | Sep 2024 – Present
Online learning & content-commerce platform for developers. Led new-system transitions and structural improvements across order/payment, membership, product, and content domains.
Scope of ownership
- New order/payment, coupon, and mileage systems; PG-provider switch and identity-verification migration (PortOne / server-to-server)
- New membership system transition and an annotation-based authorization (RBAC) model
- Event-driven reward system, abuse-reporting, and other shared features
- New service domains: cohort / government-funded (KDC) enrollment & onboarding, seminars, buddy
- Product/category/review, my-content, errata migration, book-detail redesign, and other commerce/content improvements
- Batch & data migration (MySQL↔PostgreSQL), Flyway, health checks, and operational monitoring
Root-caused a payment-completion API returning 401 despite fully successful processing
- Owned a critical payment-flow bug: internal logic (payment sync, order completion, transaction commit, response build) all succeeded, yet the client received 401 — and it never reproduced on non-authenticated endpoints.
- Added logging and caught
dispatcherType=ASYNC, auth=false right before the final response; traced the root cause to Kotlin coroutine suspend controllers re-entering via a Servlet ASYNC dispatch, where OncePerRequestFilter is skipped by default, so the JWT filter never ran and the SecurityContext was cleared.
- Overrode
shouldNotFilterAsyncDispatch() / shouldNotFilterErrorDispatch() so the auth filter runs on re-dispatch, stabilizing the payment-completion response, and shared the cause and prevention notes with the team.
Order/payment system rebuild — packages, PG switch, and settlement risk (also acted as PO)
- Rebuilt a legacy order/payment system where order, cart, payment, product, and deduction policy were tightly coupled and duplicate-payment handling and operational metrics were missing — while a new package-product launch and a PG-provider contract change landed at the same time.
- Defined how to split amounts and apply payment/settlement rules for package products mixing culture-expense-deductible and non-deductible items, solving it within a single cart→order→payment flow so customers don't have to split orders.
- Decoupled the domains and added DB-backed idempotency (unique constraints + row-level locking) and duplicate-purchase prevention, separated payment from webhook handling, added a failed-order reconciliation scheduler, and migrated coupons/mileage.
- Reduced settlement-error risk and established data-driven operational visibility; owning scope, prioritization, and communication as PO led to a company-wide top-performer award and promotion to team lead.
Zero-downtime migration of a 30-year legacy membership system (300K+ records)
- Migrated members (300K+ records) from a 30-year legacy platform without service interruption, ensuring legacy services kept working even for newly signed-up/logged-in users.
- Ran the
userId→memberId transition in staged, compatibility-preserving steps (add column → sync → dual-write → remove after auth cleanup) and designed a shared membership authentication API so legacy and new systems coexist.
- Cut over to the new stack with no downtime and laid the groundwork for other services to migrate gradually.
Event-driven reward system
- Improved a structure that required inserting per-event logic each time and needed duplicate-grant prevention and consistency across new and legacy databases.
- Compared three options (inline, mid-layer event service, queue-based async) and adopted an @EventListener-based mid-layer (receive/route → routing facade → strategy handlers) fitting current infra/timeline, with a default handler guarding unmapped triggers, and designed it to extend to a queue-based async pipeline later.
- Secured delivery reliability via duplicate-participation checks and dual-DB consistency, and cut development cost so new events only require adding a handler.
Other structural, performance, and automation improvements
- RBAC redesign: replaced implicit URL-path authorization with explicit annotation-based method security (
@PreAuthorize), unifying access control for members, operators, and role-based admins into one model.
- Fixed active-transaction exhaustion: high-traffic read endpoints opened a JTA (Atomikos) transaction per request and hit the limit → moved reads to
readOnly/outside transactions and shortened hold time, stabilizing without added infrastructure.
- PostgreSQL performance: execution-plan analysis, subquery→join rewrites, and N+1 removal cut a high-traffic query from over 1s to a few ms.
- Flyway adoption: eliminated environment drift and manual-SQL deployment failures (chosen after a Flyway-vs-Liquibase PoC), established as a team standard.
- Operational visibility: batch failures return a non-zero exit code to trigger Jenkins alerts with enriched logs for fast fault localization; Spring Boot Actuator health checks expose DB/disk and other dependency status.
MakinaRocks — Backend Engineer | Oct 2022 – Aug 2024
Anomaly-detection monitoring solution (MRXray) for manufacturing equipment; ingests, computes, and visualizes large-scale motor-sensor data and provides model-based alerts and monitoring.
MRXray enhancement
- Owned backend design/implementation and DB design; computed and visualized large sensor-data streams and calculated sensor anomaly levels from anomaly values and standard thresholds for monitoring.
- Raised alerts on standard and user-defined rules and let users monitor the location, data, and inspection history of equipment with detected faults; designed features to be reusable across the solution and aligned UX/UI with the frontend engineer.
- Designed to minimize changes to the existing structure and reduce API calls, and extracted core domains/common logic into a core module for reuse across the solution and parallel projects.
MRXray migration to Java
- Led the Python/Django → Java/Spring Boot migration (base structure, skeleton, ~80% of the API) after the switch was decided for stability, scalability, and hiring.
- Rethought the data users actually need from a UX perspective and reduced APIs from a flat 170 to ~80 (a page that once fired ~20 calls now uses one), cleaning up transaction handling and unused APIs.
- Refactored the DB schema (removed unnecessary columns and indiscriminate indexes/surrogate keys); ran a weekly Friday refactoring/learning day and recorded decision context in issues/PRs/Notion.
Raw-data ingestion pipeline & DB for modeling
- Built the source-data DB for the modeling team; analyzed the proprietary MDF file format and, with ML engineers, aligned timestamps across differently-sampled data while preserving the raw data as much as possible.
- Watched a configured path and, on MDF arrival, extracted and loaded the needed data; deployed the DB and parsing process on the in-house Kubernetes for the modeling team.
Data-ingestion anomaly monitoring & alerting
- Fixed slow incident response that required checking each owner (sensor DB, inference pipeline, etc.) to find where ingestion had stopped.
- Registered a scheduler script that checks the last record actually in the DB and sends a Slack alert to the owner when no data arrives for a set period, enabling fast localization and response.
Classification-model performance-metric feature
- Initially computed the metric on every query, which caused DB load and performance issues.
- Standardized the threshold to a fixed value and moved computation from query time to load time (in the application), storing results in a stats table — cutting a one-month query from ~5s to under 1s.
Data archiving, deployment automation & disaster response
- Built a Parquet compression/archival pipeline for raw ingested data, reducing DB storage while retaining history for backup/inference.
- Automated blue-green deployment on GitHub Actions/Docker/EC2, integrating build, test, image publishing, and deploy into one CI/CD pipeline.
- Restored availability during a production outage via manual PostgreSQL failover (standby promotion) on AWS EC2.
Uplus IT — Software Engineer | Sep 2021 – Oct 2022
National Hometax/Sontax tax-filing service used by the entire public; developed within an organization of 100+ engineers.
Hometax/Sontax general income-tax return (FY21) launch
- The general income-tax return is the highest-traffic, highest-user program on Hometax; as a new hire, I contributed to its launch development.
- During filing season, the Sontax mobile app's monthly users surged by ~3.72M month-over-month (90–129%), ranking #1 in user growth among all mobile apps in Korea that month.
- Because the annual launch is high-stakes (data issues, errors), I pre-checked and shared year-over-year changes to cut unnecessary work and secure testing/verification time; after finishing my own tasks early, I helped debug the main service and quickly pinpointed root causes.
- Recognized for an unusually stable launch while 10M filings were processed in May.
Hometax/Sontax employee income-tax amended-claim (FY21) launch
- Developed calculator popups and calculation algorithms for the employee amended-claim form per FY21 tax-law changes.
- Refactored a 7,000+ line calculation script down to ~2,000 lines, cutting later analysis/change time.
- Cross-team data dependencies made the source data hard to trace, so I proactively communicated to map the data flow and finished ~2 weeks earlier than the prior year.
Large-scale tax-invoice batch optimization
- Partitioned a 700K+ tax-invoice batch into smaller execution windows, improving throughput and reducing DB load.
Technical Skills
Languages & Frameworks: Kotlin, Java, Python, Spring Boot, Spring Batch, Django
Databases & Messaging: PostgreSQL, MySQL, RabbitMQ, Kafka
Infrastructure & DevOps: AWS, Docker, Kubernetes, GitHub Actions, Jenkins, Flyway, Grafana, Sentry
Awards & Certifications
SQLD (SQL Developer) · Company-wide Top Performer Award (HanbitN) · promoted to Team Lead, Common Platform Team (2026 reorg)
Education
Chungnam National University — B.S. Mathematics