Game Server / Backend Developer 4 years, 5 live mobile games

Building stability
where no one
sees it.

I ran mobile game servers live across Korea, Japan, Taiwan, and English-speaking regions, and fixed login bottlenecks, slow ranking queries, and payment errors by tracing them to the root cause and reworking the structure.

Role
Game server, server/backend development
Experience
4 years
Live games
5 mobile games
Regions
KR, JP, TW, English
CocoMine Sanrio Characters key art
CocoMine Sanrio
CocoMine key art
CocoMine
Welcome to My Home key art
Welcome to My Home

I fix the structure,
not the symptom.

Over 4 years as a game server and backend developer, I've built hands-on experience that spans far beyond maintenance and new features, covering performance optimization, operational infrastructure, and real-time server design. Directly responsible for live services running across Korea, Japan, Taiwan, and English-speaking regions, I've tracked down and resolved issues that cut straight to the heart of stability and performance: eliminating login bottlenecks, migrating ranking systems to Redis, building a chat server from the ground up, stabilizing payments, and executing DB migrations.

Years of incident response and structural refactoring have reinforced one conviction: patching surface symptoms is a temporary fix, but understanding the root cause and redesigning the structure is what actually lasts. Backend work happens entirely out of sight, but the quieter the server, the more freely users stay immersed, and the more the operations team can focus on building rather than firefighting. I find meaning in that invisible work, where silence is the only sign that anything was done at all.

Education, training,
and certifications

Education

2017.03 – 2022.08Pusan National UniversityComputer Science & Engineering, Busan, graduated
2013.09 – 2014.06Hong Kong Polytechnic UniversityComputer Science, Hong Kong, attended (degree not completed)
2009.09 – 2013.06International School of QingdaoSecondary school, Qingdao, China, graduated

Training

2026.05.12 – 2026.11.12KakaoTech Bootcamp, Generative AI CourseKorea Radio Promotion Association, in progress
2023.11.29 – 2024.01.17Game Application Programming CourseSeoul Game Academy Busan, left the program upon employment

Language / certifications

2026.03.25OPIc IH (English)ACTFL
2024.06Engineer Information Processing CertificateHuman Resources Development Service of Korea, 24201210507Z

Tools I've worked with

Duration includes professional work, projects, training, and self-study. Bars show proficiency on a five-step scale.

Backend languages

Java5 yrs
JavaScript3 yrs
C#2 yrs
PHP2 yrs
Python2 yrs
Node.js1 yr
Go1.5 yrs
C1 yr
C++1 yr

Databases

MySQL5 yrs
Google BigQuery2 yrs
Redis1.5 yrs
MSSQL3 yrs
Oracle3 yrs
PostgreSQL3 yrs

Server / infrastructure

AWS2 yrs
Apache1 yr
Express1 yr
IIS1 yr
SSL1 yr
Tomcat1 yr

Frameworks / tools

GitHub5 yrs
Spring Framework3 yrs
eGovFramework3 yrs
SVN3 yrs
ASP.NET Core2 yrs
Spring Boot1 yr
Nexacro1 yr
React Native1 yr

ETC

Looker Studio2 yrs
OKTA SSO1 yr
PWA1 yr

From business systems
to live game servers

Started in SI web backend work and moved to game servers, covering the full cycle from requirements and design to implementation, testing, and live incident response.

202120222023202420252026
2021.03 – 2021.12UXISSoftware Developer Intern
SW and server development
2022.01 – 2022.12UXISContract Software Developer
SW and server development
2023.04 – 2023.08UXISContract Software Developer
SW and server development
2024.01 – 2026.02SKYWALKServer Developer
Game server content development and maintenance

Not "faster,"
but proven in numbers

I prioritized the delays players actually felt and the risks the operations team carried, and fixed the structure rather than the symptom.

Login processing time Before: 30 s to 3 min After: 10–30 s CocoMine, less lock contention and parallel work
Ranking query time Before: 10–20 s After: 1–2 s CocoMine, Redis caching and paging
Payment errors Before: 4–5 per day After: 1 per 1–2 wks Welcome to My Home, retry-safe consistency

Games on stage,
servers backstage

What players see is the game. What I owned is the server running underneath it, without stopping. I built and ran live operations for five games.

CocoMine game screen

CocoMine

Cozy life simulation SNS

Backstage work
  • Login locks: 30 s–3 min → 10–30 s
  • Redis ranking: 10–20 s → 1–2 s
  • Auto-scaling channel pool
  • New chat server

Go / C# / MySQL / Redis

CocoMine Sanrio Characters game screen

CocoMine Sanrio Characters

Metaverse community

Backstage work
  • Chat and plaza servers
  • ASP.NET Core admin
  • Per-thread session isolation
  • BigQuery statistics

Go / C# / BigQuery

Welcome to My Home game screen

Welcome to My Home

Lifestyle SNG in 4 regions

Backstage work
  • Payment errors: 4–5/day → 1 per 1–2 wks
  • MySQL 5.7 to 8.0 migration
  • Looker Studio dashboard
  • 4-region maintenance

Java / MySQL / AWS

GirlGlobe game screen

GirlGlobe

Fashion dress-up styling game

Backstage work
  • Item delivery: 10–20 s → 2–5 s
  • Admin stats and content tools
  • AWS to on-premise migration

Python / MySQL

Yumi's Cells The Puzzle game screen

Yumi's Cells

Match-3 puzzle

Backstage work
  • Currency flow statistics
  • DB column consolidation
  • AWS to on-premise migration

PHP / MySQL

Bottlenecks that grew
with concurrency,
solved in the structure.

Problem
Locks on every login API forced all users' requests into a single line, so waits grew whenever traffic spiked.
Fix
Reduced contention around the request-wide locks and split independent work to run in parallel. Also expanded the DB connection pool and added missing indexes.
Result
Login dropped from 30 s to 3 min down to 10–30 s, and ranking queries from 10–20 s to 1–2 s after moving to Redis.
  1. LOGINLess lock contention
  2. SESSIONConcurrent requests split
  3. CHANNEL POOLLeast-loaded, auto scale-out
  4. REDISRanking cache
  5. MYSQLPersistent data, indexes

I fixed the bottlenecks in the existing login flow and designed the new channel pool distribution.

Four projects where I
followed the problem through

Each project is laid out as situation, task, how I solved it, and result. Where the structure changed, a diagram shows how. Select a title to collapse a project.

01

CocoMine

SKYWALK, 2024.12 – 2026.02

Cozy life simulation SNS, 10K+ users, peak CCU 500–1,000

Team and roleServer content developer in a team of 2 server, 5 client, and 1 UI developers. After the other server developer left mid-project, I owned the server alone. Key technical decisions such as channel distribution and scale-out were reviewed with the CTO before being applied.

GoC#ASP.NET CoreMySQLRedisBigQuery
Login processing time30 s to 3 min10–30 s
Ranking query time10–20 s1–2 s
Item and ranking data processing5–15 s2–6 s

Situation

  • Each login API held its own lock, so sessions queued one after another under load
  • The plaza and village packed all users into a single channel, causing lag and disconnections
  • Every ranking request read MySQL directly, creating heavy load under concurrent requests
  • There was no real-time chat between users
  • The operations team had to ask the dev team every time they needed game data

Task

  • Login stabilization
  • Plaza/village channel distribution
  • New chat server
  • Faster ranking queries
  • Operations tool design

How I solved it

  1. Login bottleneck: less lock contention, independent work in parallel

    Found that the locks attached to each login API were serializing requests. Reduced contention around the request-wide locks and separated independent work so it runs in parallel. The remaining bottleneck was cleared by expanding the DB connection pool and adding missing indexes.

  2. Channel pool: place users in the least-loaded channel

    Gave the plaza and village a pool of 5 channels by default and designed distribution logic that assigns new users to the channel with the fewest users. Per-channel user state is isolated so only users in the same channel interact. Per-channel user counters are protected against race conditions under concurrent joins with Go's sync.Mutex.

  3. Auto scale-out: 5 new channels at 25 of 30

    When all channels approach 25 of their 30-user capacity, 5 channels are provisioned at once. New users are then placed gradually to prevent a thundering herd onto the new channels. The 30-user capacity was confirmed through blind playtesting.

  4. New chat server

    Agreed on the spec with the planning team, then built the chat server from design through implementation. Also added the village and district servers, with interactive items, interaction motions, and an address system inside the village.

  5. Ranking: from direct MySQL reads to Redis

    Contribution and fashion-match scores are written to Redis in real time, and reads go through paging and Redis caching. Ranking views no longer hit the DB repeatedly.

  6. Operations tool and query tuning

    Finalized requirements with the operations team, then designed and built the ops tool on ASP.NET Core. Applied indexing and query optimization to lagging paths, cutting read/update time for large item and ranking data from 5–15 s to 2–6 s.

Login processing, before and after
BeforeAPI locks force requests into a single line, 30 s to 3 min
Req 1
Req 2
Req 3
AfterIndependent work in parallel, larger connection pool and indexes, 10–30 s
Req 1
Req 2
Req 3

Bar lengths illustrate the processing flow only. Measured times are the results shown above.

Channel pool distribution and auto scale-out
CH1
CH2
CH3
CH4
CH5
+5auto scale-out
CH6
CH7
CH8
CH9
CH10
  • Dashed line is the 25-user scale-out threshold (capacity 30)
  • New users are placed gradually, starting with the least-loaded channel
  • Per-channel user counters are updated under sync.Mutex

Result

  • Login time cut from 30 s to 3 min down to 10–30 s, ranking queries from 10–20 s to 1–2 s
  • Single-channel overcrowding in the plaza and village eased by least-loaded placement and auto scale-out
  • Social content expanded with user chat, the village, and the district map
02

Welcome to My Home

SKYWALK, 2024.01 – 2026.02

Lifestyle simulation SNG, KR/JP/TW/EN 4 regions, 200K+ users, CCU 200–2,000

JavaMySQLBigQueryAWSLooker Studio
Payment failure rate4–5 per day1 per 1–2 weeks
Item lookup time3–10 s faster

Situation

  • MySQL 5.7 reached end of life in October 2023, ending security patches, so an 8.0 migration was unavoidable
  • Network delays caused 4–5 payment failures a day, or payments that completed without the item being granted
  • The operations team had to ask the dev team for every piece of game data, which slowed decisions
  • Content differed by region, so some errors appeared in only one region

Task

  • MySQL 8.0 migration
  • Payment stabilization
  • Dashboard for operations
  • 4-region maintenance

How I solved it

  1. Payments: retries that never grant twice

    Added automatic retries when a payment fails because of network delay. Before each retry, prior payment records and grant records are cross-checked so an item that was already granted is not granted again, and payments that completed without the item being granted are safely recovered.

  2. MySQL 5.7 to 8.0

    Found the places where 8.0 breaks compatibility, such as the authentication method and GROUP BY handling, fixed the source code, tested, and deployed. Applied indexing and optimization to key queries at the same time.

  3. A dashboard the operations team reads directly

    Agreed on the metrics with the operations team, then built currency, token, and log dashboards with BigQuery and Looker Studio. The team could check data without going through the dev team.

  4. 4-region operations and documentation

    Tracked down and fixed errors caused by region-specific content, and built new content. Documented content and bug lists and kept them current so other developers could quickly understand the operating history.

Payment retry and grant consistency flow
Payment request
Network delay or failure
Before retrying,
cross-check payment and grant records
Already grantedNot granted again, preventing duplicates
Paid, item not grantedMissing item safely recovered
Payment not completedAutomatic retry proceeds

Result

  • Payment failures dropped from 4–5 per day to 1 every 1–2 weeks
  • After the dashboard launched, one-off data requests turned into feature-driven analytics requests
  • The operations team could identify error-prone periods on their own
03

Chungcheongbuk-do Education Office HR System

UXIS, 2021.12 – 2022.07

HR administration system for education office staff, about 6,400–10,000 employees

JavaNexacroMySQLeGovFrameworkSpring

Situation

  • Transfers for about 6,400–10,000 employees were decided manually: clerks collected submitted documents and calculated scores on paper or in Excel
  • HR records were kept as documents and had to be looked up by hand each time

Task

  • Score-based transfer algorithm
  • Unified HR records
  • Performance evaluation, surveys, statistics

How I solved it

  1. Turn documents into scores and total them automatically

    Designed a transfer algorithm that scores submitted documents by category, totals them automatically, and determines priority with a top-down sort.

  2. Handle ties and overlapping scores separately

    Implemented separate logic that automatically distinguishes tied and overlapping scores, cases that were hard to catch in Excel.

  3. Unified HR records and statistics

    Consolidated scattered HR records into one system for instant lookup, and built performance evaluation, survey, and statistics features.

Transfer decision algorithm
  1. Structure document dataDefine scoring rules per category
  2. Total scores automaticallySum category scores
  3. Determine priorityTop-down sort
  4. Resolve exceptionsSeparate ties and overlapping scores

Result

  • Transfer decisions for 6,400–10,000 employees moved from paper and Excel to score-based automated processing
  • Scores no longer had to be checked step by step, so transfer decisions became faster
  • Statistics showed which departments see the most transfers and which are most preferred
04

C++ Network Game Server Learning Project

Personal project, 2026.07 – present

Builds connection handling step by step from v1 to v6 and reproduces the behavior of each architecture in a GUI

C++20CMakeLinuxWindowsepollIOCPDocker
GitHub
Linux server28,000 concurrent connections
Messages processed560,000
Windows IOCP sustained12,000 connections, 120,000 messages

Goal

  • Build connection handling, network I/O, and multithreading for a C++ game server by hand to strengthen server fundamentals
  • Implement the same feature in several architectures and test them under the same conditions to see where each one hits its limit
Server architecture by version
VersionArchitectureKey point
v1Single-thread blockingHandles one connection at a time, other clients wait
v2Thread per connectionCreates a new thread for every connection
v3Fixed thread poolReuses a fixed number of threads
v4Linux epoll ReactorEvent-driven handling of many connections
v5epoll + worker poolSeparates network I/O from application work
v6Windows IOCP async serverAsynchronous handling with AcceptEx and completion notifications

How I solved it

  1. Fix each version's limit in the next one

    Started from a server that handles one client at a time, then built thread-per-connection, a reusable thread pool, Linux epoll, and Windows IOCP. Learned how to use threads efficiently as connections grow and how to separate network I/O from application work.

  2. Reliable transfer and shutdown

    Handled partial sends by continuing the remaining data, and used send queues so one user's messages never change order. Implemented a shutdown order for work and threads so the server stops safely even with open connections, and verified pending I/O draining.

  3. Automated checks

    Automated repeated connect/disconnect and server shutdown tests, and checked for memory errors.

  4. Cross-platform GUI for comparing architectures

    One screen controls version selection and launch, up to 200 client connections, individual, delayed, and repeated sends, and Echo response aggregation. It detects the versions and Native/Docker modes the host OS supports, and builds missing binaries with CMake.

Load test results
EnvironmentConditionResult
Linux (Docker network)28,000 concurrent connectionsAll 560,000 messages processed
Linux (Docker network)30,000 connection attemptsClient ephemeral ports ran out first; all messages from the 28,231 connected clients were processed
Windows IOCP (Debug)2,000 burst connectionsEcho 20,000 / 20,000
Windows IOCP (Debug)Gradual connections, concurrency capped at 6412,000 connections held, Echo 120,000 / 120,000
Windows IOCP (Debug)2,500+ burst connectionsBacklog 128 and 16 pending AcceptEx calls could not absorb the spike, so some connections were refused
All4 MiB split transferFull content delivered correctly across multiple writes

Every test completed pending I/O draining and exited with code 0. Because 12,000 is affected by the Windows dynamic port range, it was not treated as the server's absolute limit. Console output was redirected to NUL during measurement so heavy logging could not block the stdout pipe.

Result

  • Load tests exposed work piling up on network-processing threads, defining the next optimization target
  • Built a lab that detects supported modes on macOS, Linux, and Windows and reproduces each architecture in one UI

Live issues I handled,
through to prevention

Real outages and data problems from live services, laid out as cause, fix, and prevention.

CocoMineLate-night outage

Logins delayed for all users

Cause
One user's excessive item count triggered a lock during lookup, delaying every other user's login
Fix
Indexing and a limit cleared the delay immediately
Prevention
Redesigned the lock structure itself after the immediate fix
CocoMineLate-night outage

Event failed to go live

Cause
The planning team's event data was missing from the commit that was deployed
Fix
Received the missing file as a new commit and hot-deployed without downtime to restore the event
Welcome to My HomeLate-night outage

Japan server down

Cause
df showed the disk was full. A malfunctioning crontab log cleanup batch had let logs pile up
Fix
Cleared old log files immediately to restore the server
Prevention
Audited and fixed the log cleanup batch
CocoMineData mismatch

Achievement data mismatch in production

Cause
Staging tests passed, but achievement conditions did not match production data for users who had already sold or used the items
Fix
Analyzed usage and logs, then applied a bulk achievement update
Prevention
Added finer edge-case checks to the server for every new achievement
CocoMinePre-launch verification

Finding bottlenecks first with a custom load-test bot

Method
Built a load-test bot that automates connection, login, and basic gameplay, and used it before launch to find bottlenecks on the login, item, plaza, and chat paths
Fix
Restructured those paths based on the findings, and re-reviewed and fixed areas at risk of lock contention, race conditions, and deadlocks

Every project I worked on

Grouped by company and period. Select a company to expand its list, then select a project to open the details.