개발 팁
프로젝트와 상관없이 다시 쓸 수 있는 요령을 문제·원인·해법·코드 예시로 짧게 적습니다.
- 헬스체크는 싸게, 뜨는 동안만 촘촘히, 접근 로그에서는 뺀다 →검사 한 번의 비용을 간격으로 나눈 값이 상시 CPU다. 가벼운 도구로 검사하고, start_interval로 뜨는 동안만 촘촘히 보고, 헬스 요청은 접근 로그에서 거른다.
- 파이썬 서버가 빈 메모리를 돌려주게 하는 glibc 설정 세 가지 →MALLOC_ARENA_MAX로 arena 수를 줄이고, mmap·trim 기준을 고정하고, 큰 데이터를 내린 뒤와 주기적으로 malloc_trim을 부른다.
- 무중단 배포에서 새 NOT NULL 컬럼에는 DB 기본값(db_default)을 준다 →마이그레이션 뒤 아직 교체되지 않은 옛 코드는 새 컬럼을 모른다. 파이썬 default가 아니라 DB DEFAULT가 있어야 옛 코드의 INSERT가 깨지지 않는다.
- 저장·통신 형식을 바꿀 때는 읽기를 먼저 배포하고, 쓰기는 다음 배포에서 →옛 클라이언트와 새 서버, 새 클라이언트와 옛 데이터가 함께 도는 시간이 반드시 있다. 두 형식을 다 읽게 먼저 배포하고, 새 형식 쓰기는 다음 배포에서 켠다.
- 새 서버로 옮기면 컨테이너 안 DNS부터 확인한다 →호스트에서는 이름이 풀리는데 docker 빌드·컨테이너에서만 EAI_AGAIN이 나면 브리지 네트워크의 DNS 문제다.
- 도커 소켓을 공유하는 CI에서는 bind mount를 쓰지 않는다 →CI 컨테이너가 호스트 도커 소켓으로 compose를 돌리면 마운트 경로는 호스트 기준이고, 없는 경로는 빈 디렉터리로 생긴다.
- SPA는 새 버전을 스스로 감지해 새로고침을 권한다 →배포 뒤에도 열려 있는 탭은 새로고침 전까지 옛 번들로 돈다. 탭으로 돌아오거나 다시 연결될 때 index.html의 번들 이름을 비교해 새로고침 버튼을 보여 준다.
- compose command는 리스트로 쓰고, 실제 프로세스 인자로 확인한다 →YAML 접힘(>)에서 더 들여 쓴 줄은 줄바꿈이 남아, sh -c가 첫 줄만 실행하고 옵션이 조용히 빠진다.
- 운영 이미지 태그는 패치 버전까지 고정한다 →latest나 2-alpine 같은 움직이는 태그는 배포할 때마다 컨테이너를 예고 없이 다시 만들 수 있다.
- Next.js 공개 값은 빌드에 굽지 말고 실행 환경에서 넘긴다 →NEXT_PUBLIC_*은 번들에 문자열로 박혀 환경마다 이미지를 다시 굽게 만든다. 실행 env를 루트 레이아웃이 window로 넘기면 같은 이미지를 어디서나 쓴다. 빌드는 Turbopack으로.