TECH NOTES
기술노트
현장에서 검증된 개발 지식을 기록합니다.
160816071606160516041603160216011600159915981597
Database
실행계획이 갑자기 바뀌었을 때 — 플랜 고정과 쿼리 힌트 다루기
어제까지 빠르던 쿼리가 오늘 느려지는 이유와 대응책을 정리한다. 파라미터 스니핑, 통계 갱신에 따른 계획 변경, 힌트와 플랜 고정의 사용법, 그리고 그 전에 해야 할 구조적 해결을 다룬다.
Tools
coreutils 교체 검증하기 — uutils 전환 전에 돌려 볼 것들
GNU coreutils를 Rust 구현으로 바꿀 때 실제로 깨지는 지점을 정리한다. 출력 문자열 파싱, 로케일 의존, 플래그 차이, 종료 코드까지 스크립트를 안전하게 지키는 검증 절차를 다룬다.
Backend
격벽과 부하 제한 — 장애 전파를 끊는 나머지 절반
타임아웃과 서킷 브레이커만으로는 부족하다. 의존성별 자원 풀 분리(격벽), 대기 시간 기반 부하 제한, 적응형 동시성 제어까지 장애가 번지는 경로를 끊는 방법을 정리한다.
Tools
SBOM 만들고 쓰기 — syft·grype로 의존성 인벤토리 구축하기
SBOM(소프트웨어 자재명세서)을 실제로 생성하고 활용하는 방법을 정리한다. 형식 선택, 빌드 파이프라인 통합, 취약점 스캔 연동, 그리고 "만들어만 두고 안 쓰는" 함정을 피하는 법을 다룬다.
Database
학습 기반 쿼리 최적화 — 모델이 옵티마이저를 도울 수 있는 지점
옵티마이저가 실행계획을 고르는 과정에서 무엇이 틀리는지, 학습 기반 접근이 어디를 개선하는지 정리한다. 카디널리티 추정 오류, 플랜 선택, 적용 시 운영 리스크와 검증 방법을 다룬다.
Mobile
안드로이드 파편화 대응 — 기능 감지와 폴백으로 버티는 코드
제조사·기기별로 API 가용성이 갈리는 환경에서 앱이 깨지지 않게 만드는 패턴을 정리한다. 기능 감지, 런타임 존재 확인, 폴백 QA, 크래시 대시보드 태깅까지 실무 기준으로 다룬다.
Infra
x86 에뮬레이션 이해하기 — ARM 서버로 옮길 때 무엇이 느려지나
ARM 환경에서 x86 바이너리를 돌릴 때 쓰이는 이진 변환의 구조와 비용을 정리한다. 메모리 모델 차이, 변환 캐시, SIMD 처리, 그리고 실제 마이그레이션에서 네이티브로 가야 하는 지점을 다룬다.
Frontend
긴 목록 렌더링 최적화 — content-visibility와 가상 스크롤 중 무엇을 쓸까
수천 개 항목을 그리는 화면에서 content-visibility, contain-intrinsic-size, 가상 스크롤의 차이를 정리한다. 각 기법이 해결하는 비용의 종류와 접근성·검색·스크롤 위치 문제까지 다룬다.
Backend
익명 자격 증명 설계 — 신원을 저장하지 않고 권한만 검증하는 법
1인 1회 참여, 유료 회원 확인, 봇 차단 같은 요구를 신원 저장 없이 푸는 방법을 정리한다. 블라인드 서명, 일회성 토큰, 비용 기반 증명의 구조와 실무 구현 시 주의점을 다룬다.
AI
코딩 에이전트 샌드박싱 — 파일·네트워크·시크릿 경계 설계
에이전트에게 실행 권한을 주는 순간 필요한 경계 설계를 정리한다. 작업 디렉터리 제한, 네트워크 이그레스 통제, 시크릿 분리, 승인 게이트, 감사 로그까지 실행 가능한 형태로 다룬다.
Database
포스트그레SQL 파티션 재구성 — 병합·분할을 안전하게 수행하는 절차
시계열 파티션을 합치거나 쪼개야 할 때 쓰는 DETACH/ATTACH 패턴을 정리한다. 잠금 범위, CONCURRENTLY 옵션, 제약 조건 검증 생략, 대용량에서의 배치 이동까지 실무 절차로 다룬다.
Infra
eBPF 프로그램 성능 튜닝 — 맵 조회 비용을 줄이는 실전 기법
eBPF 프로그램이 CPU를 먹는 주된 원인은 맵 조회와 과도한 이벤트 발생이다. 맵 타입 선택, per-CPU 자료구조, 결과 메모이제이션, 샘플링, 링버퍼 사용까지 오버헤드를 줄이는 방법을 정리한다.