왜 만들었나요?
통증의학과 원장으로 3년째 병원을 운영하고 있습니다. 직원 10명짜리 의원인데도 매달 반복되는 일이 있었습니다.
- 연차 몇 개 남았는지 엑셀 뒤지기
- 소모품 뭐가 떨어졌는지 창고 가서 확인하기
- 의료장비 법정검사일 까먹어서 허둥대기
이걸 해결하는 솔루션이 없는 건 아닌데, 대형 병원용이라 비싸고 복잡하고 의원급엔 맞지 않았습니다.
그래서 직접 만들기로 했습니다. 코딩 경험은 중학교 정보올림피아드가 마지막.
뭘로 만들었나요?
코드를 직접 짜지 않았습니다. Claude Code가 설계·구현·테스트·디버깅 전 과정을 수행했습니다.
- Claude Code (Feat. Antigravity, Cursor) — 코드 작성
- 나 — 방향 설정, 비즈니스 규칙 정의, 결과 검증, 피드백
내가 한 건 "원장으로서 병원이 이렇게 돌아가야 한다"고 말하는 것. AI가 그걸 코드로 번역했습니다.
기술 스택
- 프론트엔드 — React 19 + TypeScript + Vite, Tailwind CSS, TanStack React Query
- 백엔드 — NestJS 11 + TypeORM + PostgreSQL (Supabase)
- 인증 — JWT + Passport, PIN 로그인 (모바일)
- AI — OpenAI API (납품서 OCR + 별칭 자동 학습)
규모
- 백엔드 모듈 18개, DB 테이블 52개, 권한 키 14개
- 프론트엔드 페이지 11개 + 모바일 전용 5개
- 단위 테스트 16개 파일
주요 기능
인사관리
조직도 3계층 트리, 직원 생애주기(입사→재직→휴직→퇴직→복직), 연차 자동 계산, 스냅샷 복원.
연장근무
분 단위 자체 기록 + 전 직원 공개(상호 감시), 2단계 마감.
인센티브
직원별 항목·단가 규칙 설정, 건수 입력 시 자동 금액 계산.
시설관리
의료장비 법정검사 자동 추적(의료법 제37조), 계약 3종 관리, 신호등 D-day 대시보드, 자동 알림.
재고관리
Par Level 자동 발주 제안, AI OCR 입고, 재고 실사, 소원수리함(직원 요청→투표→승인).
모바일
PIN 로그인 후 입고/실사/소원수리함 간소화 화면.
설계 포인트
- 멀티테넌트 완전 격리 — 모든 DB 쿼리에 tenant_id 필터 강제. A병원이 B병원 데이터를 절대 볼 수 없는 구조
- Key/Scope 권한 시스템 — "이 사람은 휴가 승인 권한이 있되, 간호팀만" 같은 세밀한 제어
- JWT 즉시 무효화 — 권한 변경 시 기존 토큰 강제 만료
- OCR + 별칭 학습 — 납품서 사진 찍으면 AI가 품목 인식, 거래처별 상품명 자동 학습
- 크론잡 멱등성 — 배치 작업이 중복 실행돼도 안전하게 설계
핵심
매일 아침 출근해서 엑셀 열고, 카톡으로 연차 확인하고, 창고 가서 재고 세던 일들. 그걸 시스템으로 만들었습니다.
개발자가 아닌 원장이, 자기 병원의 문제를 AI만으로 풀스택 SaaS로 만든 것. 그게 이 프로젝트의 의미입니다.