728x90
반응형

2025/11 3

💧Django 메모리 리크: QuerySet이 메모리를 잡아먹는 이유

🔥 실제 상황: 점점 느려지는 서버새벽 3시, 긴급 전화가 울렸습니다. "서버가 점점 느려지다가 결국 다운됐어요!"클라이언트의 전자상거래 사이트는 하루 10만 건의 주문을 처리하는 중견 규모였습니다. 배치 작업으로 매일 밤 주문 데이터를 집계하는 스크립트가 돌아가는데, 처음에는 5분이면 끝나던 작업이 점점 느려지더니 결국 서버 메모리가 가득 차서 멈춰버린 것이었습니다.서버 모니터링을 확인해보니 메모리 사용량이 계단식으로 증가하다가 16GB RAM을 모두 소진한 상태였습니다. 재시작하면 다시 정상 작동하지만, 시간이 지나면 또 같은 현상이 반복됐습니다.🤔 QuerySet 메모리 리크란?Django의 QuerySet은 매우 편리하지만, 제대로 이해하지 못하면 메모리를 지속적으로 잡아먹는 "조용한 살인자"..

🔄 Django Signal 무한 루프: post_save 시그널에서 같은 모델을 다시 저장할 때의 함정

실제 사례: 갑자기 느려진 서버어느 날 출근하니 서버 모니터링 알람이 울리고 있었습니다. CPU 사용률이 100%를 찍고, 데이터베이스 연결이 모두 소진되었습니다. 문제의 원인을 추적해보니 전날 배포한 "사용자 프로필 자동 업데이트" 기능이었습니다.개발자는 단순히 사용자가 로그인할 때마다 last_login 시간을 기록하고, 동시에 login_count를 1씩 증가시키려고 post_save 시그널을 사용했습니다. 그런데 이 코드가 서버를 다운시킨 원인이었습니다.문제 상황: Signal 안에서 save()를 호출하면?Django Signal은 특정 이벤트가 발생했을 때 자동으로 실행되는 콜백 함수입니다. 그중 post_save 시그널은 모델 인스턴스가 저장된 직후에 실행됩니다.문제는 이 시그널 핸들러 안에..

편안한 자동인간이 되지 않기로 했다

수능날 아침 클로드와의 대화를 통해 발견한 나의 신앙에 대하여지하철에서 마주치는 사람들이 좀비 같다는 생각이 들 때가 있어. 생각이 없달까... 지하철 문이 열리니까 타고, 가야 할 길이 저기 있으니까 구조물도 통과해서 가고, 주변에 사람이 있든 없든 폰 보면서 느릿느릿 걷는 사람들. 그런 사람들의 삶은 어떨까? 하는 생각을 해봤어.Claude: 재밌는 관찰인데, 그 질문이 정말 섬뜩한 게, 우리가 "저 사람들"이라고 할 때 이미 자신은 빼놓고 있다는 거야.혹시 누군가 너를 지하철에서 봤다면, 똑같이 생각했을 수도 있지 않을까?두 가지 가능성이 있는 것 같아. 하나는 정말로 "생각 없이" 사는 삶. 출근-퇴근-폰-잠-출근의 루프. 시스템이 요구하는 대로 움직이는 자동인간. 다른 하나는 그게 일종의 생존 ..

728x90
반응형