Kramaru
11 개 트렌드 소스를 추적하고, 기회를 점수화하고, 기사를 생성·검토하여, 13 개 니치 사이트에 12 개 언어로 배포하는 멀티 테넌트 출판 플랫폼. Postgres, pg-boss 워커, Claude 연동, 자체 QA 파이프라인, 그리고 모든 큐의 라이브 tail 을 보여 주는 대시보드.
kramaru.esAPI, 통합, 자동화, 관측 가능한 시스템.
시뮬레이션 데이터도, 장난감 프로젝트도 없습니다.
당시 제 수준에 비해 너무 큰 시스템을 일찍부터 건드리기 시작했습니다. 주변 많은 사람이 입문용 CRUD 를 쓰는 동안, 저는 진짜 제품 뒤에서 실제로 무슨 일이 벌어지는지에 사로잡혀 있었습니다. 큐, 캐시, 동시성, 배포, 소켓, 인프라. 전환점은 백엔드를 더 이상 「API 를 만드는 일」로 보지 않고, 사람들이 정말로 쓰기 시작했을 때 무너지지 않는 시스템을 설계하는 일로 보기 시작한 그 날이었습니다. 그때부터 완전히 빠졌습니다.
제가 아는 것의 대부분은 무언가를 부수면서 얻어졌습니다. 서비스를 통째로 내려버린 배포, 잘못 구성된 프록시, 재현 불가능한 동시성 버그, 급하게 한 PostgreSQL 마이그레이션, 운영에서 말도 안 되는 리다이렉트를 뱉던 미들웨어. 바로 그 자리가 가장 많이 배운 곳입니다. 예쁜 인터페이스를 만드는 것보다 복잡한 시스템을 디버깅하고 진짜 병목을 추적하는 일이 훨씬 즐겁다는 걸 알게 됐습니다. 무언가가 왜 저수준에서 실패하는지 이해하고 우아하게 고치는 순간이 제가 책상 앞에서 플로에 가장 가까이 가는 때입니다.
시간이 지나며 제 프로젝트들은 진짜 아키텍처 작업으로 옮겨갔습니다. 자동화된 파이프라인, 실시간 SSE, 멀티 서비스 Docker 스택, nginx 리버스 프록시, 스크래핑·트렌드 시스템, 콘텐츠 자동화, 사내 도구. 「범용 앱」에는 큰 관심이 없었습니다. 저는 실제로 움직이는 제품을 위해 유용하고 빠르고 안정적인 인프라를 짓고 싶습니다.
이 목록은 제가 참고 쓰는 것이 아니라, 먼저 손이 가는 것들입니다. 발표 글이 아니라 운영에서 다년간 닳아본 결과로 선택했습니다.
소수의 진짜 시스템들. 모두 실제 사용자 기반을 위해 운영 중입니다. 절반쯤 만든 데모를 늘어놓은 포트폴리오가 아닙니다.
11 개 트렌드 소스를 추적하고, 기회를 점수화하고, 기사를 생성·검토하여, 13 개 니치 사이트에 12 개 언어로 배포하는 멀티 테넌트 출판 플랫폼. Postgres, pg-boss 워커, Claude 연동, 자체 QA 파이프라인, 그리고 모든 큐의 라이브 tail 을 보여 주는 대시보드.
kramaru.es스마트 익절, 시간 게이트, 서킷 브레이커를 갖춘 네 개의 polyvps 전략이 24/7 가동. 백테스트가 아니라 실제 자금. 일일 지표 대시보드, 킬 스위치, 진입마다의 감사 로그.
OpenFootball 위에 Sofascore 강화 데이터를 얹은 축구 픽 정산 엔진. 컨테이너별로 하드닝된 Docker 스택에 연결되어 있습니다. NGINX, Postfix, 과거 사건 이후 헤더 리플레이 공격을 막기 위해 Server Actions 암호화 키를 고정.
Flutter Desktop POS, Node 백엔드, MySQL, 감열 인쇄, WhatsApp 연동. 실제 고객, 오프라인 우선.
mkir.es 의 공개 데모: 하나의 .NET 8 프로세스가 Server-Sent Events 로 데이터베이스 변경 이벤트를 여러 브라우저에 팬아웃. 클라이언트 의존성 0, 일반 HTML 이 Postgres 트리거를 실시간으로 렌더링합니다.
mkir.es보통은 한 문장으로 요약하는 프로젝트의 풀 버전. 어려웠던 결정, 제가 망가뜨린 것, 그리고 진짜로 살아 있는 부분.
TopSec 은 거대 인프라나 제품에 비해 너무 무거운 스택에 기대지 않고도 데이터를 실시간으로 집계·동기화·시각화하기 위해 존재합니다. 요구는 말로는 단순하고 만드는 일은 어려웠습니다. 여러 서비스가 동시에 대화하는 동안에도 데이터를 살아 있게, 빠르게, 일관되게 유지하는 것.
.NET 8 백엔드에 살 것과 Next.js 쪽에서 풀 것 사이에 분명한 선을 긋는 일. 미묘한 한 사례가 그 선을 분명하게 만들었습니다. /api 라우트와 next-intl 미들웨어가 함께 작동하면서 /es/api/* 로 향하는 307 리다이렉트가 발생하고 있었던 것입니다. 기술적으로는 유효하지만 실제로는 망가진 상태. 특정 로케일에서 실시간·통계 엔드포인트가 조용히 죽고 있었습니다.
아무도 부탁하지 않는 패치가 엔지니어 요율을 정당화합니다. 리다이렉트 규칙을 하나하나 고치는 대신, 저는 미들웨어 매처를 다시 만들어 /api 를 완전히 배제했습니다. 시각적으로는 작은 변경, 아키텍처상으로는 큰 변경.
너무 일찍 최적화하는 것은 나쁘다. 처음부터 성능을 무시하는 것은 더 나쁘다. 작업 원칙
또 다른 결정은 PostgreSQL 을 단일 진실 원천으로 유지한 것입니다. 이 제품에서는 일관성과 복잡한 쿼리를 쓸 수 있는 능력이 NoSQL 로 짜낼 수 있는 어떤 속도 이득보다도 가치 있었습니다. 지루함이 옳은 답일 때 지루함은 좋습니다.
한 번은 Docker 이미지가 정말로 재빌드됐다고 가정했다가 운영이 내려간 적이 있습니다. 「새」 코드가 옛 코드처럼 계속 동작했어요. 진짜 범인은 npm ci 였습니다. package-lock 이 없어서 조용히 실패하면서 빌드를 불일치 상태로 남겨 둔 것이죠. 파이프라인 문제를, 애플리케이션 로직 디버깅으로 몇 시간씩 소진했습니다.
트위터가 아니라 운영 사고로 얻은 강한 입장. 어느 하나에 긴장한다면, 우리는 잘 맞을 가능성이 큽니다.
「아니오」를 말할 줄 알아야 「예」가 신뢰할 만해집니다. 제가 적임자가 아닐 프로젝트들.
2022 년부터 프리랜스·컨트랙트 활동 중. 리모트 우선 역할, 또는 프로젝트가 가치 있을 때 말라가와 코스타 델 솔에서의 하이브리드에 열려 있습니다. 엔지니어링이 프로세스 아래로 사라지는 깊은 기업 환경에는 관심이 없습니다.
이메일이 가장 빠른 답을 받습니다. 따뜻한 소개는 LinkedIn, 코드는 GitHub.