관리자 예약 목록 API `Broken pipe` 해결기 — 루프 안 N+1과 공유 DTO 반복 생성
관리자용 예약 목록 API가 Broken pipe를 뱉던 원인을 추적해 루프 안 N+1 · 공유 Venue DTO 반복 생성 · 무제한 조회 세 가지를 구조로 풀고, DB 쿼리를 2,500회에서 5회로 줄인 과정을 정리합니다.
10개의 글
관리자용 예약 목록 API가 Broken pipe를 뱉던 원인을 추적해 루프 안 N+1 · 공유 Venue DTO 반복 생성 · 무제한 조회 세 가지를 구조로 풀고, DB 쿼리를 2,500회에서 5회로 줄인 과정을 정리합니다.
미독 채팅 개수를 구하는 단순한 API가 커넥션 풀을 고갈시키던 원인을 추적해, `SELECT *` + 앱 레벨 `count`와 `@Convert(KmsStringConverter)` 조합이 만든 KMS Decrypt 호출 폭주를 드러내고, 단일 `COUNT(*)` 집계 쿼리로 전환해 해결한 과정을 정리합니다.
수직 분할과 수평 분할의 차이, MySQL 8.4가 지원하는 RANGE/LIST/HASH/KEY 파티셔닝의 쓰임과 제약을 공식 문서 기준으로 정리합니다.
반정규화가 무엇인지, 어떤 읽기 병목을 줄이기 위해 쓰는지, 그리고 정합성·갱신 비용을 어떻게 감수해야 하는지 공식 문서 기준으로 정리합니다.
OFFSET/LIMIT 페이지네이션이 왜 뒤로 갈수록 느려지는지, 커서 기반 조회는 어떤 조건에서 유리한지, 정렬과 인덱스를 어떻게 설계해야 하는지 실무 기준으로 정리합니다.
N+1 쿼리가 무엇인지, 왜 성능을 망가뜨리는지, JPA와 서비스 레이어에서 어떻게 발생하는지, 그리고 어떤 방식으로 해결해야 하는지 정리합니다.
채팅 목록 전용 요약 API가 이름만 가벼웠던 이유를 추적하고, 응답 필드 최적화와 배치 조회로 DB 쿼리를 약 80% 줄인 과정을 정리합니다.
EXPLAIN 출력의 각 컬럼이 무엇을 뜻하는지, 옵티마이저가 왜 그 계획을 골랐는지, 조인과 서브쿼리는 어떻게 읽는지 예제와 함께 정리합니다.
인덱스가 있는데도 풀 스캔이 나오는 이유를 함수 가공, 암묵적 형변환, 복합 인덱스 순서, 선택도 관점에서 정리합니다.
`innerJoin`으로 인한 누락, 불필요한 Redis 캐싱, 중복 모델 문제를 쿼리 최적화와 레이어 정리로 해결한 과정을 공유합니다.