리팩토링의 경계 — 무엇까지가 리팩토링인가
동작을 바꾸면 리팩토링이 아니다. 인접한 작업들과 갈라놓고, 좋은 리팩토링의 판단 기준을 정리한다
동작을 바꾸면 리팩토링이 아니다. 인접한 작업들과 갈라놓고, 좋은 리팩토링의 판단 기준을 정리한다
Seq Scan이 Hash Join으로, Nested Loop이 Merge Join으로 바뀌는 조건을 실제 EXPLAIN 결과로 확인한다
weak generational hypothesis 하나로는 설명 안 되는 컬렉터별 동작 차이를, 같은 메모리 압박 상황에서 Serial·Parallel·G1의 실제 GC 로그로 비교해 확인한다
코루틴이 스레드와 어떻게 다른지, suspend 함수와 CoroutineScope·Job·Dispatcher가 하는 역할을 표와 예시로 정리한다.
suspend 함수가 컴파일 시점에 상태 머신으로 변환되는 과정을 바이트코드로 직접 확인하고, 콜백 기반 API 위에서 스레드를 블로킹하지 않고 중단·재개되는 동작을 재현한다.
각 행이 자신의 parent_id만 저장하는 가장 기본적인 계층 구조 저장 방식과, 재귀 조회가 필요한 이유·비용을 정리한다
부모-자식 컬럼만으로는 재귀 조회가 필요한 계층 구조를, 조상-자손 관계를 미리 계산해 저장하는 Closure Table로 다루는 방법을 정리한다
자바 프로그램이 실행되는 과정을 클래스 로딩, 런타임 메모리 영역, 실행 엔진 세 부분으로 정리한다
리스트 원소 포함 여부를 반복 확인할 때 Set으로 미리 바꾸는 것과 그냥 List로 쓰는 것을 벤치마크로 비교하고, 차이의 근거를 stdlib 소스에서 찾는다
트리를 깊이 우선으로 순회해 매긴 left/right 번호로 계층을 표현하는 Nested Set의 동작 방식과 실무 활용 예시를 정리한다
루트부터 현재 노드까지의 경로를 문자열에 이어붙여 저장하는 Path Enumeration의 동작 방식과 실무 활용 예시를 정리한다
min-heap을 배열로 표현하는 방식과 push·pop이 sift-up·sift-down으로 힙 속성을 지키는 과정을 정리한다
Kotlin 프로퍼티에 애노테이션을 붙일 때 field·get·set·param 중 어디로 갈지 정하는 use-site target을 표로 정리한다
use-site target이 왜 필요한지 실제 바이트코드를 javap로 확인한다
SQL 표준이 정의한 4단계 격리 수준과 각 단계가 허용하는 이상 현상을 정리한다
통계에 없는 값의 선택도가 0이 되고, 1로 clamp된 추정치가 Nested Loop을 부르기까지
EXPLAIN 출력에서 무엇을 먼저 보고 무엇을 무시해도 되는지 정리한다
기동 시 대량 적재가 auto-analyze 기준에 미달해 통계가 갱신되지 않았다
스프링이 주입하는 것은 원본 객체가 아니라 프록시다. 그 구조와 제약을 정리한다
트랜잭션이 무엇을 보장하고 무엇을 보장하지 않는지 네 속성으로 정리한다
진행 중인 트랜잭션을 만났을 때의 동작 7가지와 기본 롤백 규칙을 정리한다
Spring AOP의 프록시 기반 동작을 테스트로 확인했다
@Transactional 전파 속성과 rollback-only 표시를 테스트로 확인했다
표준 정의만 외우면 실무에서 틀리는 이유와, 테스트로 직접 확인한 기록