작업 스케줄러 설계 — 하루 1억 건 비동기 작업을 지연 없이 처리하는 법
한 줄 요약: 작업 스케줄러의 핵심은 Kafka 파티셔닝으로 처리량을 수평 확장하고, Redis Sorted Set으로 지연 실행을 마이크로초 단위로 제어하며, 분산 락으로 크론 중복 실행을 원천 차단하는...
한 줄 요약: 작업 스케줄러의 핵심은 Kafka 파티셔닝으로 처리량을 수평 확장하고, Redis Sorted Set으로 지연 실행을 마이크로초 단위로 제어하며, 분산 락으로 크론 중복 실행을 원천 차단하는...
한 줄 요약: 스트리밍 플랫폼의 핵심은 RTMP 인제스트 → DAG 트랜스코딩 → 멀티 CDN HLS/DASH 배포의 3단 파이프라인으로 1억 시청자를 감당하고, Redis HyperLogLog·Sorte...
한 줄 요약: 정산 시스템의 핵심은 정확성과 감사 가능성(Auditability)이다. float 한 줄, 배치 한 번의 실수가 수천 셀러에게 1원씩 빠지는 사고로 이어진다. 모든 돈의 흐름에는 검증 가능...
한 줄 요약: 셀러 관리 시스템의 핵심은 입점 심사 자동화로 운영 병목을 없애고, 스코어링 엔진으로 셀러 품질을 실시간 추적하며, 정산 파이프라인으로 분쟁을 원천 차단하는 것이다.
한 줄 요약: 반품·환불은 주문의 역방향이 아니다. 금액 분배, 재고 복원, 물류 수거, 어뷰징 탐지까지 독립적으로 설계해야 하루 10만 건을 실수 없이 처리할 수 있다.
한 줄 요약: 프로모션·동적 가격 시스템의 핵심은 룰 엔진으로 할인 충돌을 우선순위 기반으로 해소하고, 이벤트 소싱으로 가격 이력을 불변 보존하며, CDC 파이프라인으로 검색·목록·상세 페이지 전체에 가격...
한 줄 요약: 메트릭 파이프라인은 수집 에이전트가 데이터를 밀어 넣고, Kafka가 폭발을 흡수하며, 시계열 DB가 압축 저장하고, 알림 엔진이 이상을 감지하는 4계층 구조다. 각 계층이 독립적으로 확장 ...
한 줄 요약: 멤버십 시스템의 핵심은 구매 이벤트를 소싱해 등급을 실시간으로 산정하고, 포인트 원장을 이중 원장 구조로 관리해 잔액 불일치를 원천 차단하며, 혜택 엔진을 룰로 분리해 배포 없이 정책을 바꾸...
한 줄 요약: 풀필먼트 시스템의 핵심은 세 가지다. 주문 할당 엔진으로 올바른 센터를 고르고, 피킹 최적화로 창고 이동 거리를 줄이며, 재고 실시간 동기화로 “있다고 표시된 물건이 실제로 있음”을 보장한다...
한 줄 요약: 사기 탐지는 속도와 정확도의 트레이드오프가 아니라, 룰 엔진으로 명백한 사기를 0ms에 차단하고, ML 스코어링으로 모호한 거래를 판정하며, 피드백 루프로 날마다 더 영리해지는 레이어드 방어...
한 줄 요약: 분산 락의 핵심은 “원자성”과 “소유권 증명”이다. SET NX 한 줄로 락을 걸 수 있지만, 잘못 설계하면 10만 TPS 트래픽 앞에서 이중 결제, 재고 음수, 중복 배송이 동시에 터진다....
한 줄 요약: API Gateway는 단순한 리버스 프록시가 아니라, 인증·Rate Limit·Circuit Breaker·변환을 한 곳에 응집시켜 수백 개의 마이크로서비스를 클라이언트로부터 격리하는 시스...
한 줄 요약: 커머스 광고 플랫폼의 핵심은 후보 선별 → 입찰 → 랭킹 3단계 서빙 파이프라인으로 50ms 내 응답하고, Redis 원자 차감으로 예산 초과를 막으며, 스트리밍 클릭 집계로 광고주에게 실시...
VS Code에 AI 플러그인을 추가하는 것과, 처음부터 AI를 중심으로 설계된 에디터를 쓰는 것은 차원이 다릅니다. Cursor는 단순히 “AI 기능이 있는 에디터”가 아니라, 코드베이스 전체를 이해하고 대화...
새 맥북을 받았을 때의 설렘은 잠깐이고, 그 다음에는 긴 설치 노동이 시작됩니다. Homebrew, 터미널, Java, Node, Docker, IDE… 하나씩 찾아가며 설치하다 보면 반나절이 금방 지나갑니다....
개발자는 투자에 유리한 위치에 있습니다. 데이터를 다룰 줄 알고, 백테스트를 이해하며, 자동화에 익숙합니다. 하지만 많은 개발자가 투자를 시작하지 못합니다. “공부가 더 필요해”, “지금은 바빠서”라는 이유로 ...
ChatGPT를 “그냥 질문하는 도구”로만 쓰고 있다면, 사실 전체 기능의 20%만 활용하고 있는 것입니다. 코드 생성, 디버깅, 코드 리뷰, API 문서화, 테스트 케이스 작성, SQL 최적화까지 — 개발 업...
Spring Boot를 처음 배울 때, 혹은 실무에서 개발하다 보면 처음 보는 에러 메시지가 콘솔을 가득 채우는 순간을 누구나 겪는다. 이 글은 그 당황스러운 순간을 최대한 빠르게 해결할 수 있도록, 실무에서 ...
java.lang.OutOfMemoryError — 개발자라면 누구나 한 번쯤 새벽에 이 에러 알람을 받아본 경험이 있을 것이다. 서버가 갑자기 멈추고, 재시작해도 일정 시간이 지나면 또 터진다. 이 글은 JV...
캐시 서버를 도입해야 한다. 검색하면 두 이름이 반드시 나온다. Redis와 Memcached. “그냥 Redis 쓰면 되지 않나요?”라고 묻는 신입 개발자에게 “맞아요, 대부분은요”라고 답하는 것은 절반만 옳...
개발자의 생산성은 단순히 “얼마나 오래 앉아 있느냐”로 결정되지 않습니다. 저는 하루 12시간 일하던 시기보다 8시간 집중해서 일하는 지금이 실제 산출물이 더 많습니다. 이 글은 개발자라는 직업 특성에 맞게 최...
결제 시스템에서 이벤트를 발행한다. 재고 서비스, 알림 서비스, 정산 서비스가 이 이벤트를 구독한다. 메시지 브로커가 필요하다. Kafka와 RabbitMQ 중 무엇을 선택할 것인가? 이 질문에 “트래픽이 많으...
서버가 초당 10만 개의 HTTP 요청을 처리해야 한다. 전통적인 스레드 풀로는 불가능하다. 스레드 하나에 1MB 스택이 필요하면 10만 개는 100GB 메모리가 필요하다. 이 문제를 해결하기 위해 Java는 ...
시스템 디자인 면접은 정답이 없습니다. 면접관은 “당신이 어떻게 생각하는가” 를 봅니다. 요구사항을 명확히 하고, 트레이드오프를 인지하며, 단계적으로 확장하는 사고 과정을 평가합니다. 이 글은 검증된 답변 프레...
6. WebFlux / 기타 심화 질문 (Q46 ~ Q50)
5. Spring Security 핵심 질문 (Q39 ~ Q45)
4. JPA 핵심 질문 (Q28 ~ Q38)
3. Transaction 핵심 질문 (Q19 ~ Q27)
2. AOP 핵심 질문 (Q11 ~ Q18)
1. DI / IoC 핵심 질문 (Q1 ~ Q10)
솔직하게 말할게요
5. 예외 처리 / Generics / 기타 (Q41 ~ Q50)
4. Stream / Functional (Q34 ~ Q40)
3. Collection 내부 구조 (Q23 ~ Q33)
2. 동시성 (Q11 ~ Q22)
1. JVM 메모리 구조 (Q1 ~ Q10)
Spring 면접은 단순 암기로는 절대 통과할 수 없습니다. 면접관은 “Bean이 뭔가요?”를 물어볼 때 실은 의존성 관리 철학을 이해하고 있는가를 봅니다. 이 글은 시니어 면접에서 자주 나오는 질문 50개를 ...
Java 면접에서 “HashMap의 시간복잡도가 뭔가요?” 같은 표면적 질문은 웜업일 뿐입니다. 진짜 합격을 가르는 건 “왜 O(1)이 아닐 수 있는가?”, “해시 충돌이 심해지면 내부에서 어떻게 변하는가?” ...
“코드를 짤 줄 아니까 자동매매도 만들 수 있겠지”라는 생각으로 시작했습니다. 맞습니다, 만들 수는 있습니다. 하지만 돈을 버는 시스템을 만드는 것은 완전히 다른 문제입니다. 이 글은 퀀트 트레이딩 시스템을 직...
새 프로젝트의 데이터베이스를 선택해야 한다. MySQL vs PostgreSQL. 두 데이터베이스 모두 무료이고, 안정적이며, 대규모 프로덕션 환경에서 검증되었다. 그런데 왜 고민이 되는가? 내부 구현 방식이 ...
마이크로서비스 아키텍처를 설계한다. 서비스 간 통신 방식을 결정해야 한다. REST API를 쓰면 모두가 친숙하고 디버깅이 쉽다. gRPC를 쓰면 성능이 좋고 타입 안전성이 보장된다. 이 선택은 향후 몇 년간 ...
개발자의 하루는 코드를 작성하는 시간보다 코드를 이해하고, 고치고, 설명하는 시간이 훨씬 많습니다. Claude Code는 바로 이 지점을 공략합니다. 단순한 자동완성 도구가 아니라, 코드베이스 전체를 이해하고...
실무에서 Git을 쓰다 보면 Merge 충돌, 대용량 리포 클론 30분, 비밀키 유출, force push 사고 같은 문제를 반드시 만나게 된다. 이 글에서는 10GB 리포, 10만 커밋 히스토리, 모노레포 성...
한 줄 요약: Git은 파일 차이가 아닌 스냅샷을 SHA-1 해시로 주소화한 Content-Addressable Storage이다. Blob·Tree·Commit·Tag 4가지 Object, Index(S...
커밋 하나가 프로덕션을 망가뜨린 적이 있는가? Git Hooks는 사람의 실수를 코드가 대신 막아주는 자동 방어선이다. 이 글에서는 클라이언트/서버 사이드 훅의 종류부터 husky, lint-staged, Co...
팀 규모와 릴리스 주기에 맞는 브랜치 전략을 선택하면 협업 충돌이 줄고, 배포 속도가 빨라지며, 장애 대응이 단순해진다. 이 글에서는 Git Flow, GitHub Flow, GitLab Flow, Trunk-...
git add, git commit, git push만으로 버티는 시대는 끝났다. 실무에서 커밋 히스토리가 꼬이고, 핫픽스를 특정 브랜치에만 옮겨야 하고, “어제까지는 됐는데 오늘 터졌다”를 추적해야 하는 순간...
한 줄 요약
한 줄 요약: Redis는 빠르지만 눈에 보이지 않습니다. RedisInsight는 종합 병원의 MRI, ARDM은 동네 의원의 초음파, redis-cli는 청진기 — 상황에 맞는 도구를 골라야 Redis...
Kafka 클러스터를 운영하면 토픽 수백 개, 컨슈머 그룹 수십 개, 파티션 수천 개가 눈앞에 펼쳐진다. CLI만으로 관리하면 실수 한 번에 프로덕션 토픽이 날아간다. 이 글에서는 Kafka 전용 관리/모니터링...
JVM 애플리케이션이 느려졌을 때 “어디서 시간을 잡아먹는지”, “메모리를 누가 쓰는지”, “스레드가 왜 멈췄는지”를 정확히 짚어내는 기술이 프로파일링이다. 감으로 튜닝하면 90%는 엉뚱한 곳을 고치게 된다 —...
한 줄 요약: IntelliJ IDEA는 코드를 이해하는 IDE다. 단순 텍스트 편집기가 아니라 AST 기반 분석 엔진 위에 디버깅·프로파일링·리팩토링·DB 연동까지 올린 백엔드 개발자의 종합 작전실이다.
한 줄 요약
비유로 먼저 이해하기: DB 클라이언트 도구를 자동차에 비유하면, DataGrip은 모든 옵션이 탑재된 독일 프리미엄 세단, DBeaver는 옵션 자유롭게 고를 수 있는 가성비 SUV, MySQL Work...
자바 프로젝트를 시작할 때 가장 먼저 만나는 선택지가 빌드 도구다. Maven은 2004년부터 자바 생태계의 표준이었고, Gradle은 2012년 이후 빠르게 점유율을 높이며 지금은 Android 공식 빌드 시...
API 테스트 도구는 백엔드 개발의 청진기다. Postman으로 GUI 기반 탐색, curl/httpie로 CLI 자동화, IntelliJ HTTP Client로 코드 옆에서 바로 검증까지 — 5가지 도구의 심...
“친구의 친구의 친구 중에서 나와 같은 도시에 살면서 비슷한 음악 취향을 가진 사람을 찾아라.” 관계형 DB로 이 쿼리를 작성하면 JOIN이 몇 개나 필요할까? 그래프 DB는 이 질문에 자연스럽게 답한다. 관계...
Cassandra는 “절대 멈추지 않는 DB”를 목표로 설계됐다. 마스터 노드가 없고, 모든 노드가 동등한 역할을 수행하며, 노드 한 대가 죽어도 쓰기와 읽기가 계속된다. 이 글은 그 내부 구조를 링(Ring)...
하루에 10억 줄의 로그가 쌓인다면 어떻게 될까. 파일에 그냥 쓰면 수 TB가 되고, 검색은 불가능해진다. 로그 파이프라인은 이 데이터를 실시간으로 수집하고, 가공하고, 저장해서 밀리초 단위로 검색 가능하게 만...
Java 개발자가 Kotlin으로 넘어올 때 마지막까지 Java 방식을 고집하는 영역이 있다. 바로 테스트다. JUnit 5와 Mockito는 익숙하고 문서도 많다. 그런데 막상 Kotlin 코드를 Mockit...
Kotlin 코드베이스를 처음 읽을 때 가장 낯선 것이 두 가지다. 하나는 ?.let { }, apply { }, also { } 같은 스코프 함수들이 뒤엉켜 있는 체이닝 코드고, 다른 하나는 val token...
리액티브 프로그래밍의 핵심은 “값이 언제 올지 모를 때 그 흐름을 다루는 방식”이다. RxJava는 Observable로, Reactor는 Flux/Mono로 이를 구현했다. Kotlin은 코루틴 위에 Flow...
Java에서 컬렉션 처리 코드를 작성하면 for 루프, 임시 변수, null 체크가 뒤엉켜 20줄이 넘어가는 경우가 흔하다. Kotlin은 그 코드를 3줄로 줄이고, 타입 안전성과 null 안전성을 유지하면서 ...
Spring Data JPA를 쓰면서 JpaRepository가 어떻게 구현체 없이 동작하는지 궁금했던 적이 있다면, 이 글이 그 궁금증을 해소해준다. 인터페이스를 선언하면 알아서 동작하는 마법의 원리부터 Sp...
JPQL 쿼리를 문자열로 작성하다 오타 하나에 런타임 예외를 만난 경험이 있다면, QueryDSL이 왜 필요한지 바로 이해할 수 있다. QueryDSL은 컴파일 시점에 쿼리 오류를 잡아주는 타입 세이프 쿼리 빌...
This is a test post for GIT category.
구조 패턴(Structural Pattern)은 클래스와 객체를 어떻게 조합할 것인가에 집중한다. 기존 코드를 건드리지 않고 새 인터페이스를 끼워 넣거나(Adapter), 기능을 동적으로 덧씌우거나(Decora...
생성 패턴(Creational Pattern)은 객체를 어떻게 만들 것인가에 집중한다. new 키워드를 직접 쓰는 대신, 생성 로직을 캡슐화해서 코드가 구체 클래스에 의존하지 않도록 만드는 것이 핵심 목표다. ...
데이터베이스 서버가 한 대뿐이라면, 그 서버가 멈추는 순간 서비스 전체가 멈춘다. MySQL 복제는 이 단일 장애 지점(SPOF)을 없애기 위한 핵심 메커니즘이다. 단순히 백업용 서버를 한 대 더 두는 개념에서...
쿼리가 느리다는 신고가 들어왔다. 로그를 보면 SELECT 하나가 3초를 넘기고 있다. 어디서 시간이 소비되는지 모른 채 인덱스를 마구 추가하거나, 쿼리를 감으로 바꾸는 것은 도박이다. MySQL의 EXPLAI...
서비스가 운영 중인 데이터베이스의 스키마를 바꾸는 일은 달리는 기차 위에서 바퀴를 교체하는 것과 같다. 기차를 멈추면(서비스 중단) 간단하지만, 대부분의 서비스는 그 선택지가 없다. 무중단으로 스키마를 변경하는...
인프라를 손으로 클릭해서 만들던 시대는 끝났다. 클릭으로 만든 서버는 누가, 언제, 어떤 설정으로 만들었는지 아무도 모른다. 이것이 IaC(Infrastructure as Code)가 등장한 이유다.
“서버리스”라는 이름은 반은 거짓말이다. 서버가 없는 게 아니라, 서버를 내가 관리하지 않는다는 뜻이다. 하지만 그 차이가 개발 방식을 근본적으로 바꾼다.
“고양이 사진 보여줘”를 검색하면 파일명에 “고양이”가 없는 사진도 찾아주는 검색엔진이 있다. 반면 기존 키워드 검색은 “고양이”라는 단어가 정확히 일치해야만 결과를 내놓는다. 이 차이가 임베딩과 벡터 DB에서...
데이터 과학자가 노트북에서 95% 정확도를 달성한 모델을 만들었다. 그런데 이것을 초당 1만 건의 요청을 처리하는 프로덕션 서비스에 올리면 어떻게 될까? 십중팔구 레이턴시 폭발, 메모리 부족, 그리고 3개월 후...
LLM에게 “오늘 날씨 알려줘”라고 물으면 그냥 대답한다. 그런데 “내 캘린더에서 오늘 일정 꺼내서, 날씨 API 조회하고, 적절한 옷차림까지 추천해”라고 하면? 단순한 텍스트 생성이 아닌 계획 수립 → 도구 ...
데드락 발생 원리부터 InnoDB 내부 메커니즘, 탐지/예방 전략, 실전 트러블슈팅까지
CAP 정리부터 워크로드 분석, 데이터 모델링, 확장 전략까지 — 시니어 개발자의 DB 선택 프레임워크
테스트 코드는 프로덕션 코드만큼 중요합니다. 잘 작성된 테스트는 리팩토링의 안전망이고, 버그의 조기 감지망이며, 살아있는 명세서입니다. JUnit 5는 JUnit 4와 비교해 아키텍처부터 Extension 모델...
한 줄 요약: 인증/인가 시스템의 핵심은 Access Token의 수명을 짧게 유지하고, Refresh Token을 Rotation시키며, 탈취 시 즉시 무효화할 수 있는 블랙리스트 체계를 갖추는 것이다.
비유로 먼저 이해하기: 음식점에 비유하면, 동기 블로킹은 주방에서 요리가 완성될 때까지 홀 직원이 그 자리에 서서 기다리는 것이다. 비동기 논블로킹은 주문을 넣고 다른 테이블 서빙을 하다가, 주방에서 벨이...
왜 어노테이션 동작원리를 알아야 하는가
한 줄 요약: Entity는 DB의 거울이고, DTO는 계층 간 택배 상자이며, VO는 값 그 자체가 정체성이고, DAO는 SQL 창고 관리인이며, Repository는 도메인이 말하는 컬렉션이다. 이 다...
한 줄 요약: Redis 트랜잭션(MULTI/EXEC)은 클라이언트 출력 버퍼에 명령을 큐잉하고 EXEC 시 원자적으로 실행하지만 롤백이 없다. 진짜 안전한 동시성 제어는 WATCH(CAS)와 Lua Sc...
JPA는 편리한 추상화지만 그 추상화 아래에서 어떤 일이 벌어지는지 모르면 조용히 데이터베이스를 폭격합니다. 주문 목록 100건에 쿼리 101번, 읽기 API가 더티 체킹 스냅샷을 만들고, IDENTITY 전략...
한 줄 요약: Record는 “데이터를 운반하는 투명한 캐리어”를 만들기 위해 Java 16에서 정식 도입된 언어 구조체로, 컴파일러가 필드·접근자·equals·hashCode·toString을 자동 생성...
한 줄 요약: HashMap은 h ^ (h >>> 16) 보조 해시로 비트를 섞고, (n-1) & hash 비트 AND로 버킷 인덱스를 구하며, 충돌이 8개를 넘으면 Red-Blac...
결제 서버에서 HashMap을 공유 캐시로 사용했다. 트래픽이 몰린 순간 CPU가 100%에 박히고 모든 응답이 멈췄다. GC 로그에는 이상이 없었다. 원인은 Java 7 HashMap의 resize() 과정에...
행동 패턴(Behavioral Pattern)은 객체 간의 책임 분배와 알고리즘 교환을 다루는 디자인 패턴 군입니다. 생성·구조 패턴이 “어떻게 만들고 조합하는가”를 다룬다면, 행동 패턴은 “어떻게 협력하고 소...
실생활 비유: 건물 설계와 자동차 엔진
한 줄 요약: 비로그인 임시 장바구니를 Redis에 보관하고, 로그인 시 병합 전략(수량 합산 vs 로그인 우선)으로 충돌을 해소하며, 재고는 결제 시점에만 잠그는 것이다.
한 줄 요약: 리뷰 시스템의 핵심은 베이지안 평균으로 소수 리뷰의 왜곡을 막고, Wilson Score로 유용한 리뷰를 정렬하며, 하이브리드 스팸 탐지 파이프라인으로 가짜 리뷰를 걸러내는 것이다.
한 줄 요약: 추천 시스템의 핵심은 협업 필터링으로 숨겨진 취향을 발굴하고, 2단계 파이프라인(후보 생성 → 정밀 랭킹)으로 수억 개 상품을 100ms 안에 걸러내며, 콜드 스타트와 인기 편향을 동시에 해...
한 줄 요약: 쓰기는 RDB로 정확하게, 읽기는 Elasticsearch와 Redis로 빠르게 분리하고, 멀티테넌트 구조로 수백만 셀러의 상품을 격리하면서 단일 검색 인덱스로 통합 제공한다.
한 줄 요약: 시니어는 “무엇을 쓰느냐”가 아니라 “왜 쓰느냐”를 설명한다. MySQL을 고른 이유, Saga를 고른 이유, CQRS를 고른 이유 — 모든 결정에 WHY가 있어야 면접을 통과한다.
한 줄 요약: MySQL은 ACID로 재고 불변식을 강제하고, Redis는 원자 DECR로 동시 차감 경쟁을 차단하며, Kafka는 비동기 분리로 확정 지연을 흡수한다. 세 계층이 각자의 역할을 맡아야 초...
한 줄 요약: 배송 시스템의 핵심은 실시간 위치 추적으로 고객 불안을 제거하고, 최근접 창고 선택으로 리드타임을 단축하며, 이벤트 소싱으로 배송 상태 이력을 완전하게 보존하는 것입니다.
한 줄 요약: 쿠폰 시스템의 핵심은 Redis 원자 연산으로 초과 발급을 막고, 룰 엔진으로 할인 조합을 유연하게 계산하며, 멀티 어카운트 어뷰징을 사전에 차단하는 것이다.
한 줄 요약: Redis Streams는 “메시지를 보내고 받는 우체통”인데, 받는 사람이 여러 명이어도 편지가 사라지지 않고, 누가 읽었고 누가 아직 안 읽었는지까지 추적해주는 Redis의 자료구조입니다...
한 줄 요약: Redis는 단일 프로세스(Standalone)에서 시작해 자동 장애복구(Sentinel), 수평 확장(Cluster)으로 진화하며, 각 모드는 해결하는 문제가 근본적으로 다르다 — 무엇을 ...
단위 테스트가 1000개 통과해도 실제 DB 연결에서 터지면 서비스는 장애다. 통합 테스트는 부품이 아니라 조립된 기계가 돌아가는지 확인하는 테스트다. 이 글에서는 Spring Boot 환경에서 통합 테스트를 ...
테스트를 작성할 때 “그냥 Mock 쓰면 되지”라고 생각하기 쉽다. 하지만 Mock은 테스트 더블의 다섯 가지 유형 중 하나일 뿐이다. Dummy, Stub, Spy, Mock, Fake는 각각 다른 목적을 가...
“테스트는 나중에 쓰면 되잖아요?” 맞다. 그런데 나중에 쓰는 테스트와 먼저 쓰는 테스트는 근본적으로 다르다. 코드를 먼저 짜면 테스트는 그 코드의 동작을 확인하는 도구가 된다. 테스트를 먼저 쓰면 테스트가 설...
한 줄 요약: 채팅 시스템은 WebSocket으로 양방향 실시간 연결을 유지하고, Kafka로 서버 간 메시지를 라우팅하며, Cassandra로 수 페타바이트 메시지를 저장한다. 각 선택에는 “왜 이것이어...
한 줄 요약: 위치 기반 서비스의 핵심은 Geohash로 2차원 좌표를 1차원 문자열로 변환하여 B-Tree 인덱스로 근접 검색하고, Redis + Pub/Sub로 라이더 위치를 실시간 전파하는 것이다.
블랙프라이데이 자정, 쿠팡이 1억 명에게 동시에 “특가 시작!” 푸시를 보낸다. 10초 안에 전달되어야 한다. 단일 서버가 APNs와 FCM을 1억 번 직접 호출하면 서버는 즉시 죽는다. 알림 하나를 보내는 것...
한 줄 요약: 시스템 디자인 면접의 핵심은 컴포넌트 나열이 아니라 “왜 이 선택인가”를 요구사항에서 논리적으로 도출하는 것이다. 암기가 아니라 사고 과정을 보여줘야 시니어 면접관을 설득할 수 있다.
한 줄 요약: 분산 파일 저장소의 핵심은 파일을 4MB 블록으로 쪼개 SHA-256 해시로 중복을 제거하고, 메타데이터 DB로 블록 조각을 추적하며, SSE/WebSocket으로 여러 디바이스에 변경을 실...
한 줄 요약: YouTube의 핵심은 업로드된 영상을 DAG 기반 트랜스코딩 파이프라인으로 해상도별 분할 처리하고, HLS/DASH ABR로 네트워크 상황에 맞게 스트리밍하며, 글로벌 CDN으로 지연시간을...
BTS가 인스타그램에 사진을 올리는 순간, 7000만 팔로워의 피드가 업데이트되어야 한다. 7000만 건의 캐시 업데이트를 동기로 처리하면? 게시글 저장에 수십 분이 걸린다. 반대로 아무것도 하지 않으면? 팔로...
한 줄 요약: 결제 시스템의 핵심은 세 가지다. 멱등성 키로 이중 결제를 원천 차단하고, 복식부기로 1원 단위 자금 무결성을 보장하며, PG 추상화 레이어로 벤더 장애를 투명하게 폴백한다. 이 세 가지를 ...
구글에 “파이썬 머신러닝”을 검색하면 수천억 개의 웹페이지 중에서 관련 결과가 100ms 안에 나온다. 단순히 “파이썬”과 “머신러닝”이 들어간 페이지를 하나씩 뒤지면? 전 세계 서버를 동원해도 수십 년이 걸린...
트위터가 140자 제한이었던 시절, https://www.example.com/very/long/path?campaign=summer&source=newsletter&medium=email 같은 ...
2023년 새벽 3시, 한 스타트업의 API가 다운됐다. 경쟁사 봇이 초당 5만 건을 보냈고, DB 커넥션 풀이 고갈되며 서비스 전체가 멈췄다. Rate Limiter가 있었다면 IP당 초당 100건 제한으로 ...
2024년 블랙프라이데이, 아마존의 DynamoDB는 초당 1억 건 이상의 요청을 처리했다. Redis는 단일 노드에서 초당 100만 QPS를 넘긴다. 이 숫자들이 가능한 이유는 단순한 “빠른 하드웨어” 때문이...
한 줄 요약: Spring IoC 컨테이너는 BeanDefinition 메타데이터를 읽어 싱글톤 레지스트리를 구성하고, BeanPostProcessor 체인으로 AOP 프록시를 씌운 뒤, 완성된 객체를 주...
한 줄 요약: Spring 컨테이너는 단순한 빈 저장소가 아니다. BeanPostProcessor 체인이 @Autowired·AOP 프록시·@Async를 자동화하고, BeanFactoryPostProces...
트랜잭션을 “그냥 @Transactional 붙이면 되는 것”으로 아는 개발자와, 프록시 체인부터 커넥션 풀 상호작용까지 이해하는 개발자의 차이는 장애 상황에서 극명하게 드러난다. 이 글은 Spring 트랜잭션...
Tomcat 스레드 200개가 모두 외부 API 응답을 기다리며 블로킹되어 있다. 새 요청은 큐에서 대기하다 타임아웃이 터진다. 서버를 두 배 늘려도 스레드 수가 두 배가 될 뿐, 근본 구조는 바뀌지 않는다. ...
JWT 없는 요청이 /api/admin을 통과했다. 필터가 누락됐는지, 순서가 잘못됐는지, SecurityContext가 비어있는지 – Spring Security 아키텍처를 모르면 어디서 막혀야 하는지조차 알...
마이크로서비스 환경에서 외부 서비스 호출은 반드시 실패한다. 문제는 “언제 실패하느냐”가 아니라 “실패가 얼마나 멀리 전파되느냐”이다. 하나의 느린 서비스가 연쇄적으로 전체 시스템을 마비시키는 Cascading...
한 줄 요약: Spring MVC는 DispatcherServlet이 단일 진입점으로 모든 HTTP 요청을 받아 HandlerMapping → HandlerAdapter → ArgumentResolver ...
신입 때 new RateDiscountPolicy()를 서비스 클래스 내부에 직접 박아뒀다가, 기획 변경 한 번에 수십 개 파일을 열어야 했던 경험이 있을 것이다. IoC와 DI는 그 고통을 제거하기 위한 개념...
한 줄 요약: Spring Interceptor는 DispatcherServlet이 HandlerMapping으로 컨트롤러를 찾은 직후, 실제 호출 직전에 끼어드는 컴포넌트다. Filter와 달리 Spri...
1. 비유 — 요리 도구의 진화
한 줄 요약: Spring JDBC는 Driver→Connection→Statement→ResultSet이라는 JDBC 4단계 프로토콜을 JdbcTemplate 템플릿 메서드 패턴으로 감싸고, DataSo...
Spring Cloud Gateway는 Spring 생태계의 API Gateway 솔루션이다. Netflix Zuul(블로킹)의 후계자로, Spring WebFlux(Reactor/Netty) 기반의 비동기 논...
마이크로서비스 환경에서 서비스들은 동적으로 생성·삭제·이동된다. IP와 포트를 하드코딩하면 배포할 때마다 설정을 바꿔야 한다. Spring Cloud Eureka는 이 문제를 해결하는 Service Discov...
100개의 마이크로서비스에 DB 비밀번호를 바꿔야 한다면? 각 서비스마다 설정 파일을 수정하고 재배포하면 수십 분이 걸린다. Spring Cloud Config는 모든 서비스의 설정을 한 곳에서 관리하고, 재배...
한 줄 요약: Spring Boot 자동 구성은 SpringApplication.run() 한 줄에서 출발해 classpath 분석, @Conditional 평가, 조건부 빈 등록까지 수백 개의 자동 설정...
한 줄 요약
한 줄 요약
한 줄 요약
AOP를 “로깅이나 트랜잭션에 쓰는 것”으로만 알고 있다면 시니어 면접에서 멈춘다. 면접관이 진짜 묻는 것은 “프록시가 어떻게 만들어지는가”, “왜 self-invocation이 뚫리는가”, “CGLIB이 JD...
Spring @Async는 메서드 한 줄로 비동기를 선언할 수 있어 단순해 보인다. 하지만 내부 구조를 모르면 예외가 조용히 사라지고, 로그에서 TraceId가 증발하며, 트랜잭션 데이터가 보이지 않는 운영 장...
1. 비유 — 레고 블록과 조립 설명서
새벽 2시에 운영 장애가 났다. 로그를 보니 에러와 정상 로그가 뒤섞여 어느 요청에서 터진 건지 찾을 수가 없다. MDC를 몰랐다면 이 상황에서 로그 전체를 시간순으로 읽어내려가야 한다.
비유로 먼저 이해하기: HTTP 클라이언트 라이브러리를 택배사에 비유하면, RestTemplate은 직접 전화해서 배차하는 방식, WebClient는 배차 앱에 요청 올려두고 다른 일 하는 방식, Open...
동기(Synchronous), 비동기(Asynchronous), 블로킹(Blocking), 논블로킹(Non-blocking)은 I/O와 동시성 프로그래밍에서 가장 자주 혼용되는 개념이다. 단순히 “블로킹은 스레...
동시 접속자가 늘어나는 순간, Tomcat과 Netty는 전혀 다른 방식으로 반응한다. 같은 Java 생태계, 같은 HTTP, 같은 서버이지만 설계 철학이 근본적으로 다르다. 그 차이가 10만 동시 접속에서 생...
웹 서버가 수만 개의 동시 접속을 처리하는 방법에는 두 가지 철학이 있다. 하나는 “요청마다 사람을 붙인다”는 방식이고, 다른 하나는 “한 사람이 여러 일을 번갈아 처리한다”는 방식이다. Nginx는 후자를 극...
실시간 랭킹을 구현해야 한다. MySQL로 매 요청마다 ORDER BY score DESC를 돌리면 수천 명이 동시 접속할 때 DB가 버티지 못한다. Redis Sorted Set 하나로 수백만 명의 점수를 실...
새벽 2시, Redis 마스터 서버의 디스크가 고장났다. 복제 없이 단일 Redis만 운영 중이었다면? 캐시 데이터는 전부 날아간다. 서비스가 재개되어도 모든 캐시가 비어있으니 DB에 쿼리가 폭발적으로 몰린다....
쿠팡 블랙프라이데이 자정, 한정판 운동화 1켤레에 5만 명이 동시에 달려든다. 서버 20대가 저마다 “재고 1개 남음”을 읽고 결제를 진행하면, 재고는 1개인데 20명에게 팔리는 참사가 벌어진다. synchro...
로그인 세션이 24시간 뒤 자동 만료되지 않는다면 어떻게 될까? 사용자가 로그아웃을 잊으면 세션은 영원히 메모리에 남는다. 수백만 명의 서비스라면 Redis 메모리가 조용히, 그러나 확실히 고갈된다. 어느 날 ...
채팅 서비스를 서버 3대로 운영한다. 사용자 A는 서버 1에 WebSocket으로 연결되어 있고, 사용자 B는 서버 2에 연결되어 있다. A가 B에게 메시지를 보낸다. 서버 1은 서버 2에 연결된 B에게 직접 ...
재고 감소 로직을 떠올려보자. GET으로 재고를 읽고, 0보다 크면 DECR로 줄인다. 코드로만 보면 아무 문제가 없다. 그런데 GET과 DECR 사이 0.05밀리초의 틈에 다른 스레드가 끼어들면 재고가 -1이...
사용자 프로필 페이지를 만든다고 하자. MySQL이라면 users, addresses, hobbies, orders 테이블을 JOIN해야 한다. MongoDB라면 쿼리 한 번으로 끝난다. 그런데 MySQL 개발...
“상품명에 ‘무선 이어폰’이 포함된 결과를 0.05초 안에 보여줘야 합니다.” RDBMS의 LIKE '%무선 이어폰%'은 100만 건에서 수 초가 걸린다. Elasticsearch는 역인덱스(Inverted I...
전송 계층(Transport Layer)의 두 프로토콜인 TCP와 UDP는 인터넷의 근간이다. 단순히 “TCP는 신뢰성, UDP는 속도”라는 수준을 넘어, 내부 메커니즘이 왜 그렇게 설계됐는지를 이해해야 장애 ...
트래픽이 폭발하는 순간, 서버는 두 가지 방식으로 죽는다. 느리게 죽거나, 갑자기 죽거나. 로드밸런서는 이 죽음을 막는 첫 번째 방어선이다. 단순히 요청을 나눠주는 장치가 아니라 장애 격리, SSL 오프로드, ...
OSI 7계층을 “7·6·5·4·3·2·1 암기”로 끝내는 면접자와 “각 계층이 왜 존재하고 무엇을 해결하는가”를 설명하는 면접자는 결과가 다르다. 이 글은 후자를 위해 물리 신호 인코딩부터 HTTP/3 QUI...
브라우저 주소창의 자물쇠 아이콘은 단순한 장식이 아니다. 그 뒤에는 수십 년간 발전해온 암호학 프로토콜, 수천 개의 CA와 수억 개의 인증서, 그리고 수없이 반복된 해킹 사고를 통해 다듬어진 신뢰 체계가 존재한...
DNS(Domain Name System)는 사람이 읽을 수 있는 도메인 이름(www.example.com)을 컴퓨터가 사용하는 IP 주소(93.184.216.34)로 변환하는 분산 계층 데이터베이스 시스템이다.
마이크로서비스 환경에서 하나의 요청이 수십 개 서비스를 거칠 때, 어디서 지연이 발생했는지 추적하는 기술이 분산 트레이싱이다.
시스템이 지금 이 순간 무엇을 하고 있는지 알지 못한 채 운영하는 것은, 계기판 없이 비행기를 모는 것과 같다. 메트릭 수집, 저장, 시각화, 알림까지 이어지는 전체 파이프라인을 처음부터 끝까지 해부한다.
Google SRE가 정의한 4대 골든 시그널(Latency, Traffic, Errors, Saturation)을 중심으로 서비스 품질을 정량적으로 관리하는 방법론이다. “감으로 운영하는 시대”에서 “숫자로 ...
서버에 동시 요청이 10만 개 들어온다. 전통적인 스레드 모델로는 스레드 10만 개가 필요하고, 각 스레드가 1MB를 쓴다면 메모리만 100GB다. 실제 서버가 가진 CPU 코어는 8개뿐인데. 코루틴은 스레드 ...
Java로 Spring Boot를 쓰던 개발자가 Kotlin으로 전환할 때 가장 먼저 드는 생각은 “과연 다를 게 있나?” 이다. 결론부터 말하면, 다르다. 코드 줄 수가 줄고, null 안전성이 언어 수준에서...
Java 프로젝트에서 NPE(NullPointerException)가 전체 런타임 에러의 40% 이상을 차지한다는 통계가 있다. Tony Hoare는 null을 설계한 것을 “10억 달러짜리 실수”라고 불렀다....
서비스가 성장하면서 주문, 결제, 배달, 통계, 알림 시스템이 서로 직접 API를 호출한다. 하나가 느려지면 전체가 느려지고, 하나가 죽으면 연쇄 장애가 난다. Kafka는 이 결합을 끊는다. 그런데 “어떻게”...
들어가며
시니어 개발자가 처음 Kafka를 쓸 때는 “토픽에 넣고, 토픽에서 꺼낸다”로 시작합니다. 그런데 6개월이 지나면 질문이 달라집니다. “주문 완료 시 네 개 토픽에 동시에 넣어야 하는데, 하나가 실패하면 어떻게...
브로커 한 대가 새벽 3시에 갑자기 죽었다. 그 브로커가 리더를 맡던 파티션의 메시지는 어떻게 되는가? Kafka는 처음부터 이 질문에 답하기 위해 설계됐다. 단순히 “복제한다”가 아니라, 어떤 복제본이 신뢰할...