사이드 프로젝트 DB 세 번 이사기: CouchDB에서 Supabase, 그리고 OCI PostgreSQL까지
·
Programming
DB를 세 번 옮겼습니다. 셋 다 계획이 아니었습니다첫 번째 DB를 고를 때 ADR(Architecture Decision Record)까지 써 가며 신중하게 결정했습니다. 그 DB는 두 달을 살았습니다. 두 번째 DB는 일주일을 살았습니다. 세 번째 DB로 옮기는 설계 문서를 쓰기 시작한 게, 두 번째 DB로 이사를 마친 바로 다음 날이었습니다.이 글은 커피 사이드 프로젝트 하나가 CouchDB → Supabase → 자체 운영 PostgreSQL(Oracle Cloud)로 데이터를 두 번 통째로 옮긴 기록입니다. 각 이사는 그 시점에는 전혀 예정에 없었고, 매번 "이 선택이 틀려서"가 아니라 "요구사항이 바뀌어서" 일어났습니다. 사이드 프로젝트를 무료로 실배포하고 싶은 분이라면, 제가 세 정거장에서 ..
텔레그램 버튼으로 승인하는 반자동 매매: AI와 사람의 결재선 만들기
·
Programming/Python
안전장치를 다 쌓고 나니 남은 질문: 버튼은 누가 누르는가12편에서 실주문 경로에 게이트를 잔뜩 쌓았습니다. 이중 게이트, 승인 해시, 멱등키, 단일 전송, 증거 기반 장부. 주문 하나가 나가려면 일곱 개쯤 되는 검문소를 통과해야 합니다.그런데 그 검문소들을 다 만들고 나서도 마지막 질문 하나가 해결되지 않은 채 남아 있었습니다. 그래서 dry_run=False, confirm=True는 결국 누가 넣는가.선택지는 둘로 보였습니다. 하나는 에이전트에게 전권을 주는 것. 판단이 서면 실주문까지 알아서 내보내는 전자동입니다. 12편을 쓴 사람으로서 이건 못 믿습니다. 안전장치는 사고의 피해를 줄여주지, 사고 자체를 없애주지 않으니까요.다른 하나는 제가 세션에 붙어 앉아 에이전트의 제안을 보고 직접 도구를 호..
AI 에이전트와 5개월, 커밋 1,774개: 1인 개발자의 워크플로우가 어떻게 바뀌었나
·
Programming/Python
블로그를 쉬는 동안 무슨 일이 있었나마지막 글을 올리고 블로그를 쉰 게 2026년 2월 초입니다.그로부터 다섯 달 동안 이 저장소에는 커밋 1,774개가 쌓였습니다. 이슈로 세면 455개, 머지된 PR로 세면 1,000개가 넘습니다. 글을 쓰기 전에 실제로 세어 봤습니다.$ git log --since=2026-02-04 --oneline | wc -l1774$ git log --since=2026-02-04 --oneline | grep -oE '[A-Z]+-[0-9]+' | sort -u | wc -l455달마다 나눠 보면 2월 196개, 3월 279개, 4월 230개, 5월 590개, 6월 336개입니다. 주말을 포함해 하루 평균 11커밋이 넘고, 가장 바빴던 5월에는 하루 19커밋꼴입니다.커밋 타..
토스증권 Open API로 실주문 연동하기: 문서에 없는 함정들
·
Programming/Python
두 번째 실주문 브로커토스증권이 Open API를 열었습니다. openapi.tossinvest.com으로 REST 요청을 보내면 시세 조회부터 실계좌 주문까지 됩니다. 국내 증권사 중 이런 걸 열어주는 곳이 몇 없어서, 공개 소식을 보자마자 바로 신청했습니다.공식 문서는 깔끔했습니다. OAuth2로 토큰을 받고, /api/v1/orders에 POST를 보내면 주문이 나간다. 엔드포인트 명세, 파라미터, 에러 코드까지 잘 정리되어 있었습니다. 9편부터 한국투자증권(KIS) API로 실주문을 운영해 왔으니, "두 번째 브로커니까 금방 붙이겠지"라고 생각했습니다.그리고 실주문을 붙이는 과정에서 만난 함정들은 대부분 문서에 없었습니다. 새 토큰을 받으면 기존 토큰이 조용히 죽는다든가, 계좌 설정 하나 때문에 ..
pytest-xdist CI가 이유 없이 멈추던 날: PostgreSQL 데드락 추적기
·
Programming/Python
CI가 실패하는 게 아니라, 멈춘다어느 날부터 CI가 이상해졌습니다. 테스트가 실패하는 게 아니라 멈췄습니다. 로그는 어느 순간 더 이상 올라오지 않고, 20분쯤 지나면 GitHub Actions가 잡을 강제 종료합니다. 실패한 테스트 이름이라도 찍히면 고칠 텐데, 마지막 줄은 그냥 평범하게 통과한 테스트였습니다.우리 CI는 pytest-xdist로 테스트를 병렬 실행합니다. 4개 그룹으로 샤딩하고, 각 그룹 안에서 다시 워커를 병렬로 돌립니다:# .github/workflows/test.ymluv run pytest tests/ -m "not live" \ --splits 4 --group ${{ matrix.group }} \ -n auto --dist=loadfile \ -o faulthand..
AI에게 주문 버튼을 줘도 될까: 실계좌 자동매매의 안전장치 설계
·
Programming/Python
주문 코드에서 가장 위험한 줄은 재시도 로직이었다지난 11편에서 AI 에이전트에게 place_order 도구를 줬습니다. dry_run=True가 기본값이니까, 에이전트가 명시적으로 False를 넣지 않는 한 실제 주문은 나가지 않습니다. 이 정도면 충분하다고 생각했습니다.실계좌 운용을 시작하고 나서야 알았습니다. 주문 경로의 적은 에이전트가 아니었습니다. 네트워크였고, 브로커 API의 애매한 응답이었고, 무엇보다 "실패하면 다시 시도한다"는 상식을 코드에 그대로 옮겨 적은 저 자신이었습니다.에이전트가 이상한 주문을 내는 시나리오는 상상하기 쉽습니다. 그래서 다들 거기에 대비합니다. 그런데 실제로 저를 위협한 건 전혀 다른 곳이었습니다. 멀쩡한 주문 하나가 두 번 나가는 경로, 성공 응답을 받고 장부에 ..
MCP 서버로 AI 트레이딩 도구 만들기: Claude가 직접 주식을 분석한다
·
Programming/Python
콜백 파이프라인을 만들고, 한 달 만에 방향을 뒤집었다지난 Infra-5편에서 OpenClaw 콜백으로 LLM 분석을 오프로딩하는 구조를 만들었습니다. auto_trader가 분석 요청을 보내면, 외부 에이전트가 분석해서 콜백으로 결과를 돌려주는 방식이었죠. 글 말미에 "다음 단계: HMAC 서명, 재시도 로직, 배치 분석"까지 적어뒀습니다.그 다음 단계는 하나도 진행하지 않았습니다.콜백 구조를 운영해 보니 근본적인 어색함이 있었습니다. 제가 프롬프트를 조립해서 LLM에게 보내면, LLM은 제가 담아준 데이터만 볼 수 있습니다. "외국인 수급도 봐야 하는데"라는 판단은 결국 프롬프트를 조립하는 제 코드가 미리 해야 합니다. 분석의 주도권이 여전히 파이썬 코드에 있는 겁니다.그러다 MCP(Model Con..
OpenClaw + FastAPI 콜백으로 비동기 LLM 파이프라인 만들기
·
Programming/Python
Raspberry Pi에서 GPT 분석, 웹훅/콜백으로 결과 적재이 글은 개발 인프라 개선 시리즈의 Infra-5편이다.개발 인프라 개선 시리즈:Infra-1편: Poetry에서 UV로 마이그레이션Infra-2편: Python 3.13 업그레이드Infra-3편: Python 3.14 업그레이드Infra-4편: Ruff + Pyright 마이그레이션Infra-5편: OpenClaw 통합 ← 현재 글AI 자동매매 시리즈:1편: 한투 API로 실시간 주식 데이터 수집하기2편: yfinance로 애플·테슬라 분석하기3편: Upbit으로 비트코인 24시간 분석하기4편: AI 분석 결과 DB에 저장하기5편: Upbit 웹 트레이딩 대시보드 구축하기6편: 실전 운영을 위한 모니터링 시스템 구축7편: 라즈베리파이 홈서..
Ruff + Pyright로 Python 코드 품질 도구 통합하기
·
Programming/Python
Black, isort, flake8, mypy에서 Ruff + Pyright로 통합이 글은 개발 인프라 개선 시리즈의 Infra-4편이다.개발 인프라 개선 시리즈:Infra-1편: Poetry에서 UV로 마이그레이션Infra-2편: Python 3.13 업그레이드Infra-3편: Python 3.14 업그레이드Infra-4편: Ruff + Pyright 마이그레이션 ← 현재 글AI 자동매매 시리즈:1편: 한투 API로 실시간 주식 데이터 수집하기2편: yfinance로 애플·테슬라 분석하기3편: Upbit으로 비트코인 24시간 분석하기4편: AI 분석 결과 DB에 저장하기5편: Upbit 웹 트레이딩 대시보드 구축하기6편: 실전 운영을 위한 모니터링 시스템 구축7편: 라즈베리파이 홈서버에 자동 HTTP..
프릳츠 디카페인 원두 V60 드립 레시피 | Kingrinder K6 + 하리오 V60-02
·
커피
카페인 없이도 맛있는 커피를 즐기고 싶을 때, 프릳츠의 디카페인 원두는 좋은 선택이다. "FULL TIME COFFEE LOVER"라는 문구가 적힌 파란색 패키지처럼, 하루 종일 커피를 마시고 싶은 사람들을 위한 원두다.이 글에서는 Kingrinder K6 그라인더와 하리오 V60-02 드리퍼로 프릳츠 디카페인을 맛있게 추출하는 레시피를 정리한다.디카페인 원두의 특성디카페인 원두는 일반 원두와 추출 특성이 다르다. 카페인 제거 과정에서 원두의 셀룰로스 구조가 변하면서 물이 더 빠르게 침투하고, 추출도 빨리 진행된다. 같은 세팅으로 내리면 과다추출되기 쉽다.이를 보정하려면 두 가지를 조정한다:물 온도를 낮추기 (92~94°C)분쇄도를 굵게 잡기기본 레시피목표: 깔끔하고 단맛 중심, 쓴맛 과다 방지항목세팅원..