TECH NOTES
기술노트
현장에서 검증된 개발 지식을 기록합니다.
132913281327132613251324132313221321132013191318
Database
N+1 쿼리 문제, 발견과 해결
목록 1번 + 각 항목마다 1번씩 쿼리가 나가는 N+1은 성능 킬러다. eager loading·조인·in 절·DataLoader로 한 방에 줄인다.
Database
PostgreSQL 테이블이 계속 커진다 — VACUUM과 부풀음
행을 지워도 디스크가 안 줄고 느려지는 건 MVCC 죽은 튜플(bloat) 때문. autovacuum·VACUUM·인덱스 재생성 정리.
Backend
.env 환경변수 관리와 흔한 유출 사고 막기
.env를 깃에 올려 키가 유출되는 사고가 흔하다. gitignore·시크릿 매니저·프론트 노출 변수 구분까지 안전 관리법.
Database
PostgreSQL 인덱스를 만들었는데 안 타는 이유
인덱스가 있어도 Seq Scan을 하는 건 이유가 있다. 함수 가공·형변환·낮은 선택도·통계 부재 등 원인을 EXPLAIN으로 짚는다.
Backend
결제 API 멱등성(idempotency), 중복 결제 막기
네트워크 재시도·더블클릭으로 같은 결제가 두 번 일어난다. Idempotency-Key로 "한 번만" 보장하는 표준 패턴.
Backend
Webhook 안전하게 받기 — 서명 검증과 멱등 처리
결제·외부 이벤트 webhook은 위조·중복 전송이 온다. HMAC 서명 검증으로 진위를, 이벤트 ID로 멱등성을 보장한다.
Backend
파일 업로드 서버 처리, multipart와 스트리밍
큰 파일을 메모리에 통째로 받으면 OOM 난다. 스트림으로 디스크/스토리지에 흘리고, 크기·확장자·MIME를 검증한다.
Backend
API rate limiting, 어떻게 구현하나 (토큰 버킷)
남용·DoS·비용 폭증을 막는 rate limit. 고정 윈도우의 경계 문제와 토큰 버킷·슬라이딩 윈도우 비교, Redis 구현.
Backend
비밀번호 해싱, bcrypt와 argon2 중 무엇을
비밀번호는 절대 평문·단순 해시(MD5/SHA) 저장 금지. bcrypt는 검증된 표준, argon2id는 현대 권장. 둘 다 안전하게 쓰는 법.
Backend
Node.js 메모리 누수 찾기 — 힙 스냅샷 실전
시간이 지날수록 메모리가 계속 오른다면 누수다. 전역 캐시·이벤트 리스너·클로저가 단골 범인. 힙 스냅샷 비교로 추적.
Backend
JWT vs 세션, 인증 방식 선택과 흔한 보안 실수
JWT가 항상 정답은 아니다. 무상태 확장성 vs 즉시 무효화의 트레이드오프, 그리고 토큰 저장 위치 같은 보안 실수 정리.
Backend
API 페이지네이션, offset과 cursor 중 무엇을
offset/limit은 구현이 쉽지만 뒤로 갈수록 느리고 데이터가 밀린다. 무한 스크롤·대용량엔 cursor 기반이 정답.