아카이브
- 28 / 08 LATERAL 조인: 성능 기능이 아니라 스코프 규칙이다
- 28 / 08 딥 페이지네이션은 왜 막혀 있는가: from+size의 비용과 search_after
- 28 / 08 Elasticsearch 관련도 점수: query/filter 컨텍스트, boost, 그리고 dis_max
- 28 / 08 Lucene은 질의를 어떻게 실행하는가: term dictionary와 와일드카드의 비용
- 28 / 08 전문검색을 언제 DB 밖으로 꺼내는가: 표현력의 한계와 분리의 대가
- 28 / 08 실행계획은 하드웨어에서 어떻게 도는가: 페이지, 버퍼, work_mem
- 28 / 08 PostgreSQL 실행계획 읽는 법: 트리, 숫자, 그리고 단위
- 22 / 06 프로젝트 & 개발기 — 직접 만든 것들을 공유합니다
- 14 / 06 [개발기] 서버 없는 채팅 Murmur, 어디서 막혔나
- 14 / 06 [출시작] 서버도 인터넷도 계정도 없는 채팅앱 'Murmur'를 만들었습니다
- 04 / 06 캐시 추상화: @Cacheable은 어떻게 동작하고 어디서 터지나
- 07 / 05 Spring Security 기초: 필터 체인으로 보는 인증과 인가
- 24 / 04 CORS는 왜 *와 쿠키를 같이 못 쓰나
- 21 / 04 의미로 검색하다 — 벡터 검색(ANN·HNSW)과 PageRank, 그리고 시리즈의 끝
- 20 / 04 어떤 호출을 사용량으로 셀 것인가 — 미터링의 경계 정의
- 17 / 04 Redis가 죽으면 문을 열까 닫을까: graceful degradation
- 14 / 04 서드파티 클라이언트에 파라미터를 더할 때 응답까지 들여다보기
- 13 / 04 내 DB와 외부 시스템의 동의 상태를 맞추는 법 — 양방향 동기화와 차집합
- 10 / 04 LIMIT에 들어가는 값의 타입을 의심하라
- 09 / 04 테스트 슬라이스: @WebMvcTest · @DataJpaTest · @SpringBootTest
- 07 / 04 예외를 다시 던지면서 원인을 잃어버리는 실수 — cause 체이닝 보존
- 06 / 04 처리에 실패한 메시지는 어디로 가는가 — 재시도와 데드레터의 안전선
- 03 / 04 분산 락이 실패하면 어떻게 할까: 레이트리미터의 폴백
- 27 / 03 개발에선 열고 운영에선 닫는다: 환경별 우회 필터의 위험
- 20 / 03 모든 쿼리에 스톱워치 달기: AOP 횡단 관심사
- 16 / 03 믿을 수 없는 메시지 — 컨슈머 입구에서 파싱하고 검증하기
- 13 / 03 필터 순서가 보안을 만든다: 인증 앞에 무엇을 둘까
- 12 / 03 Spring Boot Actuator — 엔드포인트는 어떻게 만들어지고 노출되나
- 10 / 03 현대 네트워킹 — 사이드카, eBPF, 그리고 경계가 사라진 신뢰
- 09 / 03 메시지를 안 띄우고 컨슈머를 테스트하는 법
- 06 / 03 스키마도 버전 관리한다: 마이그레이션 도구의 내부
- 02 / 03 건건이 INSERT하지 마라 — 메모리 누산기로 통계를 접는 법
- 27 / 02 여러 인스턴스가 한 통을 나눠 쓰다: 분산 토큰 버킷
- 20 / 02 메서드에 권한을 붙이다: @PreAuthorize는 어떻게 동작하나
- 17 / 02 레이트 리미팅과 스트리밍 알고리즘 — 폭주를 막고, 끝없는 흐름에서 표본을 뽑다
- 13 / 02 MyBatis 설정 한 줄이 쿼리 전체 동작을 바꾼다
- 12 / 02 GraalVM 네이티브 이미지와 AOT
- 02 / 02 초당 수천 클릭을 삼키는 법 — 이벤트로 받아 비동기로 적재하기
- 15 / 01 Observability: Micrometer와 분산 추적
- 06 / 01 네트워크 성능 — 대역폭은 왜 빠름이 아닌가 (RTT·BDP·처리량의 진실)
- 05 / 01 한 이벤트, 네 갈래 알림 — 채널·템플릿을 전략으로 가르기
- 28 / 12 컨트롤러는 얇게, 서비스는 두껍게 — 비즈니스 로직의 올바른 위치
- 27 / 12 서버 간 호출을 API 키로 인증하는 필터
- 21 / 12 비밀번호 재설정 링크의 보안 설계 — 일회성·만료·추측 불가 토큰
- 18 / 12 Spring Framework 7의 HTTP API 버저닝
- 16 / 12 합의 알고리즘 — 죽는 서버들 사이에서 하나의 진실을 정하는 법 (Raft·Paxos)
- 14 / 12 Jackson 직렬화: null·날짜·순환참조의 함정
- 09 / 12 외부 API 호출을 추적하되 서비스키는 흘리지 마라 — 호출 로깅과 키 교체
- 07 / 12 오래된 데이터를 지우는 안전한 방법
- 04 / 12 선언적 HTTP 클라이언트: @HttpExchange와 RestClient
- 30 / 11 정렬 결과가 매번 달라 보이는 이유
- 29 / 11 잘못 매핑된 이름을 일괄로 바로잡기 — 데이터 보정
- 23 / 11 필터를 조합할수록 쿼리가 폭발하는 문제
- 22 / 11 같은 유형을 두 번 등록 못 하게 — 중복 검사 자리
- 20 / 11 가상 스레드(Virtual Threads)와 Spring Boot
- 16 / 11 계층 간 매핑 코드를 줄이는 법
- 15 / 11 record DTO와 검증 어노테이션을 제대로 쓰기
- 11 / 11 사업자·법인등록번호는 입력받기 전에 스스로 검증된다 — 체크섬 알고리즘
- 09 / 11 DTO를 불변으로 만들면 버그가 줄어든다
- 08 / 11 한 요청에 파일과 JSON을 함께 받는 법
- 06 / 11 Spring Boot 4 · Spring Framework 7, 무엇이 바뀌었나
- 04 / 11 외부 연동 설정값이 비어 있을 때 — null 안전 기본값과 생성자 방어
- 04 / 11 소켓과 커널 네트워크 스택 — accept 한 줄 뒤에서 벌어지는 일
- 02 / 11 읽기는 복제본으로, 쓰기는 주 DB로
- 28 / 10 외부 API의 HTTP 오류를 우리 언어로 번역하기 — 예외 변환 계층
- 26 / 10 LIKE를 버리고 풀텍스트 인덱스로
- 25 / 10 권한 검사를 매 요청 DB로 묻지 않게 — 권한 캐시
- 21 / 10 일관된 해싱 — 노드가 들고날 때 데이터를 통째로 옮기지 않는 법
- 19 / 10 느린 쿼리는 어떻게 잡아내는가
- 16 / 10 요청 검증(Bean Validation): @Valid, @Validated, 커스텀 제약
- 09 / 10 @Transactional 동작 원리와 자주 빠지는 함정
- 05 / 10 정규화를 깨야 빨라질 때
- 02 / 10 Spring Data JPA 기본기: Repository와 쿼리 메서드
- 28 / 09 날짜 범위 조회에서 하루가 새는 이유
- 27 / 09 중복 INSERT를 막는 임시 적재 테이블
- 25 / 09 Spring MVC vs WebFlux, 언제 무엇을 쓸까
- 21 / 09 조인은 어떻게 실행되는가: 중첩루프부터 해시까지
- 20 / 09 검색엔진 연결에 SSL을 입히는 설정
- 18 / 09 REST API 예외 처리: @RestControllerAdvice로 일관된 응답 만들기
- 14 / 09 짧은 토큰과 긴 토큰을 같이 쓰는 이유
- 13 / 09 공개 URL에 내부 ID를 그대로 노출하지 않기
- 11 / 09 Starter와 의존성 관리(BOM): 버전 지옥에서 벗어나기
- 09 / 09 VPC & 클라우드 네트워킹 — 라우팅 테이블 한 줄이 퍼블릭과 프라이빗을 가른다
- 07 / 09 가져온 데이터의 중복을 거르는 법
- 06 / 09 지우지 않고 제외했다가 되살리기 — 복원 가능한 제외
- 03 / 09 외부 설정 제대로 쓰기: PropertySource 우선순위 · @ConfigurationProperties · Profile
- 31 / 08 푸시 알림: 보냈다고 도착한 건 아니다
- 30 / 08 검색 인덱스 필드를 범용으로 갱신하는 법
- 27 / 08 @SpringBootApplication 한 줄 뜯어보기
- 24 / 08 짧은 시간 같은 요청을 한 번만 처리하기
- 23 / 08 목록 조회를 DB에서 검색엔진으로 옮길 때
- 20 / 08 IoC 컨테이너와 의존성 주입(DI), 그리고 Bean 생명주기
- 19 / 08 확률적 자료구조 — 정확함을 메모리와 맞바꾸는 기술 (Bloom·HyperLogLog·Count-Min)
- 17 / 08 세션 타임아웃과 자동 로그아웃 설계
- 12 / 08 Spring Boot 자동 구성(Auto-configuration)은 어떻게 동작하나
- 10 / 08 로그인 시도를 무한히 허용하면 안 된다
- 09 / 08 엔드포인트마다 요청 DTO를 따로 두는 리팩토링
- 02 / 08 수천 건 매핑 작업을 비동기로 돌리고 진행률을 보여주기
- 27 / 07 외부 API는 언젠가 느려지거나 죽는다
- 26 / 07 DB에 쓰고 검색엔진에도 쓴다 — 이중 쓰기 동기화
- 22 / 07 GitHub Actions로 Spring Boot 애플리케이션을 AWS EC2에 배포하기
- 20 / 07 비밀번호는 암호화가 아니라 해싱이다
- 15 / 07 Spring Boot에서 Kafka 사용하기
- 13 / 07 세션과 토큰, 무엇이 상태를 가지는가
- 12 / 07 엑셀 다운로드를 비동기로 돌려 응답을 풀어주기
- 08 / 07 방화벽·보안그룹·네트워크 ACL — stateful과 stateless가 가르는 모든 것
- 06 / 07 엑셀 수만 행 내려받기에서 메모리가 터지는 이유
- 29 / 06 대용량 업로드를 메모리에 올리지 마라
- 25 / 06 S3 키를 무중단으로 갈아끼우기 — 자격증명 교체의 원칙
- 24 / 06 Docker로 Kafka 구성하기 (KRaft 모드)
- 22 / 06 돈을 double로 계산하면 1원이 사라진다
- 17 / 06 문자열 매칭 — 어긋났을 때 얼마나 똑똑하게 다시 시작하는가
- 15 / 06 실행계획 읽는 법: 옵티마이저의 속마음
- 08 / 06 커넥션 풀은 왜 크게 잡으면 더 느려지나
- 07 / 06 한 덩어리로 자란 기능을 둘로 가르기
- 03 / 06 Kafka Producer/Consumer와 컨슈머 그룹
- 28 / 05 팀마다 다른 컬럼 순서로 엑셀을 내려주기 — 동적 헤더 POI 내보내기
- 28 / 05 DB 버전이 다르면 같은 쿼리가 깨진다 — PostgreSQL 버전 호환성
- 21 / 05 지금 누가 요청했는가를 어디서나 꺼내 쓰기 — SecurityContext와 현재 사용자
- 18 / 05 트랜잭션 안에서 외부 API를 부르면 안 되는 이유
- 14 / 05 레이어가 거꾸로 의존하지 못하게 — ArchUnit으로 아키텍처를 테스트하기
- 13 / 05 Apache Kafka란: 토픽 · 파티션 · 오프셋
- 06 / 05 프록시·리버스 프록시·CDN — 콘텐츠를 사용자 코앞으로 옮기는 기술
- 04 / 05 내보내기 도중 데이터가 바뀌면
- 27 / 04 한 덩어리로 지켜야 할 데이터의 경계
- 20 / 04 한 DB에서 여러 집단의 데이터를 가르는 법
- 15 / 04 그리디 — 눈앞의 최선만 집었는데 전체가 최적일 때
- 14 / 04 컨슈머 하나로는 못 따라간다 — 메시지 처리 멀티스레딩과 커밋의 안전선
- 13 / 04 신뢰 경계에서 모든 입력을 검문하라
- 08 / 04 Spring Boot에서 Redis 클러스터 설정하기
- 06 / 04 에러 메시지가 공격자에게 주는 단서
- 05 / 04 공유 Map이 동시에 망가질 때 — 동시성 자료구조
- 30 / 03 기능을 끄고 켜며 배포하는 법
- 23 / 03 readOnly=true가 진짜로 하는 일
- 18 / 03 Docker로 Redis 클러스터 구성하기
- 16 / 03 격리수준: 더티리드부터 팬텀까지
- 15 / 03 도로명과 지번을 갈라야 좌표가 잡힌다 — 주소 정규화
- 05 / 03 목표 대비 성과가 어긋나는 이유 — 집계 전 타입 일치
- 04 / 03 로드 밸런싱 — L4와 L7은 무엇이 다르며, 왜 헬스체크가 서비스를 살리고 죽이나
- 02 / 03 한 부모에 여러 자식: collection 매핑의 그룹핑
- 25 / 02 Redis 고가용성: Single, Replication, Sentinel, Cluster
- 23 / 02 중복 없는 개수 세기의 숨은 비용
- 19 / 02 안 쓰는 변수가 코드를 붙들고 있을 때 — 결합된 죽은 코드 정리
- 18 / 02 동적계획법 — 같은 계산을 두 번 하지 않는다는 단 하나의 원칙
- 16 / 02 읽기 경로와 쓰기 경로를 다르게 최적화하기
- 09 / 02 인터셉터로 권한 검사를 한 곳에 모으기
- 04 / 02 Redis 영속성: RDB vs AOF (그리고 MISCONF 에러)
- 29 / 01 한 방에 여러 행을 서로 다른 값으로 UPDATE 하기 — VALUES 조인 갱신
- 22 / 01 담당자만 옮길 수 있다 — 행 소유권 기반 인가
- 15 / 01 팀을 바꾸면 모든 쿼리가 따라 바뀌어야 한다 — 요청 컨텍스트 전파
- 14 / 01 Redis란 무엇인가: 인메모리와 자료구조
- 12 / 01 인증과 인가를 한 줄도 섞지 마라
- 08 / 01 '포함하지 않음' 필터의 함정 — 부정 조건과 NULL의 충돌
- 07 / 01 NAT와 사설망 — 주소 하나로 수백 대가 인터넷을 쓰는 법, 그리고 P2P가 막히는 이유
- 05 / 01 PUT과 PATCH, 그리고 부분 수정의 진실
- 31 / 12 운영체제 가상 메모리: 스왑 파일 생성 및 관리 방법
- 29 / 12 쿼리스트링·폼·바디: 파라미터 바인딩의 규칙
- 24 / 12 AWS 보안 그룹 설정과 원본(Source) 개념
- 22 / 12 서버를 여러 대로 늘리면 세션이 사라진다 — 외부 세션 저장소
- 17 / 12 최소 신장 트리와 Union-Find — 가장 싸게 잇기, 그리고 거의 O(1)의 마법
- 15 / 12 한 필드만 봐선 모르는 검증 규칙 — 클래스 레벨 상호 검증
- 10 / 12 Logstash를 활용한 PostgreSQL 데이터 Elasticsearch Bulk Insert
- 08 / 12 무거운 조회를 미리 계산해 두기 — 구체화 뷰와 요약 테이블
- 01 / 12 연관 데이터를 지울 때 따라 지워야 하나 — FK와 CASCADE의 양면
- 24 / 11 설정값을 코드에 박지 마라 — 프로파일과 비밀 분리
- 19 / 11 도커로 ELK 8버전 사용하기
- 17 / 11 오래 걸리는 작업에 즉시 응답하는 법 — 202 Accepted와 상태 폴링
- 13 / 11 엔터키가 쿼리를 멋대로 던질 때 — 폼 기본 동작과 불필요한 요청 차단
- 10 / 11 로그는 문자열이 아니라 데이터다
- 05 / 11 Docker · Elasticsearch · Spring Boot로 검색 기능 구현하기
- 05 / 11 TLS/HTTPS는 어떻게 도청 불가능한 채널을 만드나 — 핸드셰이크부터 인증서 체인까지
- 03 / 11 같은 쿼리 결과를 캐싱할 때의 신선도
- 29 / 10 MyBatis: WHERE 1=1 대신 trim으로 해결하기
- 26 / 10 탈퇴·정지 안내 메일을 템플릿으로 보내기
- 22 / 10 최단 경로 — 다익스트라의 확신, A*의 직감, 벨만-포드의 인내
- 20 / 10 #{} 와 ${}: 바인딩과 인젝션의 분기점
- 19 / 10 지웠던 기능을 되살려야 할 때 — 롤백의 기술
- 16 / 10 여러 조각을 순차로 불러올까 동시에 불러올까 — 화면 조립 로딩 전략
- 15 / 10 MultiMatch와 다중 정렬, Query String (feat. Java)
- 13 / 10 결제 상태는 함부로 건너뛰면 안 된다
- 09 / 10 조인 컬럼 타입이 어긋나면 풀스캔이 난다 — 암묵적 형변환의 덫
- 06 / 10 API를 바꿔야 할 때 망가뜨리지 않는 법
- 05 / 10 메뉴 단위 권한을 필터 체인으로 거는 법
- 29 / 09 방금 저장한 데이터가 안 보이는 이유
- 28 / 09 메뉴를 코드가 아니라 데이터로 그리기
- 24 / 09 성능: doc_values와 wildcard 쿼리 제대로 이해하기
- 22 / 09 insert 후 생성된 PK를 돌려받는 법
- 21 / 09 메뉴를 지운다는 것 — 죽은 코드를 안전하게 걷어내기
- 15 / 09 캐시로 N+1을 가리면 더 큰 문제가 된다
- 10 / 09 집계(Aggregation): 버킷 집계 vs 메트릭 집계
- 10 / 09 HTTP의 진화 — 1.1의 줄 서기에서 HTTP/2 멀티플렉싱, HTTP/3까지
- 08 / 09 DB 컬럼에 JSON을 넣으면 생기는 일
- 07 / 09 컬럼이 너무 많은 테이블을 세로로 가르기
- 04 / 09 역할별 연관을 컬럼으로 둘까 연결 테이블로 둘까 — 다대다 모델링
- 31 / 08 조회 결과 30만 건이 메모리를 삼키기 전에
- 28 / 08 대소문자를 가리지 않는 검색의 비용 — collation과 함수 인덱스
- 27 / 08 검색의 핵심: match vs term, 그리고 분석기(Analyzer)
- 25 / 08 TypeHandler: enum과 컬럼 사이의 번역가
- 21 / 08 한 화면에서 고치면 다른 화면도 바뀌어야 한다 — 갱신 후 상태 동기화
- 20 / 08 그래프 순회 — BFS의 물결, DFS의 깊이, 그리고 위상정렬
- 18 / 08 ajax 실패를 사용자에게 정직하게 알리는 법
- 14 / 08 셀 하나를 고치면 무엇이 저장되는가 — 인라인 편집의 갱신 계약
- 13 / 08 Elasticsearch 기본 개념: 역색인(Inverted Index)과 문서 모델
- 11 / 08 ControllerAdvice로 예외를 한 곳에서
- 10 / 08 주소를 위도·경도로 바꾸는 보강 파이프라인
- 31 / 07 반경 1km 안의 현장을 빠르게 — 거리 조건 쿼리의 함정
- 30 / 07 제약조건 설정 시 주의해야 할 부분
- 28 / 07 MyBatis 1차·2차 캐시를 정확히 이해하기
- 24 / 07 지도 화면에 보이는 만큼만 — 위경도 범위 조회와 인덱스
- 21 / 07 200으로 에러를 숨기지 마라: 상태코드의 의미
- 16 / 07 제약조건에 대해서 (PRIMARY KEY, UNIQUE, NOT NULL, CHECK)
- 14 / 07 싱글톤 빈에 상태를 두면 안 되는 이유
- 10 / 07 스크롤을 내릴수록 따라오는 목록 — 무한 스크롤 서버 설계
- 09 / 07 DNS는 어떻게 이름을 주소로 바꾸나 — 루트부터 권한 서버까지, 그리고 캐시의 마법
- 02 / 07 텍스트 검색 최적화: phraseto_tsquery
- 30 / 06 같은 클래스 메서드 호출엔 트랜잭션이 안 걸린다
- 26 / 06 끌어다 놓은 순서를 서버가 기억하게 하기 — 행 재정렬의 저장
- 19 / 06 저장된 필터를 다시 열면 그대로여야 한다 — 필터 상태 영속화
- 18 / 06 PostGIS 성능 비교: GEOMETRY vs TEXT 저장 방식
- 16 / 06 페이지네이션 UI의 시작·끝 블록 계산을 서버가 책임지는 이유
- 11 / 06 이진 탐색 트리와 균형 — 한쪽으로 쏠리는 트리를 회전으로 바로 세우기
- 10 / 06 외부 API를 갈아끼우는 설계 — 전략과 팩토리로 클라이언트 추상화하기
- 09 / 06 URL은 동사가 아니라 명사다
- 08 / 06 체크박스 여러 개로 거르는 필터를 쿼리로 옮기기
- 04 / 06 PostGIS 설치 및 사용
- 02 / 06 있으면 수정 없으면 추가, 그 사이의 경쟁
- 01 / 06 배너 클릭을 세는 카운터를 만드는 법
- 26 / 05 에러를 분류해 코드로 말하게 하기
- 21 / 05 주 단위 데이터 분석, DATE_TRUNC로 해결하기
- 19 / 05 IN 절에 리스트를 넘길 때 생기는 일
- 12 / 05 검색어 정규화: 공백·대소문자·전각이 일으키는 누락
- 07 / 05 PostgreSQL B-tree 인덱스에 대해서
- 07 / 05 UDP와 QUIC — TCP를 버려야 더 빨라지는 순간
- 05 / 05 저장 전에 입력을 다듬는 정규화 계층
- 28 / 04 저장과 메시지 발행을 한 트랜잭션으로 묶기
- 21 / 04 필요할 때 불러올까, 미리 불러올까
- 20 / 04 운영 중 레디스 키를 들여다보고 지우는 도구
- 16 / 04 재귀와 분할정복 — 콜스택에 쌓이는 신뢰, 마스터 정리로 푸는 비용
- 14 / 04 읽기와 쓰기 모델을 갈라 생각하기
- 07 / 04 수정 이력을 버전으로 보관하는 설계
- 31 / 03 다중 키워드 검색: AND인가 OR인가
- 24 / 03 검색 조건을 객체로 다루는 쿼리 빌더
- 19 / 03 [이펙티브 자바] 아이템 9: try-finally보다 try-with-resources를 사용하라
- 17 / 03 대량 저장에서 커밋 시점을 고르는 법
- 16 / 03 필드 주입을 버리고 생성자 주입으로 가는 이유
- 10 / 03 이미 지운 걸 또 지우면 에러여야 할까
- 09 / 03 조회는 GET, 변경은 POST — 메서드를 다시 잡다
- 05 / 03 [이펙티브 자바] 아이템 8: finalizer와 cleaner 사용을 피하라
- 05 / 03 TCP는 얼마나 빨리 보낼까 — 흐름 제어 vs 혼잡 제어, 그리고 톱니파의 비밀
- 03 / 03 API를 남용으로부터 지키는 레이트리밋
- 02 / 03 운영자가 끌어 정한 노출 순서를 저장하는 법
- 25 / 02 컬럼 기본값을 코드에서 줄까 DB에서 줄까
- 20 / 02 [이펙티브 자바] 아이템 7: 다 쓴 객체 참조를 해제하라
- 18 / 02 없는 데이터를 계속 조회하면 캐시가 무력해진다
- 17 / 02 5MB 넘는 파일을 막는 자리 — 업로드 크기·타입 가드
- 13 / 02 이진 탐색 — 반씩 버리는 마법, 그리고 "답을 이분하라"
- 11 / 02 타이핑마다 날아오는 검색 요청을 다루는 법
- 06 / 02 [이펙티브 자바] 아이템 6: 불필요한 객체 생성을 피하라
- 04 / 02 다운로드 파일명이 깨지는 진짜 이유
- 28 / 01 여러 상세를 한 번에 불러오는 배치 조회 — N+1을 IN 한 방으로
- 23 / 01 BWT(Burrows-Wheeler Transform) 알고리즘
- 21 / 01 엑셀 업로드 파싱과 행 단위 검증 — 부분 실패를 다루는 법
- 16 / 01 베이지안 네트워크(Bayesian Network)
- 14 / 01 수십만 건을 한 트랜잭션에 담지 마라 — 청크 처리와 체크포인트
- 13 / 01 누가 무엇을 내려받았나 — 다운로드 이력 로깅
- 11 / 01 부수효과를 어느 훅에 둘 것인가 — ItemWriteListener의 beforeWrite와 afterRead
- 09 / 01 TCP는 어떻게 신뢰를 만드나 — 3-way handshake, 상태 머신, 그리고 TIME_WAIT
- 09 / 01 접미사 트라이(Suffix Trie), 접미사 트리(Suffix Tree), 나이브 베이즈(Naive Bayes)
- 08 / 01 운영의 기술 + 현대 DB 지형 — 커넥션 풀부터 NewSQL·벡터·시계열까지
- 07 / 01 왜 체크예외는 롤백하지 않는가 — Spring 기본 롤백 규칙
- 06 / 01 이미지가 딸린 CRUD 어드민을 만드는 표준 골격
- 04 / 01 외부 API 호출 한도가 바닥나면 멈춰야 한다 — 소비자 측 쿼터 소진과 우아한 중단
- 31 / 12 에러를 하나씩 말고 한꺼번에 돌려주기 — 검증 오류 누적
- 30 / 12 INSERT 할 때 ID는 누가 만드나 — 시퀀스와 자동증가
- 24 / 12 롤백할 수 없는 작업을 되돌리는 법 — 보상 트랜잭션과 사가
- 21 / 12 배치 ItemReader가 같은 행을 다시 읽지 않게 — 페이징과 재시작 안전 쿼리
- 20 / 12 캐싱과 일관성 — Redis를 앞에 두면 생기는 것들
- 17 / 12 상태가 바뀔 때마다 기록을 남기는 설계
- 16 / 12 성능 관찰과 병목 분석 — "느려요"를 추측이 아니라 측정으로 (시리즈 마무리)
- 12 / 12 선형 시간 정렬 — 비교를 버리면 Ω(n log n) 벽이 사라진다
- 10 / 12 부분 취소와 환불의 정합성
- 03 / 12 LIKE 검색은 왜 인덱스를 못 타는가
- 01 / 12 NoSQL 지도 — Key-Value·Document·Wide-Column·Graph, 언제 무엇을
- 28 / 11 가상화와 컨테이너 — VM과 컨테이너, 격리 스펙트럼의 양 끝
- 26 / 11 깊은 페이지에서 느려지는 진짜 이유와 keyset 페이징
- 19 / 11 클라이언트가 보낸 금액을 믿지 마라
- 12 / 11 필요한 필드만 골라 응답하기 — Sparse Fieldset
- 12 / 11 분산 트랜잭션·CAP·합의 — 여러 노드가 하나처럼 합의하기
- 10 / 11 블록 I/O와 페이지 캐시 — 같은 파일을 두 번째 읽으면 왜 빠른가
- 07 / 11 ARP와 L2/L3 경계 — IP는 아는데 왜 MAC을 또 묻나
- 05 / 11 로그와 응답에서 민감정보를 가리는 법
- 29 / 10 같은 객체, 다른 검증: 등록과 수정의 규칙 차이
- 24 / 10 파티셔닝과 샤딩 — 테이블이 너무 커졌을 때
- 23 / 10 I/O·인터럽트·DMA — CPU보다 백만 배 느린 장치와 효율적으로 대화하기
- 22 / 10 캐시 키를 잘못 잡으면 캐시가 안 산다
- 17 / 10 비교 정렬 — 퀵·머지·힙, 그리고 Ω(n log n)이라는 넘을 수 없는 벽
- 15 / 10 불리언 플래그가 늘어나면 enum을 의심하라
- 08 / 10 여러 단계 입력을 안전하게 모으는 법
- 05 / 10 파일 시스템 (2) — 쓰는 중 전원이 꺼지면? 저널링과 크래시 일관성
- 05 / 10 복제 — 한 대가 죽어도 살아남기 + 읽기를 여러 대로
- 01 / 10 빠른 화면 응답과 서버 진실의 간극
- 24 / 09 충돌하지 않는 식별자를 만드는 법 — auto_increment부터 Snowflake까지
- 17 / 09 결제 통보가 두 번 와도 한 번만 처리하기 — 웹훅 멱등성
- 17 / 09 파일 시스템 (1) — 파일명은 파일이 아니다, inode와 VFS의 세계
- 16 / 09 플랜이 갑자기 느려졌어요 — 카디널리티 추정과 통계의 세계
- 10 / 09 캐시 무효화: 컴퓨터과학의 두 난제 중 하나
- 05 / 09 라우팅은 어떻게 길을 찾나 — 라우팅 테이블, Longest Prefix Match, 그리고 BGP
- 03 / 09 실시간 집계와 사전 집계의 갈림길 — 신선도와 비용의 트레이드오프
- 30 / 08 메모리 할당자 — malloc은 어떻게 힙을 쪼개나, buddy와 slab까지
- 28 / 08 EXPLAIN을 읽는 법 + 조인 알고리즘 — Nested Loop·Hash·Merge
- 27 / 08 한 번의 쿼리로 여러 집계를 동시에 — 조건부 집계
- 15 / 08 해시 테이블 — 평균 O(1)의 비밀과 그 평균이 깨지는 순간
- 13 / 08 결과를 다 모으지 말고 흘려보내기 — 커서와 fetchSize 스트리밍
- 12 / 08 페이지 교체 알고리즘 — 메모리가 꽉 찼을 때 누구를 쫓아낼까
- 09 / 08 WAL과 크래시 복구 — 정전이 나도 데이터가 안 날아가는 이유
- 06 / 08 등록·수정·삭제를 하나의 상태 흐름으로
- 05 / 08 카카오·문자·메일을 한 인터페이스 뒤에 숨기기
- 30 / 07 필요한 컬럼만 조회하면 빨라진다
- 29 / 07 화면만 먼저, 기능은 나중에 — 운영 기능의 단계적 출시
- 25 / 07 페이지 폴트·디맨드 페이징·스왑 — malloc 1GB가 즉시 성공하는 이유
- 23 / 07 총건수 캐싱과 캐시 스탬피드
- 21 / 07 잠금 — 행 락·테이블 락·2PL, 그리고 데드락은 왜 생기나
- 16 / 07 자동완성은 어떻게 즉각 응답하는가
- 09 / 07 같은 핸들러로 HTML과 JSON을 모두 줄 때
- 07 / 07 페이징·페이지 테이블·TLB — 4단계 주소 변환과 그 캐시
- 04 / 07 IP 주소와 서브넷팅 — /24를 /26으로 쪼갠다는 게 비트 단위로 무슨 뜻인가
- 02 / 07 무한 스크롤을 받치는 커서 페이지네이션
- 02 / 07 MVCC 내부 — 읽기가 쓰기를 막지 않는 마법의 정체
- 25 / 06 서버 시간과 사용자 시간이 다를 때
- 19 / 06 가상 메모리 — 모든 프로세스가 같은 주소에서 시작하는데 왜 안 겹치나
- 18 / 06 입력 길이를 제한하지 않으면 생기는 일
- 13 / 06 격리 수준과 이상현상 — Dirty·Non-repeatable·Phantom, 그리고 그 너머
- 13 / 06 스택·큐·힙 — 접근 규칙 하나가 만드는 강력함
- 11 / 06 WHERE 없는 UPDATE 한 줄의 공포
- 04 / 06 누가 언제 무엇을 바꿨는가: 감사 로그 설계
- 01 / 06 동기화 (2) — 세마포어·조건 변수, 그리고 데드락의 네 가지 조건
- 28 / 05 NPE를 설계로 막는 법
- 25 / 05 트랜잭션과 ACID — 원자성과 영속성은 대체 어떻게 보장되나
- 21 / 05 프런트 검증은 UX, 서버 검증은 안전
- 14 / 05 컨트롤러가 뷰에 넘기는 데이터의 계약
- 14 / 05 동기화 (1) — 경쟁 상태와 임계 구역, 뮤텍스 vs 스핀락
- 09 / 05 이더넷·MAC·스위치 — 스위치는 어떻게 "어느 포트로 보낼지" 스스로 배우나
- 07 / 05 파라미터 기본값과 경계값을 서버가 정한다
- 06 / 05 B-Tree로 안 되는 것들 — Hash·GIN·GiST·BRIN 인덱스 지도
- 30 / 04 목록 화면이 느릴 때 의심할 첫 번째 범인
- 26 / 04 프로세스 간 통신(IPC) — 격리된 프로세스가 협력하는 법, 파이프부터 공유 메모리까지
- 23 / 04 폼 전송을 위조하는 공격을 막는 토큰
- 22 / 04 목록과 총건수를 한 번의 왕복으로 — 운영 화면 응답 합치기
- 17 / 04 인덱스를 걸었는데 왜 안 타나 — 복합·커버링·부분·표현식 인덱스
- 16 / 04 SQL 인젝션: 문자열로 쿼리를 만들지 마라
- 11 / 04 배열과 연결 리스트 — 같은 O(n)인데 왜 한쪽이 수십 배 느린가
- 09 / 04 중복 제출: 같은 요청이 두 번 오면
- 08 / 04 약관 링크를 코드에 박지 말고 테이블로 — 운영자가 바꾸는 값
- 08 / 04 컨텍스트 스위치 — 전환은 공짜가 아니다, 직접비용과 캐시·TLB 오염
- 02 / 04 남의 데이터를 보게 만드는 ID 하나
- 29 / 03 B-Tree 인덱스 — 어떻게 수억 건에서 한 건을 밀리초에 찾나
- 26 / 03 DB에 저장하는 민감정보를 암호화하기
- 21 / 03 CPU 스케줄링 — 누구에게 CPU를 줄까, FCFS부터 리눅스 CFS까지
- 19 / 03 조인했더니 행이 사라지는 이유
- 18 / 03 환불 금액을 문자열로 비교하면 생기는 일
- 12 / 03 중복을 코드가 아니라 DB가 막게 하라
- 11 / 03 개발과 운영의 외부 API 키를 가르는 법
- 10 / 03 디스크 위의 데이터 — 페이지·힙·로우는 어떻게 저장되나
- 07 / 03 OSI 7계층과 TCP/IP — 왜 네트워크를 굳이 층으로 쪼갰나
- 05 / 03 새로고침하면 두 번 등록되는 버그
- 04 / 03 모달을 열 때 비로소 부르는 데이터 — 상세 지연 로딩
- 03 / 03 스레드와 동시성 — 한 주소 공간 속 여러 실행 흐름, 그리고 비결정성의 시작
- 26 / 02 삭제하지 않는 삭제: soft delete의 비용
- 19 / 02 집계 쿼리는 왜 느리고 어떻게 빨라지나
- 19 / 02 SELECT 한 줄이 도는 길 — 파서·플래너·옵티마이저·익스큐터
- 14 / 02 복잡도 분석 — Big-O, 점근 표기, 그리고 분할상환이라는 거짓말 같은 진실
- 13 / 02 프로세스란 무엇인가 — 주소 공간·PCB·fork와 exec, 그리고 COW의 마법
- 12 / 02 요청 DTO와 도메인 객체를 분리하는 이유
- 05 / 02 @Valid 검증: 어디까지 컨트롤러에서 막을까
- 31 / 01 관계형 모델과 정규화 — 왜 멀쩡한 표를 굳이 쪼개나
- 29 / 01 비관적 락과 SELECT FOR UPDATE
- 26 / 01 부팅 — 전원 버튼에서 커널까지, 그 1초 사이에 일어나는 모든 일
- 22 / 01 상태 코드 컬럼 설계: 매직넘버를 없애라
- 15 / 01 SQL의 NULL은 거짓이 아니다
- 14 / 01 이 사용자가 흔적을 남겼나 — 존재 여부 컬럼을 만드는 법
- 12 / 01 데이터베이스란 무엇인가 — 왜 우리는 파일 대신 DBMS를 쓰는가
- 10 / 01 네트워크란 무엇인가 — 회선 교환 vs 패킷 교환, 왜 인터넷은 패킷을 선택했나
- 08 / 01 낙관적 락: 버전 컬럼 하나로 동시 수정 막기
- 08 / 01 운영체제란 무엇인가 — 커널·유저모드·시스템콜, 왜 프로그램은 하드웨어를 직접 못 만지나
- 07 / 01 총매출에서 환불을 빼는 집계 — 코드값을 명칭으로 바꾸기
- 31 / 12 라이브러리를 올렸더니 컴파일이 깨졌다 — deprecated API 마이그레이션
- 25 / 12 association/collection과 N+1 쿼리의 함정
- 24 / 12 엑셀로 내려준 표가 깨져 보일 때 — POI 셀 스타일과 열 너비
- 18 / 12 목록 응답을 감싸는 표준 봉투 설계
- 11 / 12 @Transactional 전파: REQUIRED가 기본인 이유
- 10 / 12 배치는 돌았는데 성공했을까 — 배치 실행 이력 관리 화면
- 04 / 12 조건 없는 검색은 전체인가 빈 값인가
- 27 / 11 resultType vs resultMap, 무엇을 언제
- 20 / 11 검색 결과 0건과 NULL의 차이를 백엔드가 만든다
- 13 / 11 ajax 전송과 form submit, 서버 입장의 차이
- 06 / 11 foreach 배치 insert: 1건씩 vs 한 방에
- 30 / 10 부분 수정: 변경된 필드만 UPDATE 하기
- 23 / 10 정렬·필터 파라미터를 화이트리스트로 막기
- 22 / 10 방문 통계에서 봇과 내부 계정을 걷어내기
- 09 / 10 검색 결과에서 키워드를 강조하는 일의 무게
- 08 / 10 접속 로그를 날짜로 잘라 내려받기 — 운영 감사 데이터 추출
- 02 / 10 resultMap: 컬럼과 객체를 잇는 다리
- 25 / 09 특수문자와 엔터키가 데이터를 깨뜨릴 때
- 18 / 09 저장된 검색어가 스크립트가 되는 순간
- 17 / 09 어드민 대시보드 숫자는 어디서 계산되나 — 기능별 집계 카운트
- 11 / 09 복합 인덱스 컬럼 순서가 검색 속도를 가른다
- 04 / 09 동적 검색조건을 안전하게 조립하는 법
- 28 / 08 검색과 페이징을 한 번에: 쿼리를 두 번 던지는 비용