디스코드 봇이 레이트리밋에 걸려 응답이 밀릴 때, 백오프와 큐로 잡는 법

디스코드 개발자 문서에는 봇 토큰 하나가 쓸 수 있는 전역 요청 한도가 초당 50회로 명시돼 있습니다. 이 숫자 자체는 크지 않아 보이지만, 슬래시 명령어 응답·역할 부여·메시지 전송이 한꺼번에 몰리는 순간에는 금방 채워집니다. 그 결과가 바로 디스코드 봇이 레이트리밋에 걸려 응답이 밀릴 때 나타나는 그 지연입니다. 이 글에서는 어떤 요청이 어떤 한도에 먼저 걸리는지 구분하고, 실제로 … Read more

서버 프로세스가 매일 재시작해야 한다면? 메모리 누수 원인 좁히는 순서

서버 프로세스가 매일 같은 시간대에 죽었다 살아나는 이유가 궁금해서 검색하셨다면, 답부터 말씀드립니다. 대부분은 애플리케이션 내부의 메모리 누수 때문이 아니라 OOM 킬러나 systemd 재시작 정책이 증상만 가리고 있는 경우가 많습니다. 원인을 좁히려면 “누수냐 아니냐”를 먼저 그래프로 확인하고, 그다음 트래픽 조건별로 재현 범위를 줄이고, 마지막에 런타임별 프로파일러로 지점을 찾는 순서가 효율적입니다. 이 글은 특정 프레임워크 광고가 아니라, … Read more

LLM 응답을 다국어로 캐시할 때 키 설계와 교차 오염 막기

캐시 키에서 언어 코드 하나를 빼먹으면 무슨 일이 벌어지는지 직접 코드로 재현해봤더니, 한국어 요청과 프랑스어 요청이 정확히 같은 해시값을 만들어냈습니다. 소스 문장이 같고 모델 파라미터가 같으면 대상 언어가 달라도 캐시 키가 동일해지는 구조였기 때문입니다. LLM 응답을 다국어로 캐시할 때 이 문제를 그냥 넘기면, 캐시 히트율은 멀쩡한데 사용자에게는 엉뚱한 언어의 답이 나가는 사고로 이어집니다. 이 글에서는 … Read more

FastAPI 업로드 API에서 경로 조작 취약점 막는 실전 검증법

파이썬 인터프리터에서 딱 한 줄만 실행해봐도 문제가 바로 드러납니다. os.path.join(“/var/app/uploads”, “../../../etc/cron.d/x”)을 넣고 os.path.normpath()로 정규화하면 결과는 /etc/cron.d/x가 됩니다. 업로드 디렉터리 안에 저장될 줄 알았던 파일이 시스템 크론 폴더로 튀어나가는 셈입니다. FastAPI 업로드 API에서 이런 경로 조작 취약점이 생기는 이유는 프레임워크가 파일명을 검증해주지 않기 때문이고, 이 글에서는 실제로 동작하는 코드로 막는 방법을 정리했습니다. FastAPI가 파일명을 검증해주지 않는 … Read more

파이썬에서 날짜 파싱이 로케일마다 다르게 되는 이유, dateutil 함정

“dateutil을 쓰면 시스템 로케일에 맞춰 날짜를 알아서 잘 읽어줄 것”이라고 생각하는 분들이 많은데, 이건 사실과 다릅니다. 실제로는 정반대에 가깝습니다. 파이썬에서 날짜 파싱이 로케일마다 다르게 동작하는 진짜 원인은 dateutil이 아니라 표준 라이브러리의 strptime과 locale.setlocale 조합에 있고, dateutil의 parser.parse는 애초에 운영체제 로케일을 아예 들여다보지 않습니다. 이 둘을 헷갈리면 개발 환경에서는 멀쩡하던 코드가 배포 서버에서만 조용히 다른 날짜를 … Read more

LLM 비동기 호출 결과, 순서대로 받는 큐 설계하기

결론부터 말씀드리면, LLM 비동기 호출을 여러 개 동시에 보낼 때 응답이 뒤섞이는 문제는 asyncio.gather만으로는 해결되지 않는 경우가 있고, 이럴 땐 순번을 매긴 뒤 재정렬 버퍼(reorder buffer)를 두는 큐를 직접 만들어야 합니다. 특히 응답을 모아서 한 번에 처리하는 게 아니라 도착하는 즉시 화면에 순서대로 뿌려야 하는 스트리밍 UI라면 더욱 그렇습니다. 이 글에서는 Python 3.11 기준 asyncio와 … Read more

워드프레스 자동 발행 글이 스팸 필터에 걸리는 이유와 점검법

이 글에서는 워드프레스 자동 발행 글이 어떤 조건에서 스팸으로 분류되는지, 그리고 발행 전에 이 패턴을 코드로 걸러내는 방법까지 확인할 수 있습니다. 핵심만 먼저 말씀드리면, 워드프레스 자체에 글을 막는 스팸 필터가 있는 경우는 드물고, 대부분은 구글이 색인 단계에서 돌리는 스팸 판별 시스템이 반복되는 템플릿 구조를 잡아내는 상황입니다. 제목 패턴, 문단 길이, 키워드 배치가 글마다 똑같이 반복되면 … Read more

서버 디스크가 로그로 가득 찰 때, logrotate 실전 설정

결론부터 말씀드리면, 서버 디스크가 로그로 가득 차는 문제는 대부분 로테이션 설정이 아예 없거나 잘못돼서 생깁니다. logrotate로 오래된 로그를 주기적으로 압축·삭제하도록 설정만 제대로 해두면 대부분 해결되고, 이미 꽉 찬 경우에도 원인 파일을 찾아 강제로 로테이션을 돌리면 당장의 급한 불은 끌 수 있습니다. 이 글에서는 /etc/logrotate.d에 실제로 넣을 수 있는 설정 예시와, 설정을 바꿔도 디스크 용량이 안 … Read more

LLM 응답에 링크를 인용하라고 했더니 죽은 URL만 나올 때 — 검증 후처리 파이프라인

LLM 응답에 링크를 인용하라고 요청하면 겉보기엔 그럴듯한 주소가 나오지만, 검증 스크립트에 그 URL 10개를 넣고 돌려보면 절반 가까이가 404나 연결 실패로 떨어지는 경우가 흔합니다. GPT 계열이든 Claude 계열이든 실시간 브라우징 기능 없이 순수 생성만 하는 모드에서는, URL도 결국 다음 글자를 예측해서 만든 문자열이기 때문입니다. 이 글에서는 그렇게 만들어진 죽은 링크를 사람이 일일이 클릭해보지 않고 걸러내는 … Read more

파이썬 dataclass와 pydantic, 실무에서는 이렇게 나눠 쓰세요

파이썬 dataclass와 pydantic 중 무엇을 쓸지는 “이 데이터가 외부에서 들어오는가”로 갈립니다. 내 코드 안에서만 도는 값을 담는 그릇이라면 dataclass로 충분하고, API 요청이나 설정 파일처럼 신뢰할 수 없는 입력을 받는다면 pydantic이 훨씬 안전합니다. 두 라이브러리는 클래스 정의 문법이 비슷해서 자주 헷갈리지만, 실제로 하는 일은 상당히 다릅니다. dataclass와 pydantic, 겉모습은 닮았지만 하는 일이 다릅니다 dataclass는 파이썬 3.7부터 … Read more