요청 한 건의 일생 6편 — 스트리밍과 읽기 복제본, 마지막 요청까지 지키는 종료
수십만 행을 메모리에 올리지 않고 내보내는 커서 스트리밍, 읽기 복제본과 복제 지연의 함정, 진행 중인 요청을 지키는 Graceful Shutdown, 그리고 요청 한 건의 타임라인과 운영 전 체크리스트로 시리즈를 닫는다.
blog92@web:~$ cd categories/backend
서버·API·인증 — 백엔드 개발 기록
수십만 행을 메모리에 올리지 않고 내보내는 커서 스트리밍, 읽기 복제본과 복제 지연의 함정, 진행 중인 요청을 지키는 Graceful Shutdown, 그리고 요청 한 건의 타임라인과 운영 전 체크리스트로 시리즈를 닫는다.
DB 조회를 아예 하지 않는 캐싱 계층부터 Cache Stampede, 바깥이 길고 안쪽이 짧아야 하는 타임아웃 체인과 쿼리 취소, 에러를 계층 경계에서 번역하는 법, 그리고 요청 하나를 끝까지 추적하는 관측성까지.
트랜잭션이 하나의 연결 위에서만 성립하는 이유와 격리 수준, 커넥션 풀이 고갈되는 장애 시나리오와 사이징 기준, 그리고 EXPLAIN ANALYZE와 N+1과 OFFSET 페이지네이션까지 실무에서 터지는 지점들을 본다.
커넥션 풀에서 연결을 빌리는 순간부터 DB 안에서 파서와 플래너와 실행기가 움직이는 과정, 그리고 결과 행이 DTO와 JSON을 거쳐 상태 코드와 헤더를 달고 클라이언트로 나가기까지를 따라간다.
요청이 애플리케이션 서버 안으로 들어온 뒤의 이야기. 소켓에서 req 객체가 만들어지는 과정과 싱글 스레드가 동시 요청을 처리하는 원리, 미들웨어 파이프라인, 그리고 Controller에서 Service를 거쳐 Repository까지 내려가는 계층 구조를 본다.
버튼 하나를 누른 요청이 DB에 닿았다가 돌아오기까지의 전체 지도를 먼저 그린다. URL 해석과 DNS, TCP와 TLS 핸드셰이크, 그리고 로드밸런서와 리버스 프록시가 요청에 무엇을 더하는지까지.
충돌하는 힘을 숫자로 적고, 팔 권한을 확인하고, 되돌리기 비용으로 정렬하는 선택 절차. 패턴이 안티패턴이 되는 세 경로와 판 것을 남기는 ADR. 시리즈 완결.
Health Check, Graceful Shutdown, Correlation ID, Leader Election을 시스템이 자기 상태를 선언하는 장치로 본다. 프로브 설정이 정하는 시간, 로그 저장 비용, 펜싱 토큰 없는 락의 한계.
배포는 원자적이지 않다는 전제에서 나오는 Expand-Contract, Feature Toggle, Canary, Sidecar. 배포 3배·토글 조합 1,024가지·canary 검출 하한이라는 가격표와 만료일을 박은 토글.
Nygard 계열 안정성 장치 여덟 개를 무엇을 막는가로 정리하고, 겹치는 순서와 설정값의 근거를 계산한다. 틀린 설정이 없는 것보다 나쁜 이유와 장치별 한계 이득.
CQRS의 세 단계와 단계별 비용, CQRS와 별개인 Event Sourcing이 읽기 모델을 사실상 강제하는 이유. 투영 재구축 시간, 업캐스팅, 잊힐 권리와의 충돌.
원자성 대신 보상을 사는 Saga의 Orchestration과 Choreography 비교, 상태 머신으로 쓴 조정자, Outbox 폴링·정리 비용과 멱등성 키의 보관 기간.
Bounded Context와 Context Mapping으로 경계를 긋고 커밋 로그의 동시 변경으로 후보를 검증한다. 조율 쌍 K(K−1)/2, 잘못 그은 경계의 수정 비용, Modular Monolith가 먼저인 이유.
외부 모델을 한 곳에 가두는 Anticorruption Layer와 레거시를 조각내 대체하는 Strangler Fig. 번역 비용을 측정 가능하게 모으는 법과 전면 재작성이 더 싼 규모의 계산.
Enterprise Integration Patterns 중 현역인 것들과 비동기 메시징이 파는 즉시성·순서·디버깅 가능성. 멱등 소비자와 DLQ 골격, 큐 대신 PostgreSQL 작업 테이블로 충분한 경우.
원격 경계에서 왕복 횟수·내부 구조 유출·흩어진 데이터·클라이언트별 요구를 다루는 네 패턴. 가용성 산술로 본 부분 실패 처리와 필드 하나당 늘어나는 매핑 지점.
GoF 23개 중 백엔드에서 살아남은 여덟 개의 서식지. Strategy와 Decorator를 클래스와 함수로 나란히 써 보고, 함수 버전이 사는 컴파일 타임 검사와 파는 발견 가능성을 비교한다.
값 객체·엔티티·애그리게이트·도메인 이벤트가 검증 지점을 줄이는 방식. 애그리게이트 크기와 동시성 충돌의 교환, 판별 유니온 대안, 경계 없이 전술 패턴만 사면 손해인 이유.
Layered·Hexagonal·Onion·Clean은 의존 방향이라는 한 규칙의 다른 그림이다. 의존성 역전을 클로저 하나로 구현하고, 유스케이스당 파일 7개와 필드당 8군데라는 가격표를 붙인다.
Repository만 넣고 Unit of Work를 빠뜨리면 트랜잭션 경계가 사라지는 이유. AsyncLocalStorage로 만든 최소 Unit of Work, Identity Map과 Lazy Load의 대가, 쓰기와 조회 경로의 분리.
blog92@web:~$ cd ..