새벽 3시의 해열제 계산기: 10분의 불안을 10초의 안심으로

Project Overview
- 프로젝트: 소아 해열제 용량 계산기 (Web App)
- 역할: 기획, 디자인, 개발, 배포 (1인 개발)
- 기간: 2025.11 (약 5주)
- 성과: 계산 시간 10분 → 10초 단축, 13회 업데이트, 오픈소스 공개
- 핵심 기술: Next.js 15, TypeScript, Zod, Tailwind CSS
새벽 3시, 의사 아빠도 당황했다
새벽 3시. 아이가 불덩이 같다. 비몽사몽한 정신으로 약병을 집어 들지만, 깨알 같은 글씨는 눈에 들어오지 않는다.
"15kg이면 몇 mL지? 저번엔 5mL였나? 아니, 그건 부루펜이었나?"
인터넷을 검색하면 광고성 블로그와 맘카페의 '카더라' 정보뿐. 아이의 울음소리는 커져가고, 1분 1초가 영원처럼 느껴진다.
"지금 당장 몇 mL를 먹이면 되는가?"
응급실에서 8년간 수많은 열나는 아이들을 봐왔지만, 정작 내 아이의 열 앞에선 나 또한 당황한 아빠일 뿐이었다. 이 단순한 질문에 답하기 위해 걸리는 10분. 그 시간 동안 부모의 마음은 타들어간다.
나는 이 10분을 10초로 줄이고 싶었다.
해결책: KidsFever.xyz
이것은 단순한 계산기가 아니다. 의사 아빠가 만든, 부모의 불안을 덜어주는 안전 장치다.
3가지 핵심 원칙
- Zero Friction: 설치 X, 로그인 X, 광고 X. 링크 하나면 끝.
- Safety First: 의료 데이터는 절대 틀려선 안 된다. (가장 중요한 원칙)
- Clarity: 답이 가장 먼저 보여야 한다.
주요 기능
- 즉각적인 계산: 체중과 나이만 입력하면 타이레놀, 부루펜, 맥시부펜 용량이 한눈에.
- 똑똑한 안전장치:
- 4개월 미만 영아는 "병원 방문 필요" 안내 (자동 차단)
- 하루 최대 허용량 초과 시 자동 조절
- 교차 복용 가능 여부 안내
- 글로벌 대응: 한국어/영어 지원 및 국가별 판매 약품 필터링 (미국에선 맥시부펜 숨김)
기술적 도전: 안전을 코드로 구현하다
"간단한 앱이네"라고 생각할 수 있다. 하지만 의료 소프트웨어에서 '간단함'은 치열한 고민의 결과다.
Tech Stack
- Framework: Next.js 15 (App Router) - 빠른 초기 로딩과 SEO를 위해
- Language: TypeScript - 의료 데이터의 타입 안전성 보장
- Validation: Zod (안전의 핵심)
- Styling: Tailwind CSS + Shadcn/ui
- Testing: Vitest
Zod: 빌드 타임에 버그를 잡다
의료 앱에서 버그는 곧 아이의 위험이다. 나는 Zod를 사용해 데이터의 무결성을 강박적으로 검증했다.
안전 파이프라인
graph LR
A[사용자 입력] --> B{Zod 스키마 검증}
B -- 유효하지 않음 --> C[차단 & 에러 표시]
B -- 유효함 --> D{비즈니스 로직 체크}
D -- 위험 (과다복용 등) --> E[자동 조절 / 경고]
D -- 안전 --> F[계산 결과 표시]
왜 Zod인가?
수많은 if문으로 도배하는 대신, 선언적인 스키마를 정의했다.
// 예시: 약물 농도 데이터 검증
const DrugSchema = z.object({
name: z.string(),
concentration: z.number().positive(),
// 안전 규칙: 아세트아미노펜 농도가 20mg/mL일 수 없다 (그건 이부프로펜 농도다)
ingredient: z.string().refine((val) => {
if (val === 'Acetaminophen' && concentration === 20) return false;
return true;
}, "아세트아미노펜 농도 오류"),
});
내가 실수로 데이터를 잘못 입력하면? 앱이 빌드조차 되지 않는다. 오류가 사용자에게 도달할 확률을 원천 봉쇄하는 것. 이것이 내가 생각하는 엔지니어링 안전이다.
"바이브 코딩" (Vibe Coding): 비전공자 의사의 도전
나는 컴퓨터 공학을 전공하지 않았다. 8년차 의사다. 코딩을 배운 지 얼마 되지 않았지만, AI(Claude)와 함께라면 도메인 지식을 코드로 번역할 수 있었다.
- 나 (의사): "해열제는 체중당 10-15mg이야. 하지만 하루 500mg을 넘기면 간 독성이 있어."
- AI (개발 파트너): 이 의학적 로직을 완벽한 TypeScript 함수로 구현.
문법 에러와 씨름하는 대신, **"어떤 가치를 줄 것인가"**에 집중할 수 있었다. 이것이 바로 바이브 코딩의 힘이다. 커리어 전환을 고민하거나, 비전공자라서 망설이는 분들에게 말하고 싶다. 중요한 건 '코딩 실력'이 아니라 '해결하고 싶은 문제'다.
배운 점들
1. UX가 곧 안전이다
응급 상황에서 복잡한 UI는 흉기다. 버튼 하나, 글자 크기 하나가 부모의 실수를 유발할 수 있다. 극단적인 단순함이 최고의 안전 기능이다.
2. 로컬라이제이션은 번역이 아니다
미국엔 '맥시부펜'이 없다. 덱시부프로펜 성분이 FDA 승인을 못 받았기 때문이다. 단순 번역을 넘어, 해당 국가의 의료 환경과 규제까지 코드에 녹여야 했다.
3. 완벽을 기다리지 마라
첫 버전은 초라했다. 하지만 13번의 업데이트를 거치며 점점 단단해졌다. 완벽한 앱을 1년 뒤에 내놓는 것보다, 부족해도 지금 당장 누군가의 10분을 아껴주는 것이 낫다.
마치며
이 프로젝트는 오픈소스로 공개되어 있다. 개발자라면, 혹은 코딩하는 부모라면 언제든 기여를 환영한다.
새벽 3시, 아이의 열 때문에 깬 모든 부모님들에게 이 작은 도구가 위로가 되길 바란다.
P.S. 즐겨찾기 해두세요. 쓸 일이 없으면 가장 좋겠지만, 막상 닥치면 이것만큼 든든한 게 없을 겁니다.