카카오헬스케어
경력근거: EHR 서비스에서 반복적으로 사용되는 핵심 UI 패턴을 구현하고 고도화합니다
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고가 주요업무에 'EHR 서비스에서 반복적으로 사용되는 핵심 UI 패턴을 구현하고 고도화합니다' 를 적었고, 그 앞에 'EHR 화면 개발에 필요한 공통 컴포넌트, UI 라이브러리, 레이아웃 시스템을 구현합니다' 를 두었습니다. 진료 전 확인 목록은 매일 아침 반복되는 그 패턴이고, 놓치면 환자를 다시 부르는 비용이 그날 순번 전체로 번집니다. 이 포트폴리오는 그 확인을 진료과별 규칙표로 옮겨 한 화면에 모읍니다. '사업/기획, 디자이너, 개발자, 의료진 등 다양한 직군의 요구사항을 이해하고' 도 규칙을 간호·원무와 함께 채우는 이 편의 자리를 가리킵니다. 이 포트폴리오가 보여주는 것은 확인 규칙을 데이터로 두고 예약과 맞춰 덜 준비된 것을 가르는 기술이며, 무엇을 더 확인해야 하는지에 대한 의학적 판단은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
'EHR 서비스에서 반복적으로 사용되는 핵심 UI 패턴을 구현하고 고도화합니다'. 진료 전 확인 목록이 매일 반복되는 그 패턴입니다.
'EHR 화면 개발에 필요한 공통 컴포넌트, UI 라이브러리, 레이아웃 시스템을 구현합니다'. 이 편은 그 위에 서는 첫 화면입니다.
'사업/기획, 디자이너, 개발자, 의료진 등 다양한 직군의 요구사항을 이해하고'. 확인 규칙은 간호·원무와 함께 채웁니다.
오늘 볼 환자마다 진료 전에 채워져야 할 것이 다 있는지 항목마다 가려 화면에 사유별로 묶어 보여줍니다. 진료과와 항목별 확인 규칙에 종류와 필수 여부, 동의서 유효 기간을 두고 예약 목록과 맞춰, 다 채웠으면 준비됨으로 넘기고 그렇지 않으면 동의서 만료·결과 대기·필수 누락·알레르기 미확인 중 어느 쪽인지 사유로 남깁니다. 규칙에 없는 항목은 미등록으로 남겨 봐야 하는지 먼저 정하게 합니다. 예약과 확인 항목은 실 진료 자료 대신 지원자가 공개된 의료 서식 목록으로 지어낸 것이며 실제 환자 정보를 쓰지 않습니다.
외래 진료를 준비하는 간호사입니다. 터미널을 쓰지 않고 아침마다 예약 목록을 열어 환자 기록을 하나씩 눌러 보며 동의서와 검사 결과를 확인하다가, 놓친 것을 의사가 진료실에서 발견해 되돌아오던 자리에 있습니다.
진료과와 항목마다 종류와 필수 여부, 유효 기간을 규칙으로 두고 예약 목록과 맞추면, 덜 준비된 환자가 진료 시작 전에 한 화면에 모이고 무엇이 모자란지가 근거로 남는다는 가정입니다. 규칙에 없는 항목은 미등록으로 빠지므로 아직 기준을 정하지 않은 서식이 그대로 드러납니다.
예약별 확인 항목과 진료과별 규칙을 넣으면 항목마다 준비됨·덜 됨을 판정하고, 덜 됐으면 동의서 만료·결과 대기·필수 누락·알레르기 미확인·항목 미등록 중 어느 쪽인지 붙여 사유별로 묶어 보여주는 화면이 도는 완결품입니다. 환자를 펼치면 걸린 규칙과 근거 값이 나옵니다.
공개 서식 목록으로 만든 확인 항목 900건에 손으로 붙인 정답 판정과 대조해 일치율을 내고, 미등록이 몰리는 항목을 모아 기준이 없는 서식을 목록으로 냅니다.
덜 준비된 항목을 담당 조직별로 갈라 오늘 처리할 목록을 내고, 진료 시각이 임박한 순서로 세워 먼저 볼 것을 앞에 두는 단계입니다.
간호사가 예약 항목과 규칙표를 넣으면 환자마다 준비 여부와 덜 된 사유가 사유별로 묶여 화면에 뜨는 과정을 시연합니다.
공개 서식 목록으로 지어낸 확인 항목 900건과 손으로 붙인 정답 판정을 대조해 일치율을 냅니다. 단, 정답과 항목을 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
값이 비었거나 항목 표기가 흔들리거나 규칙에 없는 항목이 섞인 입력 30종을 넣어도 화면이 안 깨지고 사유별로 빠지는 비율을 보여줍니다.
동의서 유효 기간을 바꿨을 때 옛 판정이 어떻게 뒤집히는지 회귀로 확인합니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 작성자가 지어낸 항목의 자가채점이며, 실제 되돌아오는 환자가 얼마나 줄었는지는 카카오헬스케어가 도입한 병원의 실 예약과 실 서식이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아니므로, 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 붙였으니 잘 맞는 게 당연하므로, 값 결측과 만료 직전 동의서, 규칙에 없는 서식을 일부러 섞어 쉬운 항목만 푸는 함정을 피합니다.
이 포트폴리오가 보여주는 것은 확인 규칙을 데이터로 두고 예약과 맞춰 덜 준비된 것을 가르는 기술이며, 무엇을 더 확인해야 하는지에 대한 의학적 판단은 주장하지도 하지도 않습니다. 판정은 값 유무와 날짜 비교가 하고 LLM 은 담당자가 읽을 사유 문장만 맡습니다.
값이 채워져 있다고 그 값이 맞다는 뜻은 아니어서, 판정에 기록 시각을 함께 실어 담당자가 오래된 값을 알아보게 둡니다.
실제 도입 때는 병원마다 서식과 유효 기간이 다르므로, 규칙표를 간호·원무와 함께 채우는 일을 도입 단계 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
오늘 예약별로 진료 전에 채워져야 할 확인 항목을 행으로 편 것입니다. 항목 번호와 예약 번호, 환자 키, 진료 시각, 진료과, 항목 이름, 값, 서명일, 기록 시각을 한 행에 둡니다. 항목 이름은 적는 화면에 따라 '시술 동의서'와 '시술동의서'처럼 흔들립니다. 값이 빈 행과 작년에 받은 동의서, 규칙표에 없는 항목을 일부러 섞어 두어 사유가 갈리게 둡니다. 모든 값은 지어낸 것이며 실제 환자 정보를 담지 않습니다.
| item_no | visit_no | patient_key | slot_at | dept_raw | item_raw | value_raw | signed_on | recorded_at |
|---|---|---|---|---|---|---|---|---|
| VI-001 | V-3001 | P-0912 | 2026-08-27T09:30:00 | 내과 | 진료 동의서 | 동의 | 2026-06-02 | 2026-06-02 |
| VI-002 | V-3001 | P-0912 | 2026-08-27T09:30:00 | 내과 | 신장 | 168 | — | 2026-08-20 |
| VI-003 | V-3001 | P-0912 | 2026-08-27T09:30:00 | 내과 | 알레르기 확인 | 없음 | — | 2026-08-20 |
| VI-004 | V-3002 | P-1130 | 2026-08-27T10:00:00 | 정형외과 | 시술 동의서 | 동의 | 2025-07-15 | 2025-07-15 |
| VI-005 | V-3002 | P-1130 | 2026-08-27T10:00:00 | 정형외과 | 시술동의서 | 동의 | 2026-08-10 | 2026-08-10 |
아래 JSON Schema 를 그대로 만족하는 확인 항목 행을 900개 더 만들어 주세요. 예약을 삼백 건 두고 예약마다 항목을 둘에서 넷까지 붙이며, 진료과를 내과·정형외과·소아과로 섞습니다. 항목 이름은 몇 행에서 띄어쓰기를 지워 흔들리게 두고, 2할은 값이나 기록 시각을 비웁니다. 동의서 항목 몇 행은 서명일을 1~2년 전으로 두세요. 규칙표에 없는 항목도 몇 행 넣습니다. 실제 사람의 정보를 쓰지 말고 판정 결과도 넣지 마세요.
{"type": "object", "properties": {"item_no": {"type": "string"}, "visit_no": {"type": "string"}, "patient_key": {"type": "string"}, "slot_at": {"type": "string"}, "dept_raw": {"type": "string"}, "item_raw": {"type": "string"}, "value_raw": {"type": ["string", "null"]}, "signed_on": {"type": ["string", "null"]}, "recorded_at": {"type": ["string", "null"]}}, "required": ["item_no", "visit_no", "patient_key", "slot_at", "dept_raw", "item_raw", "value_raw", "signed_on", "recorded_at"]}{"type": "object", "properties": {"item_no": {"type": "string"}, "visit_no": {"type": "string"}, "patient_key": {"type": "string"}, "slot_at": {"type": "string"}, "dept_raw": {"type": "string"}, "item_raw": {"type": "string"}, "value_raw": {"type": ["string", "null"]}, "signed_on": {"type": ["string", "null"]}, "recorded_at": {"type": ["string", "null"]}}, "required": ["item_no", "visit_no", "patient_key", "slot_at", "dept_raw", "item_raw", "value_raw", "signed_on", "recorded_at"]}진료과·항목별 확인 규칙표입니다. 규칙 번호와 진료과, 항목 이름, 종류, 필수 여부, 동의서 유효 기간, 담당을 한 행에 둡니다. 종류마다 보는 것이 달라 동의서는 서명일을, 검사는 결과 유무를, 입력 항목은 값 유무를 봅니다. 같은 항목이라도 진료과가 다르면 필수 여부가 갈립니다. 예약에 나오는 항목 중 일부는 일부러 넣지 않아 미등록이 도출되게 둡니다.
| rule_no | dept_raw | item_raw | kind_raw | required_flag | valid_days | owner_name |
|---|---|---|---|---|---|---|
| PR-01 | 내과 | 진료 동의서 | consent | true | 365 | 원무 |
| PR-02 | 정형외과 | 시술 동의서 | consent | true | 180 | 원무 |
| PR-03 | 내과 | 혈액 검사 | result | true | — | 진단검사 |
| PR-04 | 정형외과 | 영상 검사 | result | true | — | 영상의학 |
| PR-05 | 내과 | 알레르기 확인 | allergy | true | — | 간호 |
아래 JSON Schema 를 그대로 만족하는 확인 규칙 행을 30개 더 만들어 주세요. 진료과를 서넛 두고 종류를 동의서·검사 결과·입력 항목·알레르기 확인으로 섞습니다. 동의서에만 유효 기간을 90일에서 365일 사이로 두고 나머지는 비웁니다. 같은 항목이라도 진료과에 따라 필수 여부를 다르게 두세요. 예약에 나오는 항목 중 일부는 일부러 넣지 마세요 — 미등록이 있어야 기준이 없는 서식이 드러납니다. 판정 결과는 넣지 마세요.
{"type": "object", "properties": {"rule_no": {"type": "string"}, "dept_raw": {"type": "string"}, "item_raw": {"type": "string"}, "kind_raw": {"type": "string", "enum": ["consent", "result", "input", "allergy"]}, "required_flag": {"type": "boolean"}, "valid_days": {"type": ["integer", "null"]}, "owner_name": {"type": "string"}}, "required": ["rule_no", "dept_raw", "item_raw", "kind_raw", "required_flag", "valid_days", "owner_name"]}{"type": "object", "properties": {"rule_no": {"type": "string"}, "dept_raw": {"type": "string"}, "item_raw": {"type": "string"}, "kind_raw": {"type": "string", "enum": ["consent", "result", "input", "allergy"]}, "required_flag": {"type": "boolean"}, "valid_days": {"type": ["integer", "null"]}, "owner_name": {"type": "string"}}, "required": ["rule_no", "dept_raw", "item_raw", "kind_raw", "required_flag", "valid_days", "owner_name"]}| TypeScript | 예약 항목과 확인 규칙을 맞춰 종류와 유효 기간을 견주는 판정기를 맡습니다. |
| React | 사유별로 묶은 환자 카드와 근거 값을 보여주는 화면을 맡습니다. |
| Next.js | 간호사가 아침에 여는 관리자 페이지를 맡습니다. |
| PostgreSQL | 예약 항목과 확인 규칙, 판정 결과를 담습니다. |
✗ fail → 미등록이 절반을 넘으면 규칙표를 먼저 채웁니다.
✓ pass → 2주차 정답 대조로 넘어갑니다.
✗ fail → 어긋난 항목을 모아 종류 구분과 유효 기간을 다시 봅니다.
✓ pass → 3주차 담당별 목록으로 넘어갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
prep_code사유 라벨 · item_no + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
consent_expired동의서 만료result_pending결과 대기required_missing필수 누락allergy_unconfirmed알레르기 미확인item_unregistered항목 미등록ready준비됨확인 항목 하나와 규칙이 만나는 자리마다 진료 전에 채워졌는지 정합니다. 덜 됐으면 동의서 만료·결과 대기·필수 누락·알레르기 미확인·항목 미등록 중 어느 쪽인지 싣습니다. 화면은 이 사유 코드로 묶습니다.
{"type": "object", "properties": {"check_no": {"type": "string"}, "item_no": {"type": "string"}, "visit_no": {"type": "string"}, "item_raw": {"type": "string"}, "rule_no": {"type": ["string", "null"]}, "prep_code": {"type": "string", "enum": ["ready", "consent_expired", "result_pending", "required_missing", "allergy_unconfirmed", "item_unregistered"]}, "days_since_signed": {"type": ["integer", "null"], "description": "slot_at 에서 signed_on 을 뺀 날수입니다. 서명일이 있는 항목에만 채웁니다."}, "valid_days": {"type": ["integer", "null"]}, "owner_name": {"type": ["string", "null"]}, "evidence": {"type": "array", "items": {"type": "object", "properties": {"field": {"type": "string"}, "agg": {"type": ["string", "null"]}, "value": {}}, "required": ["field", "value"]}}, "summary": {"type": "string"}, "hedge": {"type": ["string", "null"]}}, "required": ["check_no", "item_no", "visit_no", "item_raw", "prep_code", "evidence", "summary"]}[
{
"check_no": "PC-001",
"item_no": "VI-001",
"visit_no": "V-3001",
"item_raw": "진료 동의서",
"rule_no": "PR-01",
"prep_code": "ready",
"days_since_signed": 86,
"valid_days": 365,
"owner_name": "원무",
"evidence": [
{
"field": "signed_on",
"agg": null,
"value": "2026-06-02"
},
{
"field": "valid_days",
"agg": null,
"value": 365
}
],
"summary": "동의서를 받은 지 86일이라 유효 기간 안입니다.",
"hedge": null
},
{
"check_no": "PC-002",
"item_no": "VI-005",
"visit_no": "V-3002",
"item_raw": "시술동의서",
"rule_no": "PR-02",
"prep_code": "ready",
"days_since_signed": 17,
"valid_days": 180,
"owner_name": "원무",
"evidence": [
{
"field": "item_raw",
"agg": null,
"value": "시술동의서"
},
{
"field": "signed_on",
"agg": null,
"value": "2026-08-10"
}
],
"summary": "항목을 띄어쓰기 없이 적어 두었으나 접으면 같은 항목이고 기간도 안입니다.",
"hedge": null
},
{
"check_no": "PC-003",
"item_no": "VI-004",
"visit_no": "V-3002",
"item_raw": "시술 동의서",
"rule_no": "PR-02",
"prep_code": "consent_expired",
"days_since_signed": 408,
"valid_days": 180,
"owner_name": "원무",
"evidence": [
{
"field": "signed_on",
"agg": null,
"value": "2025-07-15"
},
{
"field": "valid_days",
"agg": null,
"value": 180
}
],
"summary": "작년에 받은 동의서라 유효 180일을 훌쩍 넘겨 다시 받아야 합니다.",
"hedge": "같은 환자에게 최근 동의서가 따로 있어 담당자가 어느 쪽을 쓸지 봅니다."
},
{
"check_no": "PC-004",
"item_no": "VI-006",
"visit_no": "V-3003",
"item_raw": "혈액 검사",
"rule_no": "PR-03",
"prep_code": "result_pending",
"days_since_signed": null,
"valid_days": null,
"owner_name": "진단검사",
"evidence": [
{
"field": "value_raw",
"agg": null,
"value": null
},
{
"field": "kind_raw",
"agg": null,
"value": "result"
}
],
"summary": "어제 낸 검사 결과가 아직 안 올라와 진료 전에 확인이 필요합니다.",
"hedge": null
},
{
"check_no": "PC-005",
"item_no": "VI-008",
"visit_no": "V-3004",
"item_raw": "체중",
"rule_no": "PR-06",
"prep_code": "required_missing",
"days_since_signed": null,
"valid_days": null,
"owner_name": "간호",
"evidence": [
{
"field": "value_raw",
"agg": null,
"value": null
},
{
"field": "required_flag",
"agg": null,
"value": true
}
],
"summary": "소아과는 체중이 있어야 용량을 정할 수 있는데 비어 있습니다.",
"hedge": null
},
{
"check_no": "PC-006",
"item_no": "VI-010",
"visit_no": "V-3005",
"item_raw": "알레르기 확인",
"rule_no": "PR-05",
"prep_code": "allergy_unconfirmed",
"days_since_signed": null,
"valid_days": null,
"owner_name": "간호",
"evidence": [
{
"field": "value_raw",
"agg": null,
"value": null
},
{
"field": "kind_raw",
"agg": null,
"value": "allergy"
}
],
"summary": "알레르기 확인 표시가 안 남아 진료 전에 물어봐야 합니다.",
"hedge": null
},
{
"check_no": "PC-007",
"item_no": "VI-011",
"visit_no": "V-3005",
"item_raw": "보호자 연락처",
"rule_no": null,
"prep_code": "item_unregistered",
"days_since_signed": null,
"valid_days": null,
"owner_name": null,
"evidence": [
{
"field": "item_raw",
"agg": null,
"value": "보호자 연락처"
},
{
"field": "rule_no",
"agg": "count",
"value": 12
}
],
"summary": "확인 규칙 열두 행에 없는 항목이라 봐야 하는지 정해 두지 않았습니다.",
"hedge": null
},
{
"check_no": "PC-008",
"item_no": "VI-012",
"visit_no": "V-3006",
"item_raw": "영상 검사",
"rule_no": "PR-04",
"prep_code": "ready",
"days_since_signed": null,
"valid_days": null,
"owner_name": "영상의학",
"evidence": [
{
"field": "value_raw",
"agg": null,
"value": "판독 완료"
},
{
"field": "kind_raw",
"agg": null,
"value": "result"
}
],
"summary": "판독까지 끝나 진료실에서 바로 볼 수 있습니다.",
"hedge": null
}
][자동 검증 · 코드가 판정합니다] 1. prep_code 가 enum 여섯 값 중 하나인지 확인합니다. 2. check_no·item_no·visit_no·item_raw·prep_code·evidence·summary 가 모두 채워졌는지 확인합니다. 3. item_no 가 확인 항목에 실재하는 번호인지 대조합니다. 4. rule_no 가 있으면 규칙표에 실재하는 행 번호인지 대조합니다. 5. rule_no 가 있으면 valid_days·owner_name 이 그 규칙 행의 값과 같은지 대조합니다. 6. dept_raw 와 item_raw 를 띄어쓰기를 접어 규칙표와 맞추고, 맞는 행이 없으면 prep_code 가 item_unregistered 인지 확인합니다. 7. days_since_signed 를 slot_at 에서 signed_on 을 빼 날수로 다시 계산합니다. 8. kind_raw 가 consent 이고 signed_on 이 비었거나 days_since_signed 가 valid_days 를 넘으면 prep_code 가 consent_expired 인지 다시 계산합니다. 9. kind_raw 가 result 이고 value_raw 가 비었으면 prep_code 가 result_pending 인지 확인합니다. 10. kind_raw 가 allergy 이고 value_raw 가 비었으면 prep_code 가 allergy_unconfirmed 인지 확인합니다. 11. kind_raw 가 input 이고 required_flag 가 참인데 value_raw 가 비었으면 prep_code 가 required_missing 인지 확인합니다. 12. prep_code 가 ready 이면 그 종류의 검사를 모두 통과하는지 다시 확인합니다. 13. evidence 의 field 이름이 확인 항목과 규칙표에 실재하는 컬럼인지 대조합니다. 14. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행 값과 같은지 확인합니다. 15. summary 에 의학적 판단이나 처치 권고가 들어 있지 않은지 확인합니다. 16. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 공개 서식 목록으로 지어낸 확인 항목 900건에 손으로 붙인 정답 판정과 대조해 일치율과 사유 코드별 분포를 내고, 미등록이 몰리는 항목을 목록으로 냅니다. [수동 검증 · 사람이 봅니다] 1. 규칙에 없는 서식을 확인 대상으로 올릴지 간호·원무가 정합니다. 2. 만료된 동의서를 다시 받을지 미룰지 담당자가 정합니다.