TECH NOTES
기술노트
현장에서 검증된 개발 지식을 기록합니다.
140814071406140514041403140214011400139913981397
Tools
시맨틱 버저닝(SemVer) — 버전 번호 x.y.z가 뜻하는 것
1.4.2에서 각 숫자는 아무렇게나 붙는 게 아니다. MAJOR.MINOR.PATCH 규칙과 ^·~ 범위, 그리고 0.x의 의미까지 정리한다.
Infra
Linux "Too many open files" — 파일 디스크립터와 ulimit
트래픽이 몰리면 서버가 이 에러를 뱉으며 연결을 못 받는다. 소켓·파일이 모두 "열린 파일"인 이유와, ulimit로 한계를 올리는 법.
Backend
뮤텍스와 세마포어 차이 — 동시성 제어의 기본
둘 다 공유 자원을 지키는 도구지만, 뮤텍스는 "화장실 열쇠 1개", 세마포어는 "주차장 N자리"다. 소유권·용도 차이를 실전 관점에서 정리.
Backend
ReDoS — 정규식 하나가 서버를 멈추는 취약점
입력 몇 글자에 CPU가 100%로 치솟고 서버가 멎는다. 취약한 정규식의 "재앙적 백트래킹" 원리와, 안전하게 짜는 법.
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을 받아 새 요청은 막고 진행 중인 건 마무리하는 법.