헬스케어 EMR 개발 패턴
전자의무기록(EMR) 및 전자건강기록(EHR) 시스템 구축을 위한 패턴입니다. 환자 안전, 임상 정확성, 의료진 효율성을 최우선으로 합니다.
사용 시기
- 환자 진료 워크플로우 구축 (증상, 검사, 진단, 처방)
- 임상 기록 작성 구현 (구조화 + 자유 텍스트 + 음성-텍스트)
- 약물 상호작용 확인 기능이 포함된 처방/약물 모듈 설계
- 임상 의사결정 지원 시스템(CDSS) 통합
- 참고 범위 강조 표시가 포함된 검사 결과 표시 구현
- 임상 데이터 감사 추적 구현
- 의료 데이터 입력을 위한 의료 접근성 UI 설계
작동 방식
환자 안전 최우선
모든 설계 결정은 다음 질문을 기준으로 평가되어야 합니다: "이것이 환자에게 해를 끼칠 수 있는가?"
- 약물 상호작용은 반드시 경고해야 하며, 조용히 통과시켜서는 안 됩니다
- 비정상 검사 값은 반드시 시각적으로 표시되어야 합니다
- 중요한 활력징후는 반드시 에스컬레이션 워크플로우를 트리거해야 합니다
- 감사 추적 없이 임상 데이터 수정은 허용되지 않습니다
단일 페이지 진료 기록 흐름
임상 진료 기록은 탭 전환 없이 단일 페이지에서 수직으로 흘러야 합니다:
환자 헤더 (고정 — 항상 표시)
├── 인구통계, 알레르기, 현재 복용 약물
│
진료 기록 흐름 (수직 스크롤)
├── 1. 주 증상 (구조화 템플릿 + 자유 텍스트)
├── 2. 현재 질환 병력
├── 3. 신체 검진 (계통별)
├── 4. 활력징후 (자동 임상 점수 트리거)
├── 5. 진단 (ICD-10/SNOMED 검색)
├── 6. 약물 (약물 DB + 상호작용 확인)
├── 7. 검사 (검사실/영상의학 검사 주문)
├── 8. 계획 및 추후 관리
└── 9. 서명 / 잠금 / 인쇄
스마트 템플릿 시스템
interface ClinicalTemplate {
id: string;
name: string; // 예: "흉통"
chips: string[]; // 클릭 가능한 증상 칩
requiredFields: string[]; // 필수 데이터 포인트
redFlags: string[]; // 해제 불가능한 경고 트리거
icdSuggestions: string[]; // 사전 매핑된 진단 코드
}
템플릿의 위험 신호는 반드시 표시 가능하고 해제 불가능한 경고를 트리거해야 합니다. 토스트 알림이 아닙니다.
약물 안전 패턴
사용자 약물 선택
→ 현재 복용 약물과 상호작용 확인
→ 진료 기록 내 약물과 상호작용 확인
→ 환자 알레르기 확인
→ 체중/나이/신장 기능 대비 용량 검증
→ 치명적 상호작용인 경우: 처방을 완전히 차단
→ 의료진은 차단을 넘어 진행하려면 무효화 사유를 문서화해야 함
→ 심각한 상호작용인 경우: 경고 표시, 확인 필요
→ 모든 알림 및 무효화 사유를 감사 추적에 기록
치명적 상호작용은 기본적으로 처방을 차단합니다. 의료진은 감사 추적에 기록된 문서화된 사유로 명시적으로 무효화해야 합니다. 시스템은 치명적 상호작용을 절대 조용히 허용하지 않습니다.
잠긴 진료 기록 패턴
임상 진료 기록이 서명되면:
- 편집 불가 — 추가 기록(별도의 연결된 기록)만 허용
- 원본과 추가 기록 모두 환자 타임라인에 표시
- 감사 추적은 서명한 사람, 서명 시간, 모든 추가 기록을 캡처
임상 데이터를 위한 UI 패턴
활력징후 표시: 정상 범위 강조 표시(녹색/노란색/빨간색)가 포함된 현재 값, 이전 값 대비 추세 화살표, 자동 계산된 임상 점수(NEWS2, qSOFA), 인라인 에스컬레이션 지침.
검사 결과 표시: 정상 범위 강조 표시, 이전 값 비교, 해제 불가능한 경고가 포함된 중요 값, 채취/분석 시간 기록, 예상 처리 시간이 포함된 대기 중인 검사.
처방전 PDF: 환자 인구통계, 알레르기, 진단, 약물 세부 정보(일반명 + 상표명, 용량, 경로, 빈도, 기간), 의료진 서명 블록이 포함된 원클릭 생성.
의료 접근성
의료 UI는 일반 웹 앱보다 더 엄격한 요구 사항을 가집니다:
- 4.5:1 최소 명암비(WCAG AA) — 의료진은 다양한 조명에서 작업
- 44x44px 최소 터치 대상 — 장갑을 끼거나 급하게 상호작용할 때를 대비
- 키보드 탐색 — 데이터를 빠르게 입력하는 고급 사용자를 위해
- 색상만으로 표시하지 않음 — 항상 색상을 텍스트/아이콘과 함께 사용(색맹 의료진 고려)
- 모든 양식 필드에 스크린 리더 레이블
- 임상 알림을 위한 자동 사라짐 토스트 금지 — 의료진이 반드시 직접 확인해야 함
안티패턴
- 브라우저 localStorage에 임상 데이터 저장
- 약물 상호작용 확인 시 조용한 실패
- 중요한 임상 알림을 위한 해제 가능한 토스트
- 임상 워크플로우를 분절시키는 탭 기반 진료 기록 UI
- 서명/잠금된 진료 기록 편집 허용
- 감사 추적 없이 임상 데이터 표시
- 임상 데이터 구조에
any타입 사용
예시
예시 1: 환자 진료 기록 흐름
의사가 환자 #4521의 진료 기록 열기
→ 고정 헤더 표시: "Rajesh M, 58M, 알레르기: 페니실린, 현재 복용 약물: Metformin 500mg"
→ 주 증상: "흉통" 템플릿 선택
→ 칩 클릭: "흉골 아래", "왼쪽 팔로 방사", "쥐어짜는 듯한"
→ 위험 신호 "쥐어짜는 듯한 흉골 아래 흉통"이 해제 불가능한 경고 트리거
→ 검진: 심혈관계 — "S1 S2 정상, 심잡음 없음"
→ 활력징후: HR 110, BP 90/60, SpO2 94%
→ NEWS2 자동 계산: 점수 8, 위험 높음, 에스컬레이션 경고 표시
→ 진단: "ACS" 검색 → ICD-10 I21.9 선택
→ 약물: Aspirin 300mg 선택
→ CDSS가 Metformin과 상호작용 확인: 상호작용 없음
→ 진료 기록 서명 → 잠김, 이후 추가 기록만 가능
예시 2: 약물 안전 워크플로우
의사가 환자 #4521에게 Warfarin 처방
→ CDSS 감지: Warfarin + Aspirin = 치명적 상호작용
→ UI: 빨간색 해제 불가능 모달이 처방 차단
→ 의사가 "사유와 함께 무효화" 클릭
→ 입력: "이점이 위험을 상회함 — 모니터링되는 INR 프로토콜"
→ 무효화 사유 + 알림이 감사 추적에 저장
→ 문서화된 무효화와 함께 처방 진행
예시 3: 잠긴 진료 기록 + 추가 기록
진료 기록 #E-2024-0891, Dr. Shah가 14:30에 서명
→ 모든 필드 잠김 — 편집 버튼 없음
→ "추가 기록 추가" 버튼 사용 가능
→ Dr. Shah가 추가 기록 클릭, 작성: "검사 결과 수신 — Troponin 상승"
→ 새 기록 E-2024-0891-A1이 원본에 연결됨
→ 타임라인에 둘 다 표시: 원본 진료 기록 + 추가 기록(타임스탬프 포함)