TECH NOTES
기술노트
현장에서 검증된 개발 지식을 기록합니다.
140414031402140114001399139813971396139513941393
Infra
로드 밸런싱 기초 — 트래픽을 여러 서버로 나누기
서버 한 대로 버티다 늘리려면 앞에 로드 밸런서가 필요하다. 라운드로빈·least connection 같은 분산 방식과 세션·헬스체크 함정까지.
Etc
Big-O 표기법 — 실무 개발자를 위한 최소한
알고리즘 이론이 아니라, 코드가 데이터 10배 커지면 얼마나 느려지는지 가늠하는 도구. O(1)·O(n)·O(n²)만 알아도 대부분의 성능 사고를 예방한다.
Etc
문자 인코딩과 UTF-8 — 한글이 깨지는(모지바케) 이유
"한êµì–´"처럼 글자가 깨져 보이는 건 저장한 인코딩과 읽는 인코딩이 다르기 때문이다. 바이트와 문자, UTF-8·EUC-KR·BOM까지 한 번에 정리한다.
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 정리.