TECH NOTES
기술노트
현장에서 검증된 개발 지식을 기록합니다.
142214211420141914181417141614151414141314121411
Frontend
fetchpriority와 preload — LCP 이미지를 먼저 불러오게 만들기
LCP를 차지하는 히어로 이미지를 브라우저가 먼저 내려받게 만드는 fetchpriority와 preload 실전 가이드. loading=lazy 오용과 srcset 불일치 같은 흔한 실수, 적용 후 확인 방법까지 짚었다.
AI
RAG 검색 평가지표 — Recall@k·MRR·nDCG로 검색 품질 재기
Recall@k·MRR·nDCG로 검색 단계를, faithfulness로 생성 단계를 재는 RAG 평가지표를 정리했다. 소규모 평가셋 만들기부터 지표를 층으로 나눠 검색이 문제인지 프롬프트가 문제인지 원인을 갈라내는 실전 진단법까지 담았다.
Tools
git rerere — 반복되는 병합 충돌을 기억시켜 자동 해결
어제 푼 충돌을 오늘 또 풀고 있나요? git rerere를 켜면 한 번 해결한 병합 충돌을 Git이 기억했다가 같은 충돌이 나면 자동으로 똑같이 풀어줍니다. 설정 한 줄이면 끝.
Database
키셋 페이지네이션 — OFFSET이 느린 이유와 커서 방식
LIMIT OFFSET은 왜 깊은 페이지에서 느려질까. 커서(키셋) 기반 페이지네이션으로 일정한 속도를 내는 법과 정렬 키·타이브레이커 설계, 실전 함정을 정리했다.
Infra
지속적 프로파일링 — 관측성의 네 번째 기둥, Pyroscope와 플레임그래프
운영 중 서비스에서 어느 함수가 CPU를 태우는지 상시로 본다. 지속적 프로파일링의 원리, 플레임그래프 읽는 법, 트레이스와의 차이까지 실전 관점으로 정리했다.
Backend
낙관적 락 vs 비관적 락 — DB 동시성 제어 두 가지 전략
같은 행을 여러 요청이 동시에 고칠 때 쓰는 낙관적 락과 비관적 락. SELECT FOR UPDATE와 버전 컬럼의 차이, 언제 무엇을 골라야 하는지 실무 기준으로 비교합니다.
Frontend
scheduler.yield() — 긴 작업을 쪼개 INP를 살리는 법
긴 자바스크립트 작업을 scheduler.yield()로 잘게 쪼개 메인 스레드를 양보하고 INP를 개선하는 법. setTimeout·requestIdleCallback·Web Worker와 무엇이 다른지, 언제 써야 하는지 예제로 정리했다.
AI
하이브리드 검색 — BM25와 벡터를 RRF로 합치기
BM25 키워드 검색과 임베딩 벡터 검색을 RRF로 합치는 하이브리드 검색을 다룬다. 점수 스케일이 달라 그냥 더하면 안 되는 이유, 순위 융합으로 푸는 법, 한국어 형태소 토크나이징 주의점, 리랭커와의 조합 순서까지 실전으로 정리했다.
Tools
git bisect run — 버그 커밋을 자동으로 이진 탐색하기
언제부턴가 깨진 회귀 버그, 커밋 200개를 눈으로 훑지 마세요. git bisect run에 판정 스크립트만 넘기면 문제를 처음 만든 커밋을 자동 이진 탐색으로 몇 초 만에 짚어줍니다.
Database
커버링 인덱스 — SELECT가 테이블을 아예 안 읽게 만들기
커버링 인덱스로 Index Only Scan을 유도해 테이블 힙 페치를 없애는 법. INCLUDE 절, 키 컬럼과의 차이, Heap Fetches가 0이 안 되는 이유까지 실무 관점으로 정리했다.
Infra
OpenTelemetry 시맨틱 컨벤션 안정화 — 속성 이름이 바뀌면 대시보드가 깨진다
OpenTelemetry 시맨틱 컨벤션이 Stable로 승격되며 http.method 같은 속성 이름이 대거 바뀌었다. 대시보드가 조용히 깨지지 않게 opt-in 스위치로 안전하게 이관하는 실전 순서를 정리했다.
Backend
백프레셔(Backpressure) — 빠른 생산자와 느린 소비자의 흐름 제어
생산자가 소비자보다 빠를 때 서버가 터지는 이유와 백프레셔로 흐름을 제어하는 법. Node.js 스트림, pull 모델, 드롭 전략까지 실전 관점으로 정리했습니다.