TECH NOTES
기술노트
현장에서 검증된 개발 지식을 기록합니다.
140114001399139813971396139513941393139213911390
Database
SQL GROUP BY와 집계 함수 — 데이터를 묶어서 요약하기
"카테고리별 매출 합계"처럼 묶어서 계산하는 GROUP BY. COUNT·SUM·AVG와 WHERE·HAVING의 차이까지, 집계 쿼리의 기본을 정리.
Database
트랜잭션 ACID란 — 데이터가 깨지지 않게 지키는 4가지
계좌 이체 중간에 서버가 죽으면 돈이 사라질까? 트랜잭션의 ACID(원자성·일관성·격리성·지속성)가 이런 사고를 막는 원리를 쉽게 정리.
Backend
로그 레벨과 구조화 로깅 — 디버깅이 쉬워지는 로그 쓰기
console.log만 흩뿌리면 정작 장애 때 원하는 로그를 못 찾는다. ERROR·WARN·INFO·DEBUG 구분과 JSON 구조화 로깅으로 검색 가능한 로그 만들기.
Backend
피처 플래그 기초 — 코드는 배포하되 기능은 나중에 켜기
배포와 기능 출시를 분리하는 스위치. 미완성 기능을 숨긴 채 배포하고, 문제 생기면 코드 롤백 없이 끄기만 하면 되는 피처 플래그의 기본.
Backend
우아한 종료(graceful shutdown) — 배포할 때 요청 끊기지 않게
배포로 서버를 재시작할 때 처리 중이던 요청이 뚝 끊기면 사용자는 에러를 본다. SIGTERM을 받아 새 요청은 막고 진행 중인 건 마무리하는 법.
Database
UUID vs 자동증가 — 기본키로 무엇을 쓸까
순차 정수 ID는 간단하고 빠르지만 예측 가능하고 분산에 약하다. UUID는 겹칠 걱정이 없지만 크고 인덱스에 부담. 상황별 선택 기준.
Database
인덱스의 단점 — 언제 인덱스를 만들지 말아야 하나
인덱스는 조회를 빠르게 하지만 공짜가 아니다. 쓰기 성능 저하, 저장공간, 안 타는 인덱스까지. 무작정 다는 게 답이 아닌 이유.
Backend
REST API 버저닝 전략 — URL·헤더 어느 쪽이 정답인가
API를 바꾸면 기존 클라이언트가 깨진다. /v1/ URL 방식과 헤더 방식의 장단점, 그리고 애초에 버전을 덜 올리는 하위호환 설계까지.
Database
SQL JOIN 완벽 이해 — INNER·LEFT·RIGHT 언제 무엇을
두 테이블을 합칠 때 INNER는 교집합, LEFT는 왼쪽 전부. 이 차이 하나로 결과 행 수가 달라지고 버그가 생긴다. 그림처럼 이해하는 JOIN 정리.
Tools
Git stash — 작업을 잠시 치워두고 브랜치 옮기기
커밋하기 애매한 작업 중에 급하게 다른 브랜치로 가야 할 때, stash로 변경사항을 잠시 서랍에 넣어두고 나중에 꺼내는 법. pop·apply·list 실전 정리.
Tools
좋은 커밋 메시지 쓰는 법 — Conventional Commits
"fix", "수정함" 같은 커밋 메시지는 6개월 뒤 나를 괴롭힌다. 왜·무엇을 남기는 규칙과 Conventional Commits로 자동 changelog까지.
AI
AI 코딩 도구 잘 쓰는 법 — 프롬프트보다 컨텍스트 관리
Copilot·Cursor·Claude Code가 엉뚱한 코드를 낸다면 프롬프트가 아니라 컨텍스트 문제일 때가 많다. 좋은 결과를 얻는 실전 습관을 정리한다.