TECH NOTES
기술노트
현장에서 검증된 개발 지식을 기록합니다.
144014391438143714361435143414331432143114301429
Frontend
inert 속성 — 화면 밖 UI의 포커스와 스크린리더를 막는 표준 방법
inert 속성으로 화면 밖 UI의 키보드 포커스와 스크린리더 접근을 표준 방식 한 줄로 차단하는 법. aria-hidden·display:none과의 결정적 차이, 드로어와 커스텀 모달 배경에서의 실전 활용을 정리했다.
AI
임베딩 실전 — 정규화·차원 축소(Matryoshka)·유사도 함정
임베딩 실전 — L2 정규화와 코사인·내적을 헷갈리면 검색이 조용히 망가진다. Matryoshka 차원 축소, 질의·문서 비대칭 임베딩, 모델 교체 시 전체 재색인까지 벡터 검색 품질을 좌우하는 설정들을 실수 사례와 함께 정리했다.
Tools
잠금 파일과 재현 가능한 빌드 — npm ci를 써야 하는 이유
내 컴퓨터에선 되는데 CI에선 깨지는 유령 버그의 정체는 잠금 파일입니다. package.json 범위와 lockfile의 차이, npm install과 ci의 결정적 차이를 실무 규칙과 함께 정리했습니다.
Database
HNSW vs IVFFlat — 벡터 인덱스 두 종류, 언제 무엇을
pgvector의 두 벡터 인덱스 HNSW와 IVFFlat을 리콜·속도·메모리·증분 갱신 관점으로 비교. 파라미터 튜닝과 필터 조합 함정까지 RAG 실무 기준으로 정리했다.
Infra
Argo Rollouts — 지표로 자동 판정하는 카나리 배포
그라파나 앞에서 카나리를 노려보는 일을 규칙으로 넘긴다. Argo Rollouts의 AnalysisTemplate으로 에러율·지연을 보고 자동 롤백하는 점진적 배포 구성법을 정리했다.
Backend
트랜잭셔널 아웃박스 패턴 — 이중 쓰기 문제를 없애는 법
DB 저장과 메시지 발행 사이의 이중 쓰기 문제를 outbox 테이블로 푸는 법. 폴링과 CDC 릴레이, at-least-once와 멱등 소비자까지 실전 관점으로 설명합니다.
Frontend
<dialog> 요소 — 라이브러리 없이 접근성 갖춘 네이티브 모달
HTML dialog 요소와 showModal() 하나로 포커스 가둠·배경 비활성화·ESC 닫기·접근성 역할까지 공짜로 얻는 법. 백드롭 클릭으로 닫기, 닫힘 애니메이션 등 놓치기 쉬운 디테일까지 예제로 다뤘다.
AI
구조화 출력 신뢰성 — 스키마 강제·검증·재시도
LLM 구조화 출력을 100% 믿을 수 없을 때의 방어법. 스키마 강제·검증·재시도 3단 구조, 토큰 잘림과 안전 거부처럼 강제로 못 막는 실패의 처리, enum과 additionalProperties 활용까지 JSON 출력을 튼튼하게 만드는 실전이다.
Tools
Makefile 제대로 쓰기 — .PHONY, 자동 변수, 증분 빌드
C 빌드용이라는 편견은 접어두세요. .PHONY, 자동 변수, 패턴 규칙으로 언어 무관 프로젝트의 증분 빌드와 명령 런처를 만드는 법, 그리고 탭 함정과 서브셸 실수까지.
Database
EXPLAIN ANALYZE로 실행계획 읽기 — 느린 쿼리를 눈으로 잡기
EXPLAIN ANALYZE로 데이터베이스가 쿼리를 실제 어떻게 실행했는지 읽는 법 — actual time·rows 추정치·스캔 종류를 보고 느린 쿼리를 감이 아니라 근거로 잡는다.
Infra
테일 샘플링 — 에러 트레이스는 남기고 트레이스 저장 비용은 줄이는 법
head 샘플링은 에러 트레이스를 확률에 맡긴다. OTel Collector의 tail_sampling으로 트레이스 내용을 보고 저장을 결정해, 에러는 보존하고 저장 비용은 줄이는 법.
Backend
타임아웃 예산과 데드라인 전파 — 유령 작업을 없애는 법
서비스 체인에서 각자 타임아웃을 잡으면 생기는 유령 작업 문제. 데드라인 전파와 Go context로 남은 시간을 넘겨 자원 낭비를 막는 법을 정리했습니다.