삼신 (RHABO)
Flutter · NestJS · PostgreSQL · Next.js · AWS
집에서 채혈해 난소 나이(AMH)를 확인하는 자가검사키트를 만드는 헬스케어 스타트업입니다. 2025년 2월부터 회사의 유일한 개발자로 앱·웹·서버·운영 도구를 맡았습니다.
rhabo.care · App Store · Google Play
- 분기 결제 주문
- 1,200건+합류 분기 20건 · 최고 2025 Q4
- 분기 키트
- 1,700건+합류 분기 280건 · 최고 2026 Q2
- 회원
- 1만+합류 후 10배 이상
- 누적 매출
- 2.7억 원
삼신 (RHABO) ·
Flutter · Swift · Kotlin
검사 항목별 결과 구조
난소 나이 검사 리포트
AMH 수치만 알려 주는 병원 검사지와 달리, 사용자가 내 상태를 이해하고 문진에 답하며 상호작용하는 검사 결과를 만들었습니다. 그 사이 비타민 D·여성호르몬 옵션 검사로 상품이 늘면서, 검사 항목이 추가돼도 그대로 확장되는 데이터 모델이 필요했습니다. 지금까지 리포트 약 7,000건이 발급됐습니다.
검사 항목별 결과 구조
난소 나이 검사 리포트
AMH 수치만 알려 주는 병원 검사지와 달리, 사용자가 내 상태를 이해하고 문진에 답하며 상호작용하는 검사 결과를 만들었습니다. 그 사이 비타민 D·여성호르몬 옵션 검사로 상품이 늘면서, 검사 항목이 추가돼도 그대로 확장되는 데이터 모델이 필요했습니다. 지금까지 리포트 약 7,000건이 발급됐습니다.
- 검사 항목별 결과키트마다 오류를 하나만 기록해서는 "AMH는 정상인데 비타민 D 검체만 용혈" 같은 결과를 담을 수 없었습니다. 검사 항목별 오류와 등급(Basic·Plus·Premium)으로 모델을 바꾸고, 앱은 등급마다 카드 배치만 다른 한 화면으로 합쳤습니다.
- 내 위치와 한계 시점나이대의 하위 10%·중앙값·상위 10% 사이를 보간해 내 수치의 위치를 계산합니다(피임약을 복용 중이면 서버가 AMH를 먼저 보정). 한계 시점은 ML 서버가 예측한 나이별 AMH 곡선이 기준값 아래로 처음 내려가는 나이로 정합니다.
- 한 번에 다시 계산문진은 답을 모아 한 번에 보내고 서버가 한 트랜잭션에서 바꿉니다.







채혈 실패 데이터 분석
키트 사용과 채혈 가이드
고객 문의를 유형별로 나눠 보니 채혈 문의가 약 29%로 가장 많았습니다. 종이 설명서의 채혈 안내를 앱 안의 12단계 가이드와 영상으로 옮기고, 단계마다 머문 시간과 이탈을 계측해 실제 채혈 실패 기록과 맞춰 봤습니다. 가이드를 시작한 사람의 80% 이상이 마지막 단계까지 갔습니다.
채혈 실패 데이터 분석
키트 사용과 채혈 가이드
고객 문의를 유형별로 나눠 보니 채혈 문의가 약 29%로 가장 많았습니다. 종이 설명서의 채혈 안내를 앱 안의 12단계 가이드와 영상으로 옮기고, 단계마다 머문 시간과 이탈을 계측해 실제 채혈 실패 기록과 맞춰 봤습니다. 가이드를 시작한 사람의 80% 이상이 마지막 단계까지 갔습니다.
- 실물 크기채혈 튜브를 실제 크기로 보여 주려고 Android는 화면의 실제 밀도를 읽습니다. iOS는 이를 알려 주는 API가 없어, 기기 모델별 화면 밀도 표를 원격 설정에 두고 찾습니다.
- 실패는 준비에서채혈침 단계에서는 이탈이 거의 없었습니다. 채혈에 실패한 사람들은 준비 운동 단계를 건너뛴 비율이 58%로 정상 채혈한 사람들(41%)보다 높았고, 재검사 키트는 첫 키트보다 3.4배 더 실패했습니다. 재검사 때 준비 단계를 건너뛰지 않게 하는 것이 가장 효과가 클 지점이라는 근거가 됐습니다.












앱 밖에서 도는 네이티브 위젯
월경 주기와 홈 위젯
결과지를 받고 나면 앱을 다시 열 이유가 없었습니다. 검사는 몇 달에 한 번이지만 월경 주기는 매달 돌아옵니다. 주기 기록을 검사와 잇고, 앱을 열지 않아도 오늘의 주기 상태가 홈 화면에 맞게 떠 있게 했습니다.
앱 밖에서 도는 네이티브 위젯
월경 주기와 홈 위젯
결과지를 받고 나면 앱을 다시 열 이유가 없었습니다. 검사는 몇 달에 한 번이지만 월경 주기는 매달 돌아옵니다. 주기 기록을 검사와 잇고, 앱을 열지 않아도 오늘의 주기 상태가 홈 화면에 맞게 떠 있게 했습니다.
- 검사와 연결주기 기록이 문진 응답으로 이어져, 검사 결과를 받을 때 다시 입력하지 않습니다.
- 건강 앱과 양방향HealthKit·Health Connect와 기록을 주고받으면, 내가 보낸 기록이 다음 가져오기 때 되돌아옵니다. 출처를 비교해 걸러 내고(Android는 출처 ID가 비어 와서 이름도 비교), 앱에서 지운 주기는 삭제 표시를 남겨 되살아나지 않게 했습니다.
- 위젯은 Dart를 실행하지 못한다처음 위젯은 앱이 열려 있을 때만 갱신됐습니다. 주기 계산을 Swift와 Kotlin으로 옮기고 같은 테스트를 붙였습니다. iOS는 며칠 치 표시를 미리 계산해 두고, 그런 방법이 없는 Android는 하루 한 번 백그라운드 작업이 다시 계산합니다. Android의 달력 이미지는 앱을 열 때만 갱신되는 것으로 두었습니다.


실패를 대비한 푸시 알림
검사 진행 상황을 잠금화면에(Live Activity)
검체가 검사실에 도착하면 택배 조회는 "배송 완료"에서 멈춥니다. 실제 검사는 그때부터 시작이라, 결과를 기다리는 사람은 그 사이가 궁금하고 불안했습니다. 그 뒤의 진행 상황을 iOS 잠금화면과 Dynamic Island에 보여 주게 했습니다.
실패를 대비한 푸시 알림
검사 진행 상황을 잠금화면에(Live Activity)
검체가 검사실에 도착하면 택배 조회는 "배송 완료"에서 멈춥니다. 실제 검사는 그때부터 시작이라, 결과를 기다리는 사람은 그 사이가 궁금하고 불안했습니다. 그 뒤의 진행 상황을 iOS 잠금화면과 Dynamic Island에 보여 주게 했습니다.
- 성공 응답인데 보이지 않을 때사용자가 닫은 진행 표시에도 APNs는 성공을 돌려줍니다. 서버가 일정 시간 뒤 갱신 토큰이 등록됐는지 확인하고, 없으면 일반 알림으로 대신 보냅니다.




스트리밍 AI 상담과 지원금 판정
난자동결 허브
검사 결과를 받은 사람의 큰 고민 중 하나는 난자동결이지만, 비용이나 지원금 같은 정보를 한곳에서 알기 어려웠습니다. AI 상담과 지원금 찾기, 비용 계산 같은 도구를 하나의 허브로 묶었습니다.
스트리밍 AI 상담과 지원금 판정
난자동결 허브
검사 결과를 받은 사람의 큰 고민 중 하나는 난자동결이지만, 비용이나 지원금 같은 정보를 한곳에서 알기 어려웠습니다. AI 상담과 지원금 찾기, 비용 계산 같은 도구를 하나의 허브로 묶었습니다.
- 지원금 판정지자체마다 다르고 자주 바뀌는 지원 조건을 코드가 아닌 데이터로 둡니다. 판정은 예/아니오 대신, 확실히 안 되는 조건이 있을 때만 제외하고 입력이 빈 조건은 "확인 필요"로 남겨 네 단계로 보여 줍니다. 혼인 여부처럼 한 조건만 어긋난 사업도 함께 알려 줍니다.
- 답변 스트리밍답변은 서버를 거쳐 조각으로 흘러옵니다. 조각 경계에서 한글이 깨지지 않게 스트림 파서를 직접 짜서 테스트를 붙였고, 사용자가 화면을 나가면 서버가 위쪽 스트림까지 끊습니다.














삼신 (RHABO) ·
Next.js · rhabo.care
할인과 결제 금액 정합성
자사몰
MVP 단계에서는 스마트스토어에서만 키트를 팔았습니다. 고객과 구매 데이터가 플랫폼에 남아, 누가 샀고 언제 채혈했고 결과가 어땠는지를 하나로 이을 수 없었습니다. MVP를 인계받아 웹·앱 결제와 주문 API까지 혼자 맡아 자사몰로 판매를 옮기고, 구매부터 결과까지를 하나의 고객 기록으로 이었습니다. 합류한 분기에 20건이던 결제 주문이 2025년 4분기 1,200건+까지 늘었고, 누적 매출은 2.7억 원입니다.
쿠폰, 선물하기, 친구 추천처럼 플랫폼에서는 어렵던 판매 정책도 직접 운영하게 됐습니다. 결제 주문의 34%가 쿠폰을 썼습니다.
할인과 결제 금액 정합성
자사몰
MVP 단계에서는 스마트스토어에서만 키트를 팔았습니다. 고객과 구매 데이터가 플랫폼에 남아, 누가 샀고 언제 채혈했고 결과가 어땠는지를 하나로 이을 수 없었습니다. MVP를 인계받아 웹·앱 결제와 주문 API까지 혼자 맡아 자사몰로 판매를 옮기고, 구매부터 결과까지를 하나의 고객 기록으로 이었습니다. 합류한 분기에 20건이던 결제 주문이 2025년 4분기 1,200건+까지 늘었고, 누적 매출은 2.7억 원입니다.
쿠폰, 선물하기, 친구 추천처럼 플랫폼에서는 어렵던 판매 정책도 직접 운영하게 됐습니다. 결제 주문의 34%가 쿠폰을 썼습니다.
- 할인 규칙 통합쿠폰·번들·프로모션 할인 계산을 가격 화면과 주문 생성이 같은 규칙으로 쓰게 한 곳에 모았습니다.









로그인·인앱 브라우저를 넘는 결제 흐름
난자동결 사전 예약
회사가 난자동결 전문병원을 준비하면서, 개원 전에 사전 예약을 받는 페이지를 만들었습니다. 예약금 결제가 걸린 페이지라 "돈은 나갔는데 예약은 없는" 상태가 생기면 안 됐고, 아직 없는 병원이 신뢰를 얻으려면 페이지가 매끄러워야 했습니다. 약 6주 동안 600명+가 사전 예약을 신청했습니다.
로그인·인앱 브라우저를 넘는 결제 흐름
난자동결 사전 예약
회사가 난자동결 전문병원을 준비하면서, 개원 전에 사전 예약을 받는 페이지를 만들었습니다. 예약금 결제가 걸린 페이지라 "돈은 나갔는데 예약은 없는" 상태가 생기면 안 됐고, 아직 없는 병원이 신뢰를 얻으려면 페이지가 매끄러워야 했습니다. 약 6주 동안 600명+가 사전 예약을 신청했습니다.
- 로그인을 다녀와도카카오·애플 로그인은 페이지를 통째로 다시 불러 화면 상태가 사라집니다. 받을 쿠폰을 브라우저 저장소 한 곳에만 두고, 돌아오면 자동으로 발급합니다.


페이지별 렌더링 전략
콘텐츠 · EGG WIKI
검색으로 들어오는 사람을 위해 난소 나이와 난자동결에 관한 위키, 실제 후기 모음, 뉴스레터를 만들었습니다. 글은 서버 DB에서 오고, 검색 노출과 최신성 사이에서 페이지마다 렌더링 방식을 골랐습니다.
페이지별 렌더링 전략
콘텐츠 · EGG WIKI
검색으로 들어오는 사람을 위해 난소 나이와 난자동결에 관한 위키, 실제 후기 모음, 뉴스레터를 만들었습니다. 글은 서버 DB에서 오고, 검색 노출과 최신성 사이에서 페이지마다 렌더링 방식을 골랐습니다.
- 페이지마다 렌더링 방식사이트 전체에 걸려 있던 동적 렌더링을 걷어 내고 페이지별로 정했습니다. 위키 글은 미리 만들어 두고 한 시간마다 갱신하고, 홈은 인앱 브라우저 감지를 클라이언트로 옮겨 정적으로 바꿨습니다.
- 갱신 주기의 함정주기적 갱신은 만료 뒤 첫 방문자에게 이전 페이지를 보여 줍니다. 방문이 적은 뉴스레터는 발행 직후에도 이전 호가 보여서, 독자가 보는 페이지는 매번 새로 받고 사이트맵만 캐시합니다.
- API가 멈춰도 배포빌드 중 상품 API가 늦으면 배포 전체가 실패했습니다. 빈 목록으로 빌드하고 첫 요청 때 채우게 했습니다.




삼신 (RHABO) ·
NestJS · PostgreSQL · AWS
서버 구성
외부 연동 약 20곳
지금까지 본 앱과 웹의 화면 뒤에는 서버 하나가 있습니다. 결제와 주문, 키트 배송과 수거, 검사 결과, 알림, 본인인증을 하나의 NestJS 서버가 처리하고, 외부 서비스 약 20곳과 연결됩니다. 이 서버와 인프라도 혼자 만들고 운영했습니다.
서버 구성
외부 연동 약 20곳
지금까지 본 앱과 웹의 화면 뒤에는 서버 하나가 있습니다. 결제와 주문, 키트 배송과 수거, 검사 결과, 알림, 본인인증을 하나의 NestJS 서버가 처리하고, 외부 서비스 약 20곳과 연결됩니다. 이 서버와 인프라도 혼자 만들고 운영했습니다.
- 하나의 APIFlutter 앱, Next.js 웹, 어드민이 모두 같은 NestJS API를 씁니다.
- 큐검사 단계 진행이나 알림 확인처럼 나중에 할 일은 Redis 기반 큐의 지연 작업으로 돌려, 서버가 재시작돼도 남게 했습니다.
- 저장소운영 데이터는 PostgreSQL, 파일은 S3에 두고, 분석용 데이터는 매일 BigQuery로 옮깁니다.
- 외부 연동 약 20곳결제, 물류, 알림, 인증, AI까지 연동이 많아, 응답이 중복되거나 늦거나 거절되는 경우를 연동마다 따로 다뤘습니다.
키트 사용 플로우
주문부터 리포트까지
주문이 들어오면 결제를 확정하고, 우체국 수거를 예약하고, 배송 조회로 키트의 위치를 갱신하고, 검사 결과가 들어오면 리포트를 만들어 알립니다. 이 흐름이 끊기면 사람이 직접 확인해야 해서, 단계마다 상태를 남겼습니다.
키트 사용 플로우
주문부터 리포트까지
주문이 들어오면 결제를 확정하고, 우체국 수거를 예약하고, 배송 조회로 키트의 위치를 갱신하고, 검사 결과가 들어오면 리포트를 만들어 알립니다. 이 흐름이 끊기면 사람이 직접 확인해야 해서, 단계마다 상태를 남겼습니다.
- 주문과 결제결제사 웹훅이 중복되거나 늦게 와도 주문은 한 번만 확정됩니다.
- 수거 예약고객이 수거를 신청하면 서버가 우체국 수거를 예약하고 전날 안내 알림톡을 예약해 둡니다. 신청을 거두면 예약된 알림톡도 취소합니다.
- 배송 조회우체국 배송 기록을 주기적으로 조회해 상태를 바꾸고, 수거 전·오래 조회되지 않음·반송처럼 막힌 상태를 구분해 기록합니다.
- 입고 이후운영팀이 입고를 처리하면 채혈 안내 알림을 거두고, 잠금화면 진행 표시를 푸시로 시작하고, 검사실 세부 단계를 지연 작업으로 예약합니다. 처음엔 타이머로 이어 두어 서버가 재시작되면 예약이 사라졌습니다.
- 리포트검사 결과가 들어오면 ML 서버가 분석하고, 서버가 리포트를 만들어 진행 표시를 끝내고 푸시로 알립니다.
한 사람이 운영할 수 있는 구조
운영하는 사람이 한 명이면 들인 모든 구성 요소가 곧 장애 대응 범위입니다. 그래서 MVP 단계에는 PM2로 빠르게 배포하고, 주문이 늘어난 뒤에는 Docker 이미지·ECR·SSM 기반 배포로 단계적으로 옮겨 느리고 비용이 더 들어도 재현 가능하고 관리 가능한 구조로 정비했습니다. 테스트를 정리해 통과하지 않으면 배포되지 않게 했고, 쓰지 않는 검증 환경은 꺼 둘 수 있게 했습니다.
삼신 (RHABO) ·
React · BigQuery · AWS CDK
운영 어드민
키트 운영 흐름
키트 주문부터 수거, 입고, 검사, 결과 입력까지 운영팀이 매일 하는 일을 단계별 화면으로 만들었습니다.
운영 어드민
키트 운영 흐름
키트 주문부터 수거, 입고, 검사, 결과 입력까지 운영팀이 매일 하는 일을 단계별 화면으로 만들었습니다.
- 키트 현황첫 화면은 단계마다 몇 개가 머물러 있는지 보여 주고, 단계를 누르면 그 키트들을 펼쳐 봅니다.
- 수거 일정수거 예정 키트를 날짜와 검사 등급별로 보여 줍니다.
- 입고 처리검사실에 도착한 키트를 골라 입고 처리합니다. 이 한 번의 변경으로 서버가 채혈 알림 정리, 잠금화면 진행 표시, 검사 단계 예약을 이어서 합니다.
- 결과 입력결과는 검사 항목마다 따로 넣고, 항목별로 혈액 부족·손상을 표시합니다. 리포트의 항목별 결과 구조가 여기서 시작됩니다.
- 물류 담당운영팀에 물류를 맡은 파트타임 직원이 있어, 물류 담당 역할에는 발송 처리 화면만 보이게 나눴습니다.
같은 숫자를 보는 데이터 환경
BigQuery · 지표 기준
개발자가 아닌 동료들도 데이터를 직접 보고 같은 숫자로 이야기할 수 있게, 운영 데이터와 광고·유입 데이터를 한곳에 모으고 자연어로 질문하는 환경을 만들었습니다.
같은 숫자를 보는 데이터 환경
BigQuery · 지표 기준
개발자가 아닌 동료들도 데이터를 직접 보고 같은 숫자로 이야기할 수 있게, 운영 데이터와 광고·유입 데이터를 한곳에 모으고 자연어로 질문하는 환경을 만들었습니다.
- 소스운영 DB와 GA4 이벤트를 모읍니다. 광고 성과를 재기 위해 GA4, 서버 측 GTM, Meta 전환 추적도 연결했습니다.
- 매일 옮기기운영 DB를 읽기 전용으로 매일 BigQuery에 옮깁니다. 같은 날을 다시 돌려도 결과가 같도록 덮어쓰기로 만들었습니다.
- 지표 기준가입자 수나 매출을 사람마다 다르게 계산하지 않도록, 지표마다 기준 SQL·주의사항·검증일을 담은 지표 정의 테이블을 BigQuery에 두고 사람과 AI가 이 정의만 쓰게 했습니다.
- 팀 공유 Claude 프로젝트동료들은 팀 공유 Claude 프로젝트에서 질문합니다. 분석 지침, 스키마 설명, 지표 기준을 넣어 두고 BigQuery에 바로 연결해, 같은 질문에는 같은 정의로 답하게 했습니다.
EMR과 DUR 연동
병원 개원 시스템
회사가 난자동결 병원을 준비하면서, 진료 기록과 처방을 다루는 병원 전산(EMR)과 직원용 웹을 만들었습니다. 처방 시 의약품 안전 점검을 위해 건강보험심사평가원의 DUR 시스템과 연동했고, 인프라는 AWS CDK로 코드화했습니다.
EMR과 DUR 연동
병원 개원 시스템
회사가 난자동결 병원을 준비하면서, 진료 기록과 처방을 다루는 병원 전산(EMR)과 직원용 웹을 만들었습니다. 처방 시 의약품 안전 점검을 위해 건강보험심사평가원의 DUR 시스템과 연동했고, 인프라는 AWS CDK로 코드화했습니다.
- 오늘 할 일진료 큐와 결과 확인 대기 옆에, DUR 확인이 시간 초과나 오류로 지연된 처방을 모아 직원이 마저 처리하게 했습니다. 보내지 못한 점검 결과는 1분마다 자동으로 다시 보냅니다.
- 처방 입력의약품은 성분명 코드로 검색해 고르고, 청구나 DUR 전송에 필요한 항목이 비어 있으면 발급 전에 알려 줍니다.
- 발급과 DUR 확인발급과 동시에 DUR(병용금기·중복처방) 확인이 진행되고, 결과와 전자서명이 처방에 남습니다.


















