전체 글 26

클로드코드 컨텍스트 다이어트

TL;DR: 하위 디렉토리에서 claude를 실행해도 초기 컨텍스트는 거의 그대로다. 컨텍스트를 실제로 줄이는 방법은 "항상 로드되는 곳"(루트 CLAUDE.md)에서 "필요할 때만 로드되는 곳"(앱별 문서, 하위 CLAUDE.md)으로 내용을 옮기는 것이다.어디서 실행하느냐가 중요할 줄 알았다Django 모노레포에서 Claude Code를 쓰고 있다. apps/ 아래에 기능 앱이 열 개 넘게 있는 구조다. 특정 앱에 대해 질문할 일이 많다 보니 이런 생각이 들었다."터미널에서 그 앱 폴더로 cd하고 실행하면, 그 앱 관련 컨텍스트만 로드돼서 토큰이 줄어들지 않을까?"# 이렇게 하면 blog 앱 컨텍스트만 잡히지 않을까?cd apps/blogclaude결론부터 말하면 안 줄어든다. 공식 문서의 로딩 규칙..

PYTHON/AI 2026.08.26

쓰레드 경쟁 트러블슈팅 — 워커 전멸, Exit 137, 그리고 무한 504

쓰레드 경쟁 트러블슈팅 3연전 — 워커 전멸, Exit 137, 그리고 무한 504TL;DR: 같은 주에 세 번, 서로 다른 얼굴의 장애를 겪었다. 워커 타임아웃, 컨테이너 OOM, 무한 504. 겉모습은 전부 달랐지만 뿌리는 하나, 상한 없는 쓰레드 경쟁이었다. 경쟁의 대상이 워커 슬롯이냐, GIL과 메모리냐, fork로 죽은 이벤트 루프냐에 따라 증상과 처방이 완전히 달라진다는 걸 몸으로 배웠다.배경: 이 시스템은 왜 쓰레드에 민감한가우리 팀은 광고 데이터 플랫폼 백엔드를 Django + gunicorn으로 운영한다. 광고 성과 metric은 S3에 쌓인 parquet 파일을 요청 시점에 읽어서 집계한다. s3fs/fsspec으로 파일을 열고, DataFrame으로 계산하는 구조다.빠르게 만들려고 병..

PYTHON/Django 2026.07.13

법령·판례 RAG 직접 구축하기 — 인용을 강제해 할루시네이션 잡기

"이 사건에 적용되는 의료법 조문이 뭐야?"라고 LLM에 물으면, 없는 조문 번호를 그럴듯하게 지어냅니다. 일반 잡담이면 웃고 넘기지만 의료·법률에서는 근거 없는 한 줄이 사고로 이어집니다.그래서 한국 법령과 판례를 임베딩해 pgvector로 검색하고, 답변의 모든 문장에 출처(citation)를 강제로 부착하는 RAG 파이프라인을 직접 만들었습니다. 이 글은 그 전체 구축기입니다. 스키마 설계부터 청킹, 하이브리드 검색, 인용 강제 가드레일까지 실제 코드로 정리합니다.TL;DR• 청킹 단위를 "법령=조(條) / 판례=섹션"으로 잡으면 검색 결과가 곧 인용 단위가 된다• 조문 번호·법률 용어는 순수 벡터가 자주 놓친다 → 벡터 + 한국어 FTS를 RRF로 융합(하이브리드)• 모든 청크에 exact cit..

PYTHON/AI 2026.07.05

Django + Redis 캐시 전략

Django + Redis 캐시 전략 — delete_pattern에서 버전 카운터까지TL;DR: 캐시 무효화를 cache.keys(pattern) + delete_many로 하고 있다면, 버전 카운터 방식으로 바꿔라. O(n) 메모리 폭발이 O(1) 원자적 연산 한 줄로 줄어든다.delete_pattern이 문제가 되기 시작한 날Django + Redis 조합으로 API 캐시를 운영하다 보면, 처음엔 이런 식으로 시작한다.from django.core.cache import cache# 조회: 캐시 있으면 바로 응답cache_key = f"{request.user.pk}_{request.get_full_path()}"if data := cache.get(cache_key): return Respo..

PYTHON/Django 2026.05.29

아키텍처 테스트로 Django 프로젝트의 규칙을 코드로 강제하기

아키텍처 테스트로 Django 프로젝트의 규칙을 코드로 강제하기TL;DR: 문서에 적어둔 아키텍처 규칙은 시간이 지나면 무시된다. Python의 ast 모듈로 소스 코드를 정적 분석하는 테스트를 작성하면, CI가 규칙 위반을 자동으로 잡아주고 수정 방법까지 안내해준다.문서에 적힌 규칙은 아무도 안 지킨다팀에서 Django 프로젝트를 운영하다 보면 이런 규칙들이 생긴다."모든 모델은 SoftDeleteModel을 상속해야 한다""print() 쓰지 말고 logging을 써라""ViewSet에는 반드시 MappingMixin을 붙여라"처음엔 다들 잘 지킨다. 위키에도 적어두고, 온보딩 문서에도 넣는다. 그런데 3개월 지나면? 신규 팀원이 모르고 빼먹고, 급한 핫픽스에서 슬쩍 빠지고, 리뷰어도 놓치고 머지된다..

PYTHON/Django 2026.05.26

Claude Code + 커스텀 스킬로 Django 개발 워크플로우를 자동화한 경험

Claude Code Django DRF 자동화 커스텀 스킬 개발 생산성Django + DRF 기반 광고 데이터 플랫폼을 개발하면서, 반복되는 개발 작업을 Claude Code의 커스텀 스킬 시스템으로 자동화했다. 모델 추가, 엔드포인트 생성, 테스트 작성, 린트, 배포까지 — 한 줄 명령으로 프로젝트 컨벤션에 맞는 코드를 생성하고, 문서까지 동기화하는 시스템을 만들었다.이 글에서는 실제로 구축한 15개 스킬의 설계 의도, 구조, 그리고 운영하면서 겪은 시행착오를 공유한다.1. 왜 커스텀 스킬인가AI 코딩 어시스턴트에게 "Django 모델 만들어줘"라고 하면 결과가 매번 다르다. 우리 프로젝트에서는 SoftDeleteModel + TimeStampedModel을 상속해야 하고, TextChoic..

PYTHON/AI 2026.05.06

데이터 수집 파이프라인 직접 구축하기

들어가며"5분마다 수십 개 사이트를 확인하고, 결과를 DB에 쌓고, 실패하면 알아서 재시도해줘."이런 요구사항을 받았을 때 가장 먼저 떠오르는 건 cron + requests 조합이다. 하지만 사이트가 수백 개로 늘어나고, 브라우저 렌더링이 필요한 페이지가 섞이고, 장애 시 재시도 정책까지 요구되면 이야기가 달라진다.이 글에서는 RabbitMQ 기반의 비동기 분산 태스크 처리 시스템을 설계하고 운영하면서 겪은 아키텍처 의사결정을 공유한다.시스템 전체 구조시스템은 크게 세 가지 프로세스로 나뉜다.프로세스역할실행 단위SchedulerDB에서 실행 대상 Job을 폴링하여 RabbitMQ에 발행단일 인스턴스Worker큐에서 메시지를 소비하고, 태스크를 실행하여 결과를 DB에 저장수평 확장 가능RabbitMQSc..

PYTHON/Base 2026.04.30

RAG 직접 구축하기 — 사내 문서 검색 챗봇

들어가며ChatGPT에게 우리 회사 내부 규정을 물어보면 당연히 모릅니다. 학습 데이터에 없으니까요.그렇다면 "우리 회사 문서에서 답을 찾아주는 AI"는 어떻게 만들까요?정답은 RAG(Retrieval-Augmented Generation)입니다."LLM을 다시 학습시키지 않고, 검색된 문서를 컨텍스트로 넘겨서 답변하게 하는 기법"오늘은 Python + ChromaDB + Claude API로 사내 문서 Q&A 챗봇을 처음부터 끝까지 직접 만들어 보겠습니다.전체 코드 100줄 남짓이면 동작하는 RAG 시스템이 완성됩니다.RAG란?기존 LLM의 한계문제설명지식 단절학습 이후의 정보를 모름 (knowledge cutoff)내부 데이터 부재사내 문서, 사규, 위키 등을 학습하지 않음할루시네이션모르는 걸 그럴듯..

카테고리 없음 2026.04.24

서버/인프라 비용 절감 가이드

들어가며서비스가 성장하면 자연스럽게 서버 비용도 함께 올라갑니다.하지만 "트래픽이 늘었으니 어쩔 수 없지"라고 넘기기엔, 같은 트래픽을 절반의 비용으로 처리할 수 있는 방법이 생각보다 많습니다.이 글에서는 실제로 적용 가능한 서버/인프라 비용 절감 방법 10가지를 난이도별로 정리했습니다.AWS 기준으로 설명하지만, GCP/Azure에도 대부분 동일한 개념이 존재합니다.한눈에 보는 비용 절감 맵난이도방법예상 절감률적용 시간🟢 쉬움인스턴스 라이트사이징20~40%1시간🟢 쉬움Reserved / Savings Plans30~60%30분🟢 쉬움스토리지 수명주기 정책40~70% (스토리지)1시간🟡 보통CDN + 캐시 레이어30~50% (트래픽)반나절🟡 보통Auto Scaling20~40%반나절🟡 보통Sp..

SERVER/Infra 2026.04.23

GIL 우회 실험 — multiprocessing vs threading vs asyncio

들어가며파이썬으로 개발하다 보면 한 번쯤 이런 경험을 합니다."쓰레드를 늘렸는데… 왜 더 안 빨라지지?"그 범인은 바로 GIL(Global Interpreter Lock)입니다.오늘은 threading, multiprocessing, asyncio 세 가지 동시성 모델을 실제 벤치마크로 비교하며,언제 어떤 방식을 써야 하는지 실험으로 확인해 보겠습니다.GIL이란?GIL(Global Interpreter Lock)은 CPython 인터프리터가 한 번에 하나의 쓰레드만 파이썬 바이트코드를 실행하도록 강제하는 뮤텍스(mutex)입니다.왜 존재할까요? CPython의 메모리 관리(레퍼런스 카운팅)가 thread-safe하지 않기 때문입니다. GIL이 없으면 여러 쓰레드가 동시에 객체의 참조 카운트를 변경하면서 ..

PYTHON/Base 2026.04.22