SERIES

ZZOL 개발록

12 Posts·Last updated on 2026년 02월 17일 09:02

사이드 프로젝트에서 실제 서비스까지: ZZOL(커피빵) 기획과 그 시작

2025년 07월 07일 09:07

프로젝트명 - 한글 커피빵 프로젝트명 - 영어 CoffeeShout 프로젝트 주제 똥손도 즐기는 커피빵 전쟁 프로젝트 목적 및 설명 커피 내기를 재미있고 간편하게 할 수 있도록 만든 플랫폼 점심시간마다 반복되는 커피 내기를 좀 더 유쾌하고 흥미롭게 즐길 수 있도록


누가 우리 서비스를 쓸까? : 페르소나 정의를 통한 타겟 유저 구체화

2025년 07월 08일 09:07

커피빵(CoffeeShout): 똥손도 즐기는 커피빵 전쟁 목표 커피 내기, 재미있게 해보자! 매일 똑같은 가위바위보 그만! 핵심 기능 미니게임을 통한 가중치 기반 룰렛 시스템 기능 세부사항 방을 만든다. 초대 코드로 참가 가능. 사용자들이 해당 방에 입장한다. 메뉴 선택. 미니게임을 통해 확률을 조절한다. 룰렛을 돌려서 당첨자를 뽑는다. 당첨자가 메뉴 …


Spring WebSocket 내부 동작 원리 파헤치기

2025년 08월 12일 09:08

how_spring_injects_httpsession 이 포스트를 읽고 오면 이해가 더 잘 됩니다! Spring에서 어떻게 WebSocket 연결을 수립할까? 그 과정을 찾아가보자. Spring에서 연결방식을 WebSocket으로 업그레이드 하는 방법 handshake 성공 후에는? 물리적 TCP 연결은 동일함 메시지들은 DispatcherServlet…


모바일 백그라운드 전환 시에도 끊김 없는 WebSocket 연결 경험 만들기

2025년 08월 13일 09:08

문제 상황 mvp를 빠르게 만들고 테스트를 하던 중, 다른 앱을 사용하다가 다시 돌아오면 웹소켓 통신이 안된다는 것을 발견했다. 찾아보니 모바일이든 pc의 각각의 기기에서 앱을 전환할 때 환경에 맞게 백그라운드에서 웹소켓을 유지하는 시간이 달랐고, 테스트를 결과 아이폰이나 맥북 기준 대부분 4~5초이내로 연결이 중단되는 것 같다. 또 클라이언트 코드에서도…


스레드풀, 감으로 잡지 마세요: 부하 테스트로 증명하는 최적의 설정값

2025년 09월 27일 11:09

커피빵(CoffeeShout) 서비스의 WebSocket 스레드풀을 부하 테스트 기반으로 튜닝했다. "스레드 몇 개가 적절한가?"라는 질문에 감이 아닌 데이터로 답을 내리는 과정을 기록한다. 왜 스레드풀 튜닝이 필요했는가 커피빵은 실시간 멀티플레이어 게임 서비스다. 여러 명이 방에 모여서 미니게임을 하고, 룰렛으로 당첨자를 뽑는다. 모든 게임 진행이 We…


단일 서버에서 분산 환경으로: 확장성 있는 아키텍처로의 전환

2025년 10월 13일 09:10

단일 인스턴스 목표 TPS 커피빵은 게임 기반 실시간 서비스이기 때문에 유저 간의 양방향 통신을 위해 웹소켓 통신을 이용하고 있다. 웹소켓 통신의 경우 서버가 각 클라이언트의 구독 상태를 세션별로 메모리에서 관리하고 있는데, REST API와는 다르게 연결이 지속적으로 유지되면서 이벤트 브로드캐스팅과 메시지 라우팅을 처리해야 한다. 이 과정에서 동시 접속…


Redis Pub/Sub을 활용한 다중 서버 간 실시간 메시지 동기화 전략

2025년 10월 14일 09:10

infra_design 지난 글에서 이어집니다! Redis pub/sub Redis Pub/Sub의 동작 원리를 이해하면 왜 이 방식이 실시간 게임 동기화에 적합한지 명확해진다. Redis 내부 구조 Redis 서버는 C로 구현되어 있으며, Pub/Sub 기능은 내부적으로 매우 단순한 자료구조로 동작한다. Redis 서버의 구조체는 다음과 같은 Pub/…


커피빵에서 ZZOL로, 유저가 알려준 진짜 서비스

2025년 11월 19일 15:11

우테코 프로젝트에서 서비스 기획을 전면 수정했다. 원래 "커피 내기" 서비스였던 커피빵(CoffeeShout)을, "똥손도 즐기는 게임 기반 추첨 서비스" ZZOL(쫄)로 바꿨다. 왜 바꿨고, 뭘 바꿨는지 기록한다. 원래 기획: 커피빵(CoffeeShout) 커피빵의 출발점은 단순했다. "점심 먹고 커피 누가 살래?"라는 상황이다. 직장인이면 매일 한 번…


WebSocket 서비스에서 Graceful Shutdown이 필요한 이유와 구현

2025년 12월 29일 11:12

ZZOL 서비스에 Graceful Shutdown을 구현했다. 단순히 "서버를 안전하게 끄자"가 아니라, WebSocket 기반 실시간 게임 서비스에서 "게임 중인 유저의 세션을 어떻게 보호할 것인가"에 대한 이야기다. OS의 SIGTERM 시그널부터 Spring의 SmartLifecycle, 그리고 WebSocket 세션 드레이닝까지의 전체 과정을 기록…


쿼리 최적화, 36초를 1초로 줄이기까지

2026년 02월 05일 09:02

우테코 프로젝트 에서 대시보드 API 성능 개선 작업을 했다. 레이싱 게임 TOP 플레이어 조회 API가 너무 느려서 원인을 파악하고 개선하는 과정을 기록해본다. 문제 상황 dev 환경에 데이터를 넣고 API를 호출해보니 응답이 너무 느렸다. 로 쿼리 실행 계획을 확인해봤다. 문제는 두 가지였다. 테이블 풀스캔 (20만 건) 60만 건짜리 임시 테이블 …