CocoMine
Cozy life simulation SNS
- 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
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.



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.
Duration includes professional work, projects, training, and self-study. Bars show proficiency on a five-step scale.
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.
I prioritized the delays players actually felt and the risks the operations team carried, and fixed the structure rather than the symptom.
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.
Cozy life simulation SNS
Go / C# / MySQL / Redis
Metaverse community
Go / C# / BigQuery
Lifestyle SNG in 4 regions
Java / MySQL / AWS
Fashion dress-up styling game
Python / MySQL
Match-3 puzzle
PHP / MySQL
I fixed the bottlenecks in the existing login flow and designed the new channel pool distribution.
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.
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.
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.
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.
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.
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.
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.
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.
Bar lengths illustrate the processing flow only. Measured times are the results shown above.
Lifestyle simulation SNG, KR/JP/TW/EN 4 regions, 200K+ users, CCU 200–2,000
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.
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.
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.
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.
HR administration system for education office staff, about 6,400–10,000 employees
Designed a transfer algorithm that scores submitted documents by category, totals them automatically, and determines priority with a top-down sort.
Implemented separate logic that automatically distinguishes tied and overlapping scores, cases that were hard to catch in Excel.
Consolidated scattered HR records into one system for instant lookup, and built performance evaluation, survey, and statistics features.
Builds connection handling step by step from v1 to v6 and reproduces the behavior of each architecture in a GUI
GitHub| Version | Architecture | Key point |
|---|---|---|
| v1 | Single-thread blocking | Handles one connection at a time, other clients wait |
| v2 | Thread per connection | Creates a new thread for every connection |
| v3 | Fixed thread pool | Reuses a fixed number of threads |
| v4 | Linux epoll Reactor | Event-driven handling of many connections |
| v5 | epoll + worker pool | Separates network I/O from application work |
| v6 | Windows IOCP async server | Asynchronous handling with AcceptEx and completion notifications |
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.
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.
Automated repeated connect/disconnect and server shutdown tests, and checked for memory errors.
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.
| Environment | Condition | Result |
|---|---|---|
| Linux (Docker network) | 28,000 concurrent connections | All 560,000 messages processed |
| Linux (Docker network) | 30,000 connection attempts | Client ephemeral ports ran out first; all messages from the 28,231 connected clients were processed |
| Windows IOCP (Debug) | 2,000 burst connections | Echo 20,000 / 20,000 |
| Windows IOCP (Debug) | Gradual connections, concurrency capped at 64 | 12,000 connections held, Echo 120,000 / 120,000 |
| Windows IOCP (Debug) | 2,500+ burst connections | Backlog 128 and 16 pending AcceptEx calls could not absorb the spike, so some connections were refused |
| All | 4 MiB split transfer | Full 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.
Real outages and data problems from live services, laid out as cause, fix, and prevention.
Grouped by company and period. Select a company to expand its list, then select a project to open the details.
Genre: Social networking service (SNS), cozy life simulation
Genre: Social networking service (SNS), metaverse community
Genre: Styling game (fashion dress-up)
Genre: Match-3 puzzle game
Genre: SNG, lifestyle simulation
Ramen recipe and subscription web service
A step-by-step server architecture lab that compares connection handling from v1 through v6 in one GUI
GitHub
A RAG system that answers questions about Kakao terms with supporting clauses, plus an answer-evaluation tool
GitHubKakaoTech Bootcamp deep dive: GPT architecture from scratch, Qwen3 local LLM, RAG/LangChain/LangGraph/Claude API
GitHub
An AI relationship-management service that records gifts and cash contributions and recommends when, what, and how to reciprocate
GitHub