KiniQ — 만성신장질환 조기 발굴 및 생활습관 중재 서비스
오즈코딩스쿨 K-Digital Training AI 헬스케어 과정 최종 프로젝트 · Talos 참여기업 주제 제공
검진 결과를 넣으면 위험 단계와 맞춤 생활습관 챌린지를 받는 헬스케어 웹 서비스
| 기간 | 2026.04.23 – 06.19 (304시간) |
|---|---|
| 팀·역할 | 4명 — 저는 화면 전체와 API·배포, 팀원들은 위험 예측 모델과 RAG 챗봇 |
| 기술 | FastAPI · PostgreSQL 16 · Tortoise ORM · React 19 · TypeScript · TanStack Query · CLOVA OCR · Docker · AWS EC2 |
내 커밋 97 / 124
40세 이상 만성신장질환 위험군이 건강검진 결과를 입력하면 G1~G4 위험 단계를 배정받고, 단계에 맞는 생활습관 챌린지와 대시보드를 받는 서비스입니다.
왜 만들었나
만성콩팥병은 증상 없이 진행돼, 검진 결과지를 받아도 숫자가 무슨 뜻인지, 오늘 무엇을 해야 하는지 알기 어렵습니다. 병원은 처방과 검사까지만 하고 일상 관리는 본인 몫입니다. 그래서 검진 결과를 넣으면 위험 단계를 알려 주고, 단계에 맞는 생활습관을 매일 실천하게 돕는 서비스를 만들었습니다.
- 국내 만성콩팥병 환자는 2012년 13만 7천 명에서 2022년 29만 6천 명으로 10년 동안 2배 넘게 늘었고, 진료비는 1조 2천억 원에서 2조 3천억 원이 됐습니다.질병관리청 「주간 건강과 질병」 2024;17:381–382 (팀 결과보고서 인용)
- 주제는 참여기업 Talos가 제시했고, 기업의 관여는 주제 제공까지였습니다.
- 검진 입력 → 위험 단계 배정 → 챌린지 → 대시보드까지 화면 전체와 API — 팀원이 도운 화면과 로직도 이어받아 하나로 통합
- 결과지 사진·PDF에서 수치 10종 자동 입력 (OCR)
- DB를 PostgreSQL로 교체하고 운영 중 스키마 변경 16번 무중단 적용
- 보안 필수 항목 8건, 동시 접속 50명 부하 테스트에서 조회 P95 18ms
- AWS EC2에 접속해 Docker 컨테이너를 띄우는 배포 담당
팀 밖의 사용자가 써본 적은 없습니다. 위험 예측 모델은 팀원이 맡았고 저는 성능을 주장하지 않습니다. 커밋 78%는 분담의 결과입니다 — 팀원들의 예측 모델·RAG 실험은 커밋으로 잡히지 않습니다.
github.com/rladbsrl298/AH_03_02발생한 문제와 해결 과정발생한 문제와 해결 과정 접기
검진 결과지의 고밀도콜레스테롤 수치가 총콜레스테롤 칸으로 새어 들어갔습니다.
| 문제 | 결과지 사진을 올리면 수치가 자동으로 채워져야 하는데, 표 형식 결과지에서 고밀도콜레스테롤 값이 총콜레스테롤 칸으로 들어갔습니다. |
|---|---|
| 판단 | OCR이 글자 조각마다 줄을 바꿔 한 행이 흩어진 것이 원인이었습니다. 줄바꿈 신호가 아니라 글자의 위치로 행을 판단해야 한다고 봤습니다. |
| 조치 | 좌표로 같은 행을 다시 묶고, “고밀도·저밀도”가 들어간 행은 총콜레스테롤로 매핑하지 않게 막았습니다. 두 줄짜리 고밀도콜레스테롤 칸은 칸 경계를 기준으로 따로 읽습니다. |
| 결과 | 혈압·공복혈당·콜레스테롤 등 10종을 자동으로 채우고, 여러 쪽짜리 PDF는 쪽 단위로 나눠 처리합니다. |
받은 템플릿의 MySQL로는 형태가 바뀌는 기록과 의료 수치를 함께 담기 어려웠습니다.
| 후보 | 판단 | 이유 |
|---|---|---|
| PostgreSQL 16 | 채택 | 포인트 적립 내역·감정 기록처럼 형태가 바뀌는 데이터를 JSONB로 담을 수 있고, 트랜잭션도 확실합니다 |
| MySQL 8.0 | 기각 | JSON만 있고 JSONB가 없습니다 |
| MongoDB | 기각 | 혈압·혈당·eGFR 같은 의료 수치의 트랜잭션 무결성 |
| SQLite | 기각 | 여러 사용자가 동시에 씁니다 |
감수할 단점(멘토의 PostgreSQL 경험 부족, JSONB 인덱싱 비용)까지 의사결정 문서(ADR-0001)에 적어 팀이 알고 결정하게 했고, 운영 중 스키마 변경 16번을 중단 없이 적용했습니다. 프론트엔드도 같은 방식으로, 백엔드를 FastAPI로 분리한 이상 Next.js는 기능이 겹쳐 기각하고 Vite + React로 정했습니다(ADR-0002).
한 장 정리 — 목표 · 역할 · 진행 · 결과한 장 정리 접기
| 목표 | 검진 결과 입력 → 위험 단계 → 생활습관 챌린지 → 대시보드로 이어지는 한 흐름을 만든다 |
|---|---|
| 내 역할 | 화면 전체와 API(커밋 97 / 124). 팀원이 도운 화면·로직을 이어받아 통합, OCR과 게이미피케이션은 단독 구현, AWS EC2에 Docker로 배포 |
| 진행 과정 | 기획(~5.19) → 1차 스프린트: 인증·DB(~5.26) → 2차: AI 핵심 기능·OCR(~6.01) → 3차: 통합·화면 다듬기·부하 테스트(~6.17) → 발표(6.19) |
| 결과 | 수치 10종 자동 입력, 운영 중 스키마 변경 16번 무중단, 동시 접속 50명 부하 테스트에서 조회 P95 18ms, 기술 선택 기록(ADR) 4건 |
| 배운 점 | 결과가 틀리면 규칙부터 고치기보다 데이터가 어떻게 들어오는지 먼저 봐야 한다는 것. 가장 오래 막힌 곳은 기획·설계 단계였고, 이후 프로젝트에서는 문서를 먼저 쓰게 됐습니다 |
| 한계 | 팀 밖의 사용자가 써 본 적은 없습니다. 위험 예측 모델은 팀원이 맡아 성능을 주장하지 않습니다 |