Bringing Ideas to Life
Backend Developer
Welcome to Seokwon Choi's portfolio.
Made by SeokWon Choi
IPA [sʰɘ(ː)k̚ wʌn ʧɔɪ]
Timeline
Personal - MIRAGE
(2012 ~ 2013)
안드로이드 커스텀 ROM
Personal - AjouBot
(2020-12 ~ 2022-12)
카카오톡 아주대학교 챗봇
Team - DApp Lottery
(2022-11 ~ 2022-12)
FE 2 + BE 1
DApp Lottery (Ethereum Token)
Role: Token development and deployment, server/chatbot/FE development, testing.
Personal - KakaoPI
(2022-04 ~ 2022-06)
Control Raspberry Pi via KakaoTalk
(C, Python, Rust, S3)
Personal - AjouLibra
(2022-04 ~ 2022-06)
Ajou University Library Book Recommendation website
(Rust, WASM, Reactjs)
Timeline
Personal - Hi-Rust
(2023-03 ~ 2023-05)
Rust Language Basic Tutorial
(YouTube video production and front-end development)
Team - k-pullup
(2024-02 ~ Maintenance)
FE 1 + BE 1
South Korea Pull-up bar Map
Role: Backend development
Team - BeautyMinder
(2023-09 ~ 2023-12)
FE 4 + BE 1
Comprehensive Skincare Management App Based on Baumann Skin Type Test
Role: Backend development and front-end test/refactor
Timeline
Personal - GoWave
(2025-03 ~ )
Cryptocurrency Autotrader (Fullstack)
Simplified Server Architecture
k-pullup (Intro)
Homepage
k-pullup (Key Achievements)
Proactive Server Monitoring and Issue Resolution
Technical Validation and MySQL Selection for Optimizing Spatial Data Search Performance
To implement pull-up bar and photo availability filtering in a dataset of over 5,000 location-based records, various spatial database technologies such as Neo4j, Redis Geo, and MySQL were analyzed for performance and feasibiltiy.
1. Neo4j offered fast query execution but introduced compelx queries and integration challenges.
2. Redis Geo was efficient for simple proximity searches but lacked flexibility for multi-condition filtering.
3. MySQL was ultimately chosen for its R-Tree indexing and optimized spatial fuinctions.
By Implementing a real-time server monitoring system using Prometheus and Grafana, potential server overload caused by increased asynchronous tasks was proactively detected. Deep analysis using pprof quickly identified and fixed a bug in a specific scheduler function that was generating excessive tasks.
This approach eliminated potential system instability in advance, ensuring a stable service environment.
k-pullup Retrospective (1/2)
The k-pullup project is a service that utilizes the KakaoMap API to provide information on pull-up bar locations across South Korea. Users can explore pull-up bar locations on the map and engage with the community through chat and comments to share and exchange information. As the lead backend developer, I focused on enhancing real-time communication features by implementing a WebSocket-based chat system. Throughout this process, I explored various approaches to tackle message delivery and synchronization issues in a distributed environment. Initially, WebSocket connection objects were stored in each server instance’s local memory to enable fast message broadcasting. However, this approach led to inconsistencies in message delivery between users in the same chatroom, as each server instance operated independently. Messages were only delivered to users connected to the same server instance, leaving others disconnected from the conversation. As the number of users increased, memory usage became a bottleneck, and scaling the system became challenging. This experience emphasized the need for a centralized approach to WebSocket message distribution to ensure consistency and scalability.
k-pullup Retrospective (2/2)
The WebSocket chat system initially used Redis Pub/Sub for inter-server message distribution but faced issues with message loss, unordered delivery, and duplication. Since chat reliability was critical, RabbitMQ was introduced to ensure message durability, order preservation, and deduplication. RabbitMQ’s queue persistence, TTL settings, and subscription management effectively resolved Redis Pub/Sub’s limitations, enabling stable multi-instance communication. After implementation, message delivery was consistent across all server instances, ensuring seamless chat synchronization for users. Performance tests showed that with 1,000 concurrent users exchanging 1 million messages over 5 minutes, the system achieved 3,548 transactions per second and remained stable at 1,900 MAU. Optimizations using pprof reduced unnecessary memory allocations and improved throughput under high load. This experience reinforced the importance of selecting technology based on system requirements rather than trends, emphasizing reliability, scalability, and continuous optimization.
Simplified Server Architecture
BeautyMinder (Introduction)
App pages
Server Intro video (Korean)
https://drive.google.com/file/d/1qmZeDkotOl2LtDT5LzZhO-RpvZbXBqOS/view?usp=sharing
BeautyMinder (Key Achievements)
Real-Time Trend-Aware Ranking System Development
Implemented a real-time search ranking system by integrating a Redis-based caching system with statistical significance and time decay techniques. To overcome the limitations of frequency-based rankings and better reflect actual user trends, a Z-score-based spike detection algorithm and time decay weighting were applied. This prevented short-term noise from distorting rankings while ensuring rapid adaptation to emerging trends, ultimately enhancing user satisfaction by delivering high-quality ranking insights.
OCR-Based Expiration Date Recognition Enhancement
Enhanced an automated cosmetic expiration date extraction system using Google Vision OCR API and custom regex patterns. Addressed recognition errors caused by varying date formats among Korean cosmetic brands by designing regex patterns for YYYY.MM.DD, YY/MM/DD, EXP YYYY-MM-DD, and more. Added correction logic to refine incomplete OCR results. Testing showed over 90% accuracy, significantly improving system reliability while reducing manual input inefficiencies and laying the groundwork for automated product management.
BeautyMinder Retrospective (1/2)
The BeautyMinder project is an app that provides personalized cosmetic recommendations based on the Baumann Skin Type Test. It was developed to offer users reliable cosmetic information and a convenient product management experience. As the lead backend developer, I was responsible for API development, system architecture design, deployment, and frontend integration, overseeing the entire backend system.
One of the key objectives was ensuring backend system stability, and to systematically manage code quality, I actively utilized JaCoCo for test coverage analysis. In the early development phase, I prioritized writing unit tests for core APIs and business logic. However, as the project scaled and complexity increased, I realized that unit tests alone were insufficient to cover all execution paths. In particular, I identified the need to validate interactions between different modules and exception handling logic, as these could introduce potential runtime errors and unexpected edge cases in production.
BeautyMinder Retrospective (2/2)
To address these challenges, I integrated JaCoCo to improve test quality and measure code coverage. JaCoCo provides visual reports on which parts of the code were executed during tests, making it easier to identify untested areas. I regularly analyzed these reports and incrementally expanded test coverage by adding integration tests, boundary tests, and exception handling tests.
Through continuous refinement, I improved the project-wide test coverage to 82%, ensuring greater stability and early detection of potential defects. During pre-deployment testing, JaCoCo reports helped identify missing exception handling logic, which was fixed before release, enhancing overall service reliability.
Additionally, adopting a habit of writing tests naturally improved code quality and reduced development risks. This experience reinforced the importance of testing from the early stages of development. It highlighted the need to balance functionality, code quality, and system stability rather than focusing solely on implementation. Moving forward, I aim to proactively integrate testing strategies and leverage tools like JaCoCo to maintain high-quality, reliable systems.
I will continue striving to become a better developer.
Thank you.