TECH NOTES
기술노트
현장에서 검증된 개발 지식을 기록합니다.
134113401339133813371336133513341333133213311330
Infra
systemd 서비스로 앱을 안정적으로 띄우기
pm2 대신 systemd로 충분하다. 자동 재시작·부팅 시 실행·로그·보안 격리(ProtectSystem)까지 유닛 작성 가이드.
Infra
리눅스 디스크가 꽉 찼다 — 범인 찾기
No space left on device. du·df·로그·삭제됐지만 열린 파일·inode 고갈까지 단계적으로 원인을 추적한다.
Infra
Docker 이미지 용량 줄이기 — 멀티스테이지 빌드
1GB 넘는 Node 이미지를 100MB대로. 멀티스테이지·alpine·.dockerignore·레이어 순서로 빌드 도구를 최종 이미지에서 뺀다.
Infra
Let's Encrypt 인증서 자동 갱신, 만료로 사이트 죽이지 않기
90일 인증서는 자동 갱신이 핵심. certbot 타이머 동작 확인, 갱신 후 nginx reload, dry-run 점검까지.
Infra
nginx 502 Bad Gateway, 원인부터 잡기
502는 nginx가 업스트림(앱)에서 정상 응답을 못 받았다는 뜻. 앱 다운·소켓 경로·타임아웃·권한 순으로 점검한다.
Database
무중단으로 컬럼 추가하기 — 안전한 마이그레이션
NOT NULL+DEFAULT를 큰 테이블에 한 번에 걸면 잠금으로 장애가 난다. 단계적(expand-contract) 마이그레이션 절차.
Database
소프트 삭제 vs 하드 삭제, 무엇을 선택할까
deleted_at 컬럼으로 숨기는 소프트 삭제는 복구·감사에 좋지만 쿼리·유니크 제약·용량 부담이 따른다. 기준 정리.
Database
EXPLAIN ANALYZE 읽는 법 — 느린 쿼리 진단
Seq Scan·Nested Loop·actual time·rows 추정 오차. EXPLAIN ANALYZE에서 진짜 병목을 찾는 읽기 순서.
Database
복합 인덱스 컬럼 순서, 왜 중요한가
복합 인덱스 (a,b)는 a로 시작하는 조건엔 쓰이지만 b만으론 못 탄다. 등호·범위·정렬을 고려한 순서 설계.
Database
DB 커넥션 풀 사이즈, 크게 잡을수록 좋은 게 아니다
풀을 무작정 키우면 DB가 컨텍스트 스위칭으로 더 느려진다. 코어 수 기반 공식과 서버리스 환경의 함정.
Database
Redis 캐시 무효화 전략과 흔한 함정
"캐시 무효화는 컴퓨터과학 2대 난제." TTL·쓰기 시 무효화·캐시 스탬피드·일관성 트레이드오프를 실무 기준으로.
Database
트랜잭션 격리수준과 데드락, 실무 기준
Read Committed로 충분한 경우가 대부분이지만, 잔액·재고는 더 강한 격리나 잠금이 필요하다. 데드락 회피 원칙까지.