배포 변경점 검증의 사각지대 — 캐시 캠페인 장애 회고

배포는 이틀 전에 끝났지만 변경점은 적용되지 않은 채 잠재해 있었다. 캐시 갱신 배치를 끄는 순간 광고 서빙이 멈췄다. 배포 변경점 검증의 부재를 회고한다.

2024년 11월 27일 · 약 2분 읽기

Envoy — 정적 reverse proxy가 cloud-native에서 마주친 한계

수동 reload, 정적 upstream, 빈약한 L7 observability — 정적 reverse proxy가 cloud-native 환경에서 마주친 한계를 Envoy의 xDS와 filter chain이 어떻게 푸는지 정리한다.

2024년 7월 10일 · 약 4분 읽기

백엔드 개발자가 알아야 할 VPC

VPC 의 격리·라우팅·연결·보안 네 갈래를, 백엔드 개발자가 실제로 마주치는 결정 중심으로 한 자리에 모았다.

2024년 6월 17일 · 약 9분 읽기

세 가지 타입 시스템과 런타임 — JVM, CPython, Go 컴파일러

Java 는 강타입 + JVM 바이트코드 + JIT 의 적응형 최적화. Python 은 동적 타입 + 인터프리터 + 선언적 type hint. Go 는 정적 + structural typing + 단일 컴파일러. 타입 시스템 결정이 런타임 매커니즘을 결정한다.

2024년 6월 16일 · 약 5분 읽기

Web Server, WAS, Reverse Proxy — 각자 다른 문제를 푼다

세 도구는 같은 자리에 보이지만 풀어내는 문제가 다르다. 정적 컨텐츠 전달, 동적 컨텐츠 생성, 트래픽 중개를 어떻게 나눠 갖는지 정리한다.

2024년 6월 15일 · 약 3분 읽기

세 가지 동시성 모델 — GIL, Virtual Thread, Goroutine

CPython 의 GIL 은 멀티스레드 CPU bound 를 차단하고 우회법을 강제한다. Java 는 OS 스레드 1:1 의 비용을 Java 21 virtual thread 로 우회해 thread-per-request 를 살렸다. Go 는 처음부터 M:N 스케줄러로 goroutine 을 경량화했다. 세 모델이 같은 백엔드 워크로드에서 다른 결정으로 이어진다.

2024년 6월 15일 · 약 5분 읽기

세 가지 가비지 컬렉터 — Java, Python, Go 의 메모리 회수

세 언어 모두 GC 를 쓰지만 우선순위가 다르다. Java 는 generational + region(G1/ZGC), Python 은 reference counting + cyclic detector, Go 는 concurrent tri-color mark-sweep. 각 GC 가 무엇을 포기했는지가 운영 특성을 가른다.

2024년 6월 14일 · 약 5분 읽기

모든 것은 값 복사다 — Go, Java, Python 의 메모리 전달

함수에 객체를 넘기는 동작을 ‘참조 전달’ 이라 부르지만 메모리에서는 모두 값 복사다. Java reference value 복사, Python call by sharing, Go 구조체 헤더와 escape analysis. 무엇이 복사되느냐가 다를 뿐 메커니즘은 같다.

2024년 6월 13일 · 약 6분 읽기

TLS 실무: 세션 재개, mTLS, 인증서 자동 발급

기본 핸드셰이크 위에서 TLS를 운영하는 세 가지 실무 주제를 정리한다. 세션 재개와 0-RTT로 반복 비용을 줄이고, mTLS로 클라이언트까지 인증하고, ACME로 인증서 발급과 갱신을 자동화한다.

2024년 4월 12일 · 약 4분 읽기

Kubernetes 기초

Container 오케스트레이션의 기본 구조와 백엔드 개발자가 알아야 할 핵심 오브젝트, 네트워크, 스케일링, 운영 방법을 정리한다.

2024년 4월 10일 · 약 6분 읽기