gi - Log cover

gi - Log

채팅 메시지 파이프라인 분리 아키텍처

채팅 메시지 파이프라인 분리 — DB 지연에서 실시간 송신을 격리하기

메시지 처리율 12%, 48,573건 유실. Queue 분리와 파티셔닝으로 Delivery avg 0.33ms를 달성한 과정.

Redis Spring Boot WebSocket 성능최적화 아키텍처
post cover

매칭됐는데 채팅방이 없다 — Transactional Outbox Pattern으로 이벤트 유실 0건 달성하기

동기 호출로 연결된 매칭-채팅 서비스에서 장애 전파와 채팅방 누락이 발생했다. Outbox Pattern과 Redis Streams로 서비스를 격리하고 이벤트 유실 0건을 달성한 과정.

Transactional Outbox Redis Streams Spring Boot 마이크로서비스 아키텍처
post cover

Index 및 최적화 및 회고

인덱스 추가만으로는 실행 계획이 바뀌지 않았다. 데이터 분포를 근거로 WHERE 조건을 재작성하여 2683ms → 829ms, 69% 개선을 달성한 과정.

MySQL SQL Index 성능최적화
post cover

EXPLAIN과 병목 탐색

EXPLAIN ANALYZE로 gym_booking의 활성 회원 집계 쿼리가 왜 느린지 증명하고, 병목을 찾는 절차를 정리한다.

MySQL SQL EXPLAIN 성능최적화
post cover

Dummy Data

쿼리 튜닝의 전제 조건인 백만 단위 더미 데이터를 생성하고, 데이터 분포 특성이 인덱스 설계 방향을 결정하는 과정.

MySQL SQL 성능최적화 데이터
post cover

동시 스와이프가 만드는 두 가지 함정 — Ordered Lock Key로 Race Condition과 데드락을 한 번에 해결하기

A→B, B→A 동시 스와이프 시 중복 매칭과 데드락이 발생하는 구조적 문제를 Redisson 분산 락과 ID 정렬 기반 단일 락 키로 해결한 과정.

Redisson 분산락 Race Condition 동시성 Spring Boot
post cover

ERD 및 구조

gym_booking 스키마의 ERD와 조인 경로를 분석하고, 성능 병목의 중심인 user_memberships 테이블을 파악한다.

MySQL SQL ERD 성능최적화
post cover

GYM Booking - Preview

gym_booking DB 구성부터 더미 데이터, EXPLAIN 분석, 인덱스 최적화까지 전 과정을 기록한 SQL 튜닝 시리즈 개요.

MySQL SQL 성능최적화 EXPLAIN
티케팅 실서비스 회고

설계한 시스템에 실제 100명이 몰렸다 — 티케팅 실서비스 회고

k6로 1,000 VU를 쏟아부은 부하 테스트에서는 문제가 없었습니다. 그런데 실제 100명의 학생이 동시에 버튼을 누르는 순간, Grafana에는 어떤 그래프가 그려졌을까요?

Redis MySQL Grafana 티켓팅 회고
PostGIS 역지오코딩 시스템

GPS 좌표에 맥락을 더하다 — PostGIS 역지오코딩 시스템 구축기

GPS 좌표 하나로는 '어디'인지 알 수 없습니다. 행정구역, POI, 도로 정보를 PostGIS 공간 쿼리로 통합하고, GiST 인덱스 최적화로 1500ms → 45ms까지 개선한 역지오코딩 시스템 구축 과정을 공유합니다.

PostGIS PostgreSQL 공간데이터 역지오코딩 성능최적화
post cover

수천 명이 동시에 눌러도 overselling 0건 — Redis ZSet과 MySQL 조건부 UPDATE의 이중 재고 경로

Redis ZSet의 ZPOPMIN 하나로 재고 차감과 티켓 번호 부여를 원자적으로 해결하고, MySQL 조건부 UPDATE와 Unique Constraint로 3중 안전장치를 구성하여 overselling 0건을 달성한 과정을 공유합니다.

Redis MySQL 동시성 티켓팅 Spring Boot