복약도우미

DigitalTwin 기반 복약·위험 예측 시뮬레이션 플랫폼

가상 환자 상태 변화를 만들고, 미래 위험을 예측하며, 개인화 추정으로 처방 후보 차이를 비교하는 실험 플랫폼
SYS
SimulationRun

실행 조건과 결과를 묶는 재현 가능한 실험 단위

ML
Risk Prediction

현재·다음 날·3일 후 riskScore를 비교 가능한 방식으로 예측

TWIN
PersonaEstimation

관측 데이터로 숨겨진 페르소나와 위험 성향을 추정

SAFE
Candidate Comparison

실제 처방 대체가 아니라 후보 판단의 차이를 비교

파란색: 시스템·SimulationRun 초록색: ML·후보 개선 보라색: DigitalTwin·개인화 주황색: 한계·주의점

1. 복약 관리는 단순 기록 문제가 아니다

복약 관리는 단순 기록 문제가 아니다

질병, 약물, 복약 습관, 증상 변화가 시간에 따라 얽히며 위험도가 달라진다.

핵심 질문

시간이 지나면서 환자의 위험은 어떻게 변하고, 그 변화를 보고 어떤 판단 후보를 만들 수 있을까?

2. 데이터 생성에서 처방 후보 비교까지

1. 실험 재료 생성

실제 환자 데이터 없이도 반복 실험이 가능하도록 가상 환자와 복약 데이터를 생성한다.

Mock Data Generator User, Disease, Medication, SelfDiagnosis 기반 데이터 생성
Persona 기반 다양성 나이, 복약 성향, 질환 계통, 증상 변동성 차이 반영

2. 상태 변화 시뮬레이션

시간이 흐르며 복약 기록, 자가진단, 처방, riskScore가 같은 실행 단위에 쌓인다.

Simulation Engine tick 또는 기간 단위로 환자 상태 변화 생성
SimulationRun 실행 조건, 정책 버전, 생성 데이터, 완료 상태를 묶는 실험 기준점

3. 예측과 후보 비교

시뮬레이션 결과를 기반으로 미래 위험을 예측하고 개인화된 판단 후보를 비교한다.

ML Prediction 현재·다음 날·3일 후 riskScore 예측
DigitalTwin / PersonaEstimation 관측 데이터로 숨겨진 페르소나와 위험 경향 추정
PrescriptionCandidate Rule-Based 처방과 ML-assisted 후보를 분리해 비교
모의데이터 SimulationRun ML · DigitalTwin · 처방 후보 비교
복약도우미는 단순 기록 앱이 아니라, 가상 환자 상태 변화와 미래 위험 예측을 실험하는 플랫폼이다.

3. 기능 구현이 실험 플랫폼으로 확장된 과정

FOUNDATION

데이터 기반 마련

실험에 필요한 기본 도메인과 모의데이터 생성 구조를 먼저 확보했다.

기본 데이터 구조 User / Disease / Medication / SelfDiagnosis
모의데이터 생성 가상 환자와 복약 기록을 반복 생성
EXPERIMENT

시뮬레이션 엔진화

시간에 따른 상태 변화를 만들고, 실행 조건을 추적 가능한 실험 단위로 정리했다.

시계열 시뮬레이션 tick / 기간 단위로 환자 상태 변화 생성
SimulationRun 정규화 실행 조건, 정책 버전, 재현성 관리
OPERATION

예측과 운영 경험

ML 예측과 배포·자동화를 통해 프로젝트를 실제 서비스에 가까운 형태로 다뤘다.

ML 예측 파이프라인 riskScore 미래 예측과 비교 구조 구축
CI/CD와 배포 홈랩 서버, VPS, GitHub Actions 연동
DIGITALTWIN

개인화 후보 비교

가상 환자의 숨겨진 성향을 추정하고, 기존 판단과 다른 후보를 비교하는 단계로 확장했다.

DigitalTwin Persona 기반 상태 변화와 개인화 추정
Feature 28 처방 후보 비교와 ML-assisted candidate
도메인 데이터 시뮬레이션 ML·운영 DigitalTwin·후보 비교
feature-first 방식으로 구현하면서, 각 단계에서 드러난 구조적 문제를 데이터 모델과 실행 단위로 정리했다.

4. 각 기술이 맡은 역할

Backend

Spring Boot
서비스 로직과 API

Database

MySQL + Flyway
데이터와 변경 이력 관리

ML

Tribuo
Java 기반 riskScore 예측

Dashboard

HTML / JS
시뮬레이션과 분석 결과 확인

Infra

Docker, Homelab, VPS
외부 접근 가능한 실행 환경

CI/CD

GitHub Actions
테스트와 배포 자동화

5. 데이터 모델링 — 실행·예측·후보 비교를 분리

핵심 데이터 모델을 3개 책임으로 분리

1. 실행과 관측 데이터

User DigitalTwin PersonaDefinition SimulationRun SelfDiagnosis MedicationRecord Prescription

2. 예측과 개인화 분석

RiskScoreRecord ModelVersion MLPrediction PersonaEstimation

3. 처방 후보 비교

PrescriptionCandidate PrescriptionComparison ML-assisted Candidate Rule-Based Baseline
실행 데이터
예측·추정
후보 비교

데이터 모델링에서 지킨 원칙

1
실행 결과와 분석 결과 분리

실제 시뮬레이션 결과와 ML 분석 결과를 같은 의미로 섞지 않음

2
score의 출처 추적

Rule-Based, ML predicted, 재계산 score를 PolicyVersion / ModelVersion 기준으로 구분

3
실제 처방과 후보 처방 분리

Prescription은 실행 결과, PrescriptionCandidate는 비교용 분석 후보로 취급

4
재현 가능한 비교 단위 확보

SimulationRun을 기준으로 어떤 조건에서 생성된 데이터인지 추적

핵심은 테이블을 많이 만든 것이 아니라, “이 데이터가 실제 결과인지, 예측인지, 비교 후보인지”를 분리한 것이다.

6. SimulationRun — 재현 가능한 실험 단위

실행부터 학습 데이터 경계까지
1
실행 요청 수신

사용자, 기간, seed, 정책 조합을 하나의 실행 조건으로 묶음

2
SimulationRun 생성

status와 parameterSnapshot으로 실행 이력과 재현 조건을 보존

3
시뮬레이션 데이터 생성

SelfDiagnosis, MedicationRecord, Prescription을 같은 run에 귀속

4
완료 상태 확정

COMPLETED 실행만 ML 학습·평가 데이터셋으로 사용

설계 핵심 포인트

R
재현성 확보

같은 조건과 seed로 다시 실행해 결과 차이를 비교

S
상태 관리

RUNNING / COMPLETED / FAILED로 성공·실패 이력 보존

P
정책 버전 추적

PolicyVersion을 통해 어떤 규칙으로 계산했는지 기록

M
ML 데이터 경계

완료된 실행만 학습 대상으로 사용해 데이터 오염 방지

SimulationRun은 단순 실행 로그가 아니라, 정책·모델 변경 효과를 비교하기 위한 실험 기준점이다.

7. ML 예측 — 기존 판단을 대체하지 않고 비교한다

관측 데이터에서 미래 riskScore 예측까지
INPUT
현재까지 관측 가능한 데이터

복약 기록, 자가진단, 질병 상태, 기존 riskScore를 feature로 구성

MODEL
ML Prediction Model

복잡한 시뮬레이션 데이터에서 반복되는 위험 변화 경향을 학습

STORE
MLPrediction / RiskScoreRecord

기존 Rule-Based 결과와 분리 저장하여 나란히 비교 가능한 구조로 유지

현재 위험 current riskScore
다음 날 next-day prediction
3일 후 after-3-days prediction

검증 핵심 포인트

N
No future leakage

예측 시점 이후의 데이터를 feature로 사용하지 않음

U
User-level split

같은 유저가 train/test에 동시에 들어가지 않도록 분리

S
Shadow Mode

기존 Rule-Based 판단은 유지하고 ML 예측만 별도 저장

C
Comparison Mode

Rule-Based score와 ML predicted score를 같은 기준으로 비교

ML은 기존 판단을 즉시 대체하는 장치가 아니라, 복잡계 안의 경향성을 검증 가능한 방식으로 비교하는 보조 예측 모델이다.

8. DigitalTwin — 숨겨진 페르소나를 관측 데이터로 추정

OBSERVED

관측 가능한 데이터

DigitalTwin 실행 중 실제로 쌓이는 기록만 추정의 근거로 사용한다.

MedicationRecord 복약 여부, 누락 패턴, 복약 지속성
SelfDiagnosis 사용자가 입력한 증상 변화와 상태 기록
RiskScoreRecord Rule-Based와 ML score 흐름, 상승·하락 추세
ESTIMATED

PersonaEstimation

관측 데이터만으로 숨겨진 personaType과 위험 성향을 추정한다.

estimatedPersonaType 예: ELDERLY_FRAIL, LOW_ADHERENCE, HIGH_VOLATILITY
confidenceLevel 추정이 얼마나 일관된 관측값에 기반하는지 표시
comparison 시뮬레이션의 실제 personaType과 비교해 추정 품질 확인
숨겨진 성향
관측 데이터
개인화 추정
DigitalTwin의 핵심은 정답을 처음부터 보여주는 것이 아니라, 복약 기록·자가진단·riskScore 흐름으로 숨겨진 특성을 추정하는 과정이다.

9. Feature 28 — 예측에서 처방 후보 비교까지

NOW

이미 확보한 기반

시뮬레이션과 ML 예측 결과를 같은 실행 단위 안에서 추적할 수 있는 상태

SimulationRun 실행 조건, 정책 버전, 생성 데이터를 묶는 실험 기준점
MLPrediction 미래 riskScore 예측과 actual/predicted 비교 이력
DigitalTwin 가상 환자 상태 변화와 관측 데이터 축적
STEP 1–2

개인화 분석 계층

riskScore와 persona 추정을 분리해 Rule-Based와 ML 결과를 비교 가능한 형태로 정리

Step 1. RiskScoreRecord Rule-Based, ML predicted, recalculated score를 같은 기준으로 저장
Step 2. PersonaEstimation 관측 데이터로 숨겨진 personaType과 위험 성향을 추정
Comparison Mode 기반 정책·모델 버전별 score를 나란히 조회하고 비교
STEP 3–4

처방 후보 비교 계층

개인화 예측 결과가 기존 처방 판단과 어떤 차이를 만드는지 확인

Step 3. PrescriptionCandidate 실제 Prescription과 분석용 후보 처방을 분리
PrescriptionComparison Rule-Based baseline과 ML-assisted candidate를 하나의 비교 단위로 묶음
Step 4. ML-assisted Candidate 예측 위험 상승과 PersonaEstimation을 근거로 보수적 후보 제안
예측한다
개인화한다
후보 판단을 비교한다
Feature 28의 목표는 “ML 예측값 표시”가 아니라, 예측과 개인화 추정이 처방 후보 비교까지 이어지는 구조를 만드는 것이다.

10. 데모 해석 — 위험 상승 조기 감지

DigitalTwin Risk Rising Case

Current Risk 62
ML 3-day Prediction 78
Actual after 3 days 76 ↑
Confidence 0.82
PersonaEstimation: ELDERLY_FRAIL

높은 증상 변동성, 낮은 복약 순응도, 위험 상승 가능성이 함께 관측된 시나리오

Rule-Based vs ML-assisted 후보 비교

Rule-Based

MAINTAIN

현재 riskScore가 기준선을 넘지 않았기 때문에 유지 판단을 선택

ML-assisted

REINFORCE
/ WARNING

3일 후 위험 상승 예측, 높은 변동성, 낮은 순응도를 근거로 보수적 후보 제안

사후 확인

이후 실제 riskScore 흐름이 상승 방향으로 움직이며 ML-assisted 후보의 우려와 같은 방향을 보임

62 → 76
핵심은 “ML이 처방을 대체했다”가 아니라, 개인화 예측이 기존 판단과 다른 후보를 만들고 그 근거를 비교할 수 있다는 점이다.

11. 한계 인식 — 가능한 것과 불가능한 것을 구분

가능한 것

위험 상승 조기 감지 비교

후보 판단 근거 비교

이후 riskScore 흐름 확인

불가능한 것

실제 치료 효과 단정

실제 처방 대체

임상 검증 주장

12. 운영 회고 — 실험 플랫폼을 실제 서비스처럼 다뤄보기

OPERATED

실제로 운영한 것

로컬 실행을 넘어서 외부 접근 가능한 웹 서비스 형태로 배포했다.

Homelab Deployment Docker 기반 Spring Boot / MySQL 실행 환경 구성
VPS · Cloudflare · Nginx 공개 접근 경로와 기본 보안 경계 구성
Flyway Migration DDL 직접 관리의 한계를 DB 변경 이력 관리로 전환
LEARNED

개발 중 체감한 문제

기능 하나가 맞아도 전체 흐름에서는 실패할 수 있다는 점을 확인했다.

복합 장애 DB, 배포 경로, 설정, 프론트 문제가 동시에 얽힘
데드락과 트랜잭션 FK 관계와 실행 순서가 전체 안정성에 직접 영향
단독 통과 / 전체 실패 통합 테스트와 CI/CD의 필요성을 직접 체감
구현 배포 장애 경험 테스트·마이그레이션·확장 설계
이번 프로젝트의 의미는 기능 구현뿐 아니라, 시뮬레이션·ML·DB·배포를 하나의 유지 가능한 실험 플랫폼으로 연결한 데 있다.

결론 — 복약 기록을 넘어 실험 가능한 플랫폼으로

1. 상태 변화를 만든다

모의데이터와 SimulationRun으로 가상 환자의 복약 기록, 자가진단, riskScore 흐름을 재현 가능하게 생성한다.

2. 미래 위험을 예측한다

ML은 기존 Rule-Based 판단을 대체하지 않고, 미래 riskScore를 비교 가능한 보조 예측으로 저장한다.

3. 후보 판단을 비교한다

DigitalTwin과 PersonaEstimation을 통해 기존 처방과 ML-assisted 후보가 어떻게 달라지는지 확인한다.

복약도우미는 가상의 환자 상태를 만들고, 시간에 따른 변화를 시뮬레이션하며, ML과 DigitalTwin 기반 개인화 분석으로 처방 후보 차이를 비교하는 실험 플랫폼입니다. 핵심 성과는 기능을 많이 만든 것이 아니라, 복약·위험 예측 문제를 데이터 생성, 시뮬레이션, 예측, 개인화, 후보 비교라는 구조로 분해하고 다시 하나의 시스템으로 연결한 것입니다.