이주호 — 백엔드 개발자
Java·Spring / TypeScript·NestJS 기반 백엔드 개발자입니다. 트랜잭션·정합성·성능 최적화에 관심이 많고, 학습한 것을 기록으로 남깁니다.
소개 · 링크
- 💻 GitHub — lsc713
🗂️ 주제별 글
커머스 백엔드를 카타로 쌓다 (연재) — 불변식·경합·경계
- 00. 서문 — 백엔드 설계를 압축한 세 질문
- 01.돈을 primitive로 두면 언젠가 샌다 — 값 객체·불변·반올림
- 02.불변식은 누가 지키나 — 애그리거트 루트
- 03.동시에 사면 초과판매된다 — 낙관·비관·원자적 UPDATE
- 04.두 번 취소해도 한 번만 — 멱등성·유니크 제약
- 05.save가 INSERT가 아니었다 — Persistable·merge 함정
- 06.기다리게 하지 말고 거절하라 — IN_PROGRESS 상태기계
- 07.트랜잭션 안에서 HTTP를 부르지 마라 — 외부호출 경계·Port/Adapter
- 08.응답을 못 받았다는 실패가 아니다 — UNKNOWN이라는 세 번째 상태
- 09.요청 하나에 쿼리 1+N — N+1·fetch join
- 10.5만 행을 1행으로 — EXPLAIN 읽기·인덱스
- 11.같은 걸 두 번 묻지 않기 — 캐시 두 층
- 12.가짜는 내가 시킨 답만 한다 — 설계를 실물에 붙이기·실 PG 연동·멱등 실측
- 13.분명히 잡았는데 터졌다 — 트랜잭션 전파·REQUIRES_NEW·rollback-only
- 14.5개 주세요 했는데 5만 개를 읽었다 — fetch join 페이징 함정·배치 페치
- 15.순수하게 만들었더니 저장이 사라졌다 — 헥사고날·도메인 순수성
- 16.설정 한 줄 바꿨더니 세 번 터졌다 — 분산 캐시(Redis)·직렬화·스탬피드
- 17.두 번 뺐는데 한 번만 빠졌다 — 격리수준·lost update·락·데드락·MVCC
- 18.분명히 REQUIRES_NEW인데 같이 사라졌다 — 전파 프록시 함정·self 주입·NESTED·checked 롤백규칙
- 19.손으로 안 띄워도 되는 테스트 — 테스트 격리·@DataJpaTest·H2 지뢰·Testcontainers
부하가 드러낸 설계 (연재) — 실측으로 잡고 증명하고, 관측을 코드로
1막 · 실측으로 잡고 증명하다
- 00. 서문 — 코드 리뷰가 못 보는 것을 부하가 본다
- 01.사설 IP 9대에 실측 판을 깔다 — 핫/콜드 분리·single-AZ·SSM
- 02.DB를 키웠더니 병목이 숨었다 — 인스턴스 사이징
- 03.서버는 필요할 때만, 이미지는 바뀔 때만 — CI→Docker Hub→온디맨드
- 04.배포가 세 번 터졌다 — SG 한글·SSM 문서명·개행
- 05.190은 용량이 아니었다 — Little’s law·풀 고갈
- 06.10명인데 7.63%가 실패했다 — baseline이 잡은 결함
- 07.한 가맹점에 몰았더니 99.9%가 튕겼다 — 축B 경합 스윕
- 08.데드락인 줄 알았다 — 기다리지 않는 분산락(fail-fast)
- 09.거절을 대기로 바꿨다 — 원자 조건부 UPDATE·99.9%→0%
- 10.SSM 고고학을 그만두다 — 관측을 GUI로
- 11.캐시를 껐는데 아무 일도 안 났다 — HTTP-in-TX의 숨은 절벽·조기최적화 경계 2막 · 관측을 코드로, 코드를 재측정으로
- 12.요청당 쿼리 수와 APM — black-box 사각을 코드레벨 관측으로(쿼리수·APM)
- 13.동기 홉인 줄 알았다 — 185 벽의 정체는 커밋수(홉·풀 아님)
- 14.이력 3커밋을 1로 — 감사 불변식 지키며 배치, 커밋 6→4
- 15.147을 220으로 — 재측정 확증, 처리량 ×1.5 3막 · 발행을 떼어내다 (Outbox·라이브락·격리)
- 16.동기 발행의 6퍼센트 — dual-write·발행 3모드, 동기 ack의 +6%
- 17.최적화가 병을 키웠다 — Outbox 폴러 라이브락(공유 풀 굶음)
- 18.전용 풀로 라이브락을 부수다 — 스레드풀≠커넥션풀·Bulkhead 격리
- 19.CDC를 안 쓰기로 했다 — 근거 있는 YAGNI·measure-first의 나머지 절반 4막 · 생성 너머: 소비·현실·정직성
- 20.발행만 보고 소비는 안 봤다 — 소비/정합성 축(lag·DLQ·e2e)·우발적 장애 주입
- 21.균등 100퍼센트는 거짓말이었다 — 현실 편중·타이트 한도·거부는 정직한 4xx 5막 · 처리량에서 지연으로
- 22.같은 190인데 p95가 20배 달랐다 — open vs closed·같은 rps 다른 p95·Little’s law·SLO 봉투
분산 이커머스 신뢰성 설계 (연재) — 빠른 정상 경로보다 실패 뒤의 수렴을 먼저 정하다
- 01.JWT를 한 번만 검증해도 되는가 — 신뢰 헤더·역할 인가·NetworkPolicy
- 02.재고는 결제 전에 잡고 취소 뒤에 돌려준다 — 동기 예약·비동기 복원·멱등성
- 03.순서를 포기하고 수렴을 택했다 — 파티션 키·전체 재계산·주문 행 잠금
- 04.10초 폴링을 기다리지 않는 Outbox — wake relay·poll backstop·DEAD·retention
- 05.Redis가 없어도 취소는 계속된다 — Redis·DB snapshot·원본 HTTP 3단계 조회
k3s 수평 스케일아웃 (연재) — 여러 대로 안전하게, 그리고 정말 빨라지나
Load가 한 대의 천장(DB 커밋)을 규명했다면, 이 시리즈는 그 시스템을 k3s에 올려 수평으로 늘린다. 1막 · 여러 대로 안전하게
- 00. 서문 — Load 다음, 왜 k3s인가
- 01.자립 리그를 k3s로 깔다 — 노드 구성·Strimzi·Traefik·flannel·외부 DB 고정
- 02.파드가 늘면 뭐가 깨지나 — UK·Redisson 분산락·dedup, 멀티파드 정합성
- 03.노드가 죽어도 — drain·self-heal·anti-affinity(fail 0%·짧은 블립)
- 04.배포가 조용히 터진다 — surge 데드락·preStop 엔드포인트 레이스(A/B) 2막 · 늘리면 정말 빨라지나
- 05.replica가 천장을 올린 줄 알았다 — noisy-neighbor 아티팩트, 격리가 뒤집다
- 06.4단 진단 끝에 payment_db — ×3·flush·merchant·CPU스냅샷→2vCPU 혼합 바운드
- 07.운영 함정 — vCPU 쿼터 32·버스트 착시·DB 재시작 커넥션
- 08.매니페스트 행단위 해부 — payment.yaml 한 줄씩, 없으면 뭐가 터지나
백엔드 · 아키텍처
- DDD와 헥사고날 아키텍처 — 도메인 경계를 코드로 강제하기
- JPA 영속성 컨텍스트 — save 후 findById가 SELECT를 안 하는 이유
- 결제 취소 멱등성 설계 — 중복 취소 요청 차단
- InnoDB 내구성 — 커밋은 왜 비싼가 — fsync·redo·checkpoint·crash recovery·2PC
- InnoDB 동시성 — undo log의 두 얼굴 — MVCC·Read View·purge·FOR UPDATE
- ThreadLocal — 스레드별 사물함 — 격리·remove 계약·약참조 누수 구조
- 동시성 제어 4종 — 락 결정 트리 — 원자·낙관·비관·분산락 언제 쓰나
- TypeORM 마이그레이션 — 스키마 버전 관리의 원리
- 쿠버네티스 정리 — 파드·컨트롤러·서비스 한눈에
검색 · AI
- 0.임베딩에서 하이브리드 검색까지 — lexical → semantic → hybrid
- 2.Reranker 크로스 인코더 — cross-encoder 재정렬
- 1.검색 쿼리 변형과 청킹 — query rewrite · HyDE · title-prepend
장애대응 오케스트레이터 (LLM을 파이프에 안전하게 엮기)
- 1.e2e 데모가 잡아낸 두 버그 — backstop이 try 안에 있던 죄
- 2.장애 도구가 장애에 죽지 않게 — SourceResult로 부분 실패를 1급 시민으로
- 3.LLM에게 도구를 주되 가두기 — 제한적 tool-calling 에이전트
- 4.LLM이 코드를 고치되 머지는 사람만 — draft PR을 안전 경계로
- 5.LLM을 못 믿어 결정론 레일을 깔았다 — SuspectLocator + 백스톱
- 6.알림 폭풍에 스팸 PR을 안 만들기 — 수집·알림·행동 다층 dedup
- 7.orchestrator 언제 무엇을 수집할지 — 조건부 오케스트레이션·OCP
- 8.패키지 구조가 서사를 증명하게 — analyzer 분할, 결합 7→0
카오스 엔지니어링 · 관측가능성 (장애를 '구별 가능'하게)
- 0.서문 — 장애를 단 하나의 신호로 구별되게 만든 벤치
- 1.스택트레이스가 곧 원인인 유일한 순간 — Class A NPE와 관측 토대
- 2.p99가 튀는데 아무도 안 던졌다 — 지연·에러비율은 증상이지 원인이 아니다
- 3.200 OK인데 답이 틀렸다 — 침묵의 오염과 오라클
- 4.top frame은 표면이지 원인이 아니다 — 오진 함정
- 5.느린 쿼리의 진짜 범인은 인덱스 — EXPLAIN이 가르고 자동 패치는 멈춘다
- 6.커넥션을 안 돌려줬다 — HikariCP 풀 고갈
- 7.CPU가 남는데 스로틀당했다 — k8s CFS 쓰로틀
- 8.컨슈머가 못 따라잡았다 — Kafka 큐 백프레셔
- 9.멈춘 건 GC였다 — GC 폭주와 pause rate
- 10.다 멈췄는데 데드락은 아니다 — 락 경합 vs 데드락(BLOCKED 인구조사)
- 11.요청 하나에 쿼리 1+N — N+1을 요청당 쿼리 수로
- 12.캐시 만료에 떼로 몰렸다 — 캐시 스탬피드 herd
프론트엔드
- 리액트 간단히 — 데이터 흐름과 컴포넌트 설계
알고리즘
🏷️ 태그로 둘러보기
backend · architecture · ddd · jpa · kata · concurrency · idempotency · payment · kubernetes · search · algorithm · frontend · chaos-engineering · observability · sre · load-testing · aws · reliability · distributed-systems · kafka · outbox