Shioaji Pro
為 agent 交易鋪路:交易終端全程由 coding agent 打造,介面 100% 開源、桌面版內建 AI Agent 與全套專業下單面板 — 這個終端就是能力證明。
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Next.js 16.3.1 App Router 기반 보험 계산기 사이트 (보험계산기.kr).
최종 갱신: 2026-10-15 · 상태: 2~5세대 계산기 공개, 2·3·4·5세대 다회 청구 지원
입력한 값으로만 계산하는 참고용 도구입니다. 추정 상수를 넣지 않고, 근거가 확인되지 않은 값은 계산하지 않습니다 — HOLD 원칙 참조.
npm install
npm run dev # 개발 서버
npm run build # 프로덕션 빌드
npm run start # 프로덕션 실행
npm run lint # ESLint
npm run test:all # tests/*.test.ts 전체 (글롭 자동 탐색)
npm run test:insurance # 실손 엔진 관련 테스트만
npm run test:coverage # 커버리지 (하한 강제 — 아래 표 참고)
npx tsc --noEmit # 타입 검사
CI(GitHub Actions)는 Node.js 22에서 npm ci → test:coverage → build 순으로 실행합니다.
test:coverage가 tests/*.test.ts를 자동 탐색해 전체 테스트를 실행하며 타입 검사는 Next.js 빌드
단계에서도 수행됩니다. 린트는 로컬 검증 명령으로 별도 제공합니다.
측정 대상은 src/lib/insurance/** 뿐이며, 하한은 --check-coverage로 강제됩니다.
아래를 밑돌면 CI가 실패하므로, 그때그때의 실측 퍼센트는 README에 적지 않습니다.
현재 수치는 npm run test:coverage 출력이나 CI 로그에서 확인하세요.
| 지표 | 하한 |
|---|---|
| lines | 99% |
| statements | 99% |
| functions | 90% |
| branches | 80% |
범위와 제외는 .c8rc.json에 있습니다.
include: ["src/lib/insurance/**"] — --src는 --all이 훑을 디렉터리만 제한할 뿐,
테스트 실행 중 로드된 바깥 파일(scripts/run-tests.mjs, src/lib/site.ts 등)까지 막지 못합니다.
그대로 두면 보험 코드와 무관한 파일의 변화가 하한을 흔듭니다.exclude — istanbul 기본 제외 목록(tests/, **/*.d.ts, 각종 설정 파일)을 그대로 옮겨 적고
src/lib/insurance/engine/types.ts 한 줄만 더합니다. c8에서 exclude를 지정하면 기본 목록이
병합이 아니라 대체되기 때문입니다. types.ts는 타입 선언만 있어 컴파일 산출물에 실행 코드가
없는 타입 전용 파일이고, 로드되지 않는 218줄이 전체 수치를 9%p 넘게 끌어내려 하한 여유를
갉아먹고 있었습니다.tests/coverageConfig.test.ts가 이를 자동으로 지킵니다. 기본 제외 목록은 @istanbuljs/schema
원본과 대조하고, types.ts는 TypeScript API로 실제 변환해 산출물이 비어 있는지 확인하며
(정규식은 부작용 import·런타임 re-export·namespace를 놓칩니다), c8를 한 번 더 돌려 실제 보고서의
파일 목록이 보험 디렉터리만 담고 있는지 검사합니다.
| 세대 | 가입 시기 | 계산기 | 근거 |
|---|---|---|---|
| 1세대 | ~2009.9 | ❌ 제공하지 않음 | 실손 표준약관 제정 이전이라 인용 가능한 1차 근거가 없습니다. 증권·개별 약관 확인 안내만 제공합니다 |
| 2세대 (표준화 실손) | 2009.10~2017.3 | /2nd-3rd-generation-health-insurance-calculator | 보험업감독업무시행세칙 [별표 15] 표준약관 (2010.3.29 / 2012.12.28 연혁본) |
| 3세대 (착한실손) | 2017.4~2021.6 | 위와 동일 | 같은 별표15 (2017.3.22 연혁본) |
| 4세대 | 2021.7~2026.4 | /health-insurance-calculator | 금융감독원 시행세칙 별표15 2021.7.1 연혁본 |
| 5세대 | 2026.5~ | /5th-generation-health-insurance-calculator | 금융감독원 시행세칙 별표15 2026.5.6 연혁본 |
5세대 계산 범위 — 일반 비급여만. 별표15 특별약관1·2는 비급여를 보장종목 3종으로 나눕니다. 특약1(중증)은 (1)상해비급여 / (2)질병비급여 / (3)3대비급여(근골격계 이학요법·체외충격파, 주사료, MRI), 특약2(비중증)는 (1)(2)와 (3)비급여 자기공명영상진단입니다. 원문이 "비급여의료비(3대비급여는 제외합니다)"(특약1 제3조 (2)①)와 "비급여의료비(비급여 자기공명영상진단은 제외합니다)"(특약2 제3조 (1)①)로 서로를 명시적으로 배제하고, 상급병실료 차액도 입원 보상 대상에서 제외되어 별도 산식(병실료의 50%, 1일 평균 10만 원 한도)을 갖습니다. 이 네 항목은 (1)(2) 산식으로 계산하면 틀리므로, 비급여 입력에 치료유형 축을 둡니다. 치료유형은 기본값이 없습니다 — 명시적으로 고르기 전에는 계산하지 않습니다.
여러 건 합산 계산은 (3) 보장종목을 별도 산식으로 계산합니다. 중증 근골격계 이학요법· 체외충격파(3만·30% / 350만·50회), 중증 일반 주사료(3만·30% / 250만·50회), 중증 MRI (3만·30% / 300만), 비중증 MRI(5만·50% / 200만)이며, 한도는 상해·질병을 합산합니다. 정정(2026-10-14): 비중증 근골격계·체외충격파는 면책입니다. 비중증 주사료는 용도를 선택하기 전에는 보류하고, 일반 주사는 면책, 항암제·항생제·희귀의약품 예외는 일반 비급여 산식으로 계산합니다(특약2 제4조 (1)③15
17, p.299 / (2)③1618, p.302). 특약1 제3조(3)②(p.265)는 항생제에 항진균제 포함을 명시하지만 특약2 해당 조항에는 그 문구가 없어 목록·출처·화면 용도 상태를 분리합니다. 예외가 다른 면책까지 해제하지 않습니다. 단건·다회·일반 전환 엔진과 화면이routeOfGen2026Item판정을 공유합니다. 면책은EXCLUDED와 null 금액으로 반환하고 0원 결과 카드로 표시하지 않습니다. 중증 3대비급여· MRI·상급병실료의 단건 미지원은 여러 건 합산 계산으로 안내합니다.상급병실료 차액은 여러 건 합산 계산의 전용 폼으로 계산합니다. 보험금은 차액의 50%, 그 보험금에 1일 평균 10만 원 한도가 걸립니다(1일 평균 = 총 보험금 ÷ 총 입원일수). 이 순서를 뒤집으면 지급액이 최대 2배 달라지므로, 원문 문언만으로 단정하지 않고 동일 문언을 해석한 보험사 공식 안내의 계산 예시로 순서를 확인했습니다(보조 근거이며 5세대 원문 자체가 아닙니다). 상급병실료 차액은 (3) 보장종목이 아니라 (1)(2) 표 안의 행이므로 원인(상해·질병)과 질환 구분 (중증·비중증)이 필요하고, 연간 보험가입금액과 기존 지급보험금을 일반 (1)(2)와 공유합니다. 반대로 통원 한도·3대비급여 한도·통원 공제금액은 적용되지 않고, 약관이 입원 보상금액을 "비급여 의료비(비급여 병실료는 제외합니다)"로 규정하므로 일반 입원 의료비와 입력을 합치면 안 됩니다. 총 입원일수는 사용자가 직접 입력합니다 — 약관에 일수 산정 방법이 없어 계산기가 추정하지 않습니다. 중증 입원 공제금액 상한 500만 원이 상급병실료 차액에도 누적되는지는 근거를 찾지 못해 적용하지 않았고, 180일 계속 입원 규정과 함께 HOLD입니다 — 해제 조건은
docs/insurance/audit-status.md에 있습니다.
5세대의 연간 한도와 중증 입원 공제금액 상한 500만 원은 약관상 계약일 또는 매년 계약해당일부터 1년 단위로 누적됩니다(역년 아님). 500만 원 상한에 누적되는 것은 특별약관1 제5조⑤가 정한 공제금액이며, 보험가입금액 한도로 추가 부담한 금액은 포함되지 않습니다. 통원 가입금액(20만 원)과 연간 보험가입금액(중증 5천만·비중증 1천만 원)은 약관이 모두 그 금액 이내에서 계약 시 정한 금액으로 규정하므로 증권의 값을 입력한 경우에만 적용합니다. 연간 보험가입금액은 상해비급여·질병비급여 각 축에 대해 따로 정해지므로, 한 번의 계산에는 같은 원인 축의 청구만 넣습니다. 0원·음수는 미입력으로 처리합니다.
같은 날 통원의 합산은 중증과 비중증의 조건이 다릅니다.
통원 1일당(외래 및 처방·조제비 합산)이므로 같은 날은 합산합니다.5세대 비급여 통원의 연간 한도는 중증과 비중증이 단위부터 다릅니다. 중증은 특별약관1이
"매년 계약해당일부터 1년간 통원 100회"로 정하고, 비중증은 특별약관2가 "매년 계약해당일부터
1년간 통원 100일"로 정합니다(제5조④도 각각 '보상한 횟수'와 '보상한 일수'로 규정). 여러 건
합산 계산은 두 한도를 별개의 카운터·상수·입력으로 다루며, 반대편 카운터를 넘기면 계산하지
않습니다. 이미 사용한 횟수·일수는 입력하기 전에는 계산하지 않습니다 — 모르는 값을 0으로
추정하면 한도가 통째로 사라져 보험금이 실제보다 많게 표시됩니다. 사용한 통원이 없으면 0을
직접 입력하시면 되고, 음수·소수·문자 같은 값은 고쳐서 계산하지 않고 그대로 막습니다.
100을 넘는 값은 유효한 과거 상태로 그대로 받습니다. 비중증은 보상 단위가 '통원 1일당(외래 및 처방·조제비 합산)'이므로 같은 날 청구는 한
행으로 합쳐 입력해야 일수가 실제보다 빨리 소진되지 않습니다.
진료비는 있으나 지급 보험금이 0원인 통원이 그 한도를 소진하는지는 약관에 판단 문언이
없습니다(표는 '통원 100회'·'통원 100일'이라 통원 자체를, 제5조④는 '보상한 횟수'·'보상한 일수'라
보상된 건을 가리키는 것으로 읽힙니다). 계산기는 한쪽으로 단정하지 않고 두 해석을 모두 계산해
결과가 갈릴 때만 묶음 전체를 미계산으로 막습니다. 결과가 같으면 정상 계산합니다. 중증 100회와
비중증 100일에 같은 방식을 쓰고, 같은 성격의 문제가 있는 3대비급여 횟수도 같은 방식으로 막습니다.
세 규칙을 하나로 합치지는 않았습니다 — 원문 표현이 각각 '통원 100회'·'통원 100일'·'보상한
횟수'로 다르고 카운터의 단위도 회와 일로 갈리므로, 근거·상수·카운터·안내 문구를 모두 분리해
둡니다. 해제 조건은 docs/insurance/audit-status.md에 있습니다.
5세대 비급여 입원은 의료기관 종별이 결과를 바꿉니다. 중증은 상급종합·종합병원에만 공제금액 상한 500만 원(특별약관1 제5조⑤)이 적용되고, 비중증은 반대로 병·의원급에만 1회당 300만 원 한도가 적용됩니다(특별약관2 제3조 (1)①·(2)① — 「의료법」 제3조제2항 의료기관 중 종합병원 제외). 종별을 고르기 전에는 계산하지 않습니다.
2·3세대는 표준형/선택형에 따라 자기부담률과 통원 공제 방식이 다릅니다. 계약일로 추정하지 않고 사용자가 증권을 보고 선택합니다. 미선택 시 계산하지 않습니다.
2·3세대 계산기는 방문별 행, 연간 외래 180회·처방전 180건, 입원 자기부담 연간 200만 원
상한을 반영합니다. 외래 횟수와 처방전 건수는 별개 한도라 입력도 따로 받으며, 해당하는
통원 행이 있으면 입력하기 전에는 계산하지 않습니다 — 모르는 값을 0으로 추정하면 한도가
통째로 사라져 보험금이 실제보다 많게 표시됩니다. 이전 이용이 없으면 0을 직접 입력하시면
되고, 음수·소수·문자 같은 값은 고쳐서 계산하지 않고 그대로 막습니다. 180을 넘는 값은 유효한
과거 상태로 그대로 받습니다. 입원만 있는 청구에는 두 입력을 묻지 않습니다. 4세대는 동일한 보장축의 청구를 묶어 회당 20만 원, 비급여 통원 100회,
증권상 연간 가입금액, 3대비급여의 항목별 금액·횟수 한도를 반영합니다. 계약마다 다른 가입금액은
증권에서 확인한 값을 입력한 경우에만 적용합니다. 4세대의 이미 사용한 횟수는 세 축이 따로
있습니다 — 비급여 통원 100회, 도수치료·체외충격파·증식치료 50회, 비급여 주사료 50회입니다.
비급여 MRI·MRA는 금액 한도만 있고 횟수 한도가 없어 묻지 않습니다. 세 축 모두 입력하기
전에는 계산하지 않습니다 — 모르는 값을 0으로 추정하면 한도가 통째로 사라져 보험금이 실제보다
많게 표시됩니다. 받은 치료가 없으면 0을 직접 입력하시면 되고, 음수·소수·문자 같은 값은
고쳐서 계산하지 않고 그대로 막습니다. 한도를 넘는 값은 유효한 과거 상태로 그대로 받습니다. 5세대는 회당·일당 한도와 비급여 연간 보험금
한도, 상급종합·종합병원 중증 입원 공제금액 500만 원 상한을 건 사이에 누적합니다. 500만 원
상한에는 각 건의 공제금액(deductibleApplied)만 누적하며, 최종 자기부담금(ownPay)을
누적하지 않습니다. 별도 보장종목(3대비급여·비중증 MRI)은 항목별 금액·횟수 한도를 행위 단위로
누적하며, 500만 원 공제 상한은 MRI 입원에만 적용됩니다(제5조⑤ 괄호가 근골격계·주사료를 제외).
근골격계는 최초 10회 이후 10회 단위 보상 승인이 필요한데 계산기가 증상 개선을 판정하지 않으므로,
승인 회차가 부족하면 행을 제외하지 않고 묶음 전체를 계산하지 않습니다.
현재 main 기준입니다. 커밋 해시는 배포 이력으로 관리하고 README에는 고정하지 않습니다.
| 항목 | 결과 |
|---|---|
| 전체 테스트 | 21개 파일 통과 |
| 2·3세대 다회 청구 | 합계 정합·단건 정합·연간 횟수·입원 상한 누적·1024케이스 불변식 검증 |
| 4세대 다회 청구 | 회당 20만원·비급여 100회·연간 가입금액·3대비급여 항목별 금액/횟수 한도 검증 |
| 5세대 비급여 치료유형 | 치료유형 미선택 차단, 단건은 별도 보장종목 4종 계속 차단, 급여는 요구하지 않음, 일반 비급여 기준 결과 고정 |
| 5세대 별도 보장종목 | 공제 경계(3만·30% / 5만·50%), 항목별 금액·횟수 한도, 근골격계 승인 회차 9·10·11 및 10·20, 49·50·51회, MRI 입원 500만 공제 pool 경계, 라우팅 10종, 일반 경로 전환 결과 동일성 |
| 커버리지 측정 설정 | 실제 보고서 파일 목록이 보험 디렉터리 한정임을 재실행으로 검사, istanbul 기본 제외 목록 보존, 타입 전용 여부를 컴파일 산출물로 판정, 하한 하향 방지 |
| 5세대 다회 청구 | 상해·질병 보장축 분리, 계약자 선택 통원·연간 가입금액, 중증 통원 연간 100회와 비중증 통원 연간 100일(단위가 다른 별개 한도), 자기부담 상한 누적, 급여 통원 입력 게이트 검증 |
| 커버리지 | 설정 하한(lines·statements 99% / functions 90% / branches 80%) 통과 — 실측은 CI 로그 참조 |
| 프로덕션 빌드 | 45개 라우트 생성 통과 |
| 화면 확인 | 4세대 다회 청구 입력·결과 UI 로컬 확인 |
계산기
/health-insurance-calculator 실손보험(4세대) 자기부담금 계산기/2nd-3rd-generation-health-insurance-calculator 2·3세대 실손보험 자기부담금 계산기/5th-generation-health-insurance-calculator 5세대 실손보험 자기부담금 계산기/surrender-value-calculator 해지환급금 계산기/future-premium-calculator 앞으로 낼 보험료 계산기/cancel-vs-keep-calculator 보험 해지 vs 유지 계산기/coverage-gap-calculator 보장 공백 계산기/death-coverage-calculator 사망보장 계산기/family-living-calculator 유족 생활비 계산기/insurance-premium-calculator 보험료 비중 계산기/car-insurance-calculator 자동차보험 견적 비교 계산기허브 · 가이드 · 정책
/ 홈 · /silson-guide 실손보험 허브 · /protection-planning 보장설계 허브 · /insurance-cancellation 해지 허브/guide, /guide/[slug] 가이드/about · /privacy · /terms · /disclaimer이 저장소는 규제 상수를 코드에 직접 적지 않습니다.
src/lib/insurance/engine/regulatoryRules.ts에 문서명·발행기관·시행일·
URL·조항 위치와 함께 등록합니다.constants.ts는 그 레지스트리에서 값을 파생합니다. 상수를 직접 쓰지 않습니다.tests/regulatoryRules.test.ts가 출처 없는 상수를 거부합니다.status: "PENDING_UNVERIFIED"를 반환합니다.tests/uiCopy.test.ts가 양방향으로 가드합니다. 모든 계산기의
결과·보류·면책 상태를 하위 컴포넌트까지 렌더해 안내와 접근성 라벨의 내부 식별자 노출을
검사합니다. 동적 문구의 을/를 하드코딩도 금지하며 common/korean.ts의 objectParticle을 씁니다.common/settle.ts에서 종결되며 본인부담금 + 보험적용금액 === 진료비
불변식이 전 경로 테스트로 고정되어 있습니다.현재 남은 HOLD 항목은 docs/insurance/audit-status.md §3에 있습니다.
누적금액 입력은 미입력과 명시적 0을 구분합니다. 2·3세대 입원의 기존 자기부담금, 4세대 다회의 기존 지급보험금, 5세대 다회의 기존 지급보험금·누적 공제금액은 활성 경로에서 필수이며, 이력이 없으면 0을 직접 입력해야 합니다. 다른 경로의 숨은 입력은 현재 계산을 막지 않습니다. 4세대 단건은 연간 한도를 계산에 반영하지 않는 범위를 결과에 안내합니다.
2·3·4·5세대 실손 진료비는 예시 금액을 실제 값으로 미리 채우지 않습니다. 단건·청구 행·빠른 채우기 금액 모두 빈칸으로 시작하며, 누락된 행이 있으면 유효한 행만 합산하지 않고 계산을 보류합니다. 복사할 횟수의 기본값 3은 계산 대상 금액이 아닌 도구 설정입니다.
src/lib/insurance/
common/ settle.ts(금액 종결·반올림 정책) · number.ts · time.ts
engine/ 규정 기반 실손 계산 — regulatoryRules.ts(출처 레지스트리) · constants.ts
generationStandardized.ts(2·3세대) · generation2021.ts(4세대) · generation2026.ts(5세대)
feature/ HOLD 스텁 (제외항목·할인할증·임신출산·발달장애) — 값을 반환하지 않는다
decision/ 사용자 입력 기반 의사결정 산수 8종
src/components/calculators/ 계산기 UI (산식 없음 — 도메인 함수 호출만)
tests/ run-tests.mjs가 글롭으로 자동 탐색
docs/insurance/ 개발 문서 (아래 색인)
기준 주소는 src/lib/site.ts의 SITE.url 한 곳에서 관리하며 퓨니코드 ASCII origin을 사용합니다.
사람에게 보여주는 한글 주소는 SITE.displayUrl로 구분하고, 두 주소의 정규화한 origin이 같은지
빌드와 회귀 검사에서 확인합니다. 페이지 이동에는 상대경로를 사용합니다.
검색·공유 메타정보는 metadataBase와 Next.js 기본 처리를 사용합니다.
공유 이미지 원본은 src/app/opengraph-image.png이며 같은 공개 경로에서 제공됩니다.
페이지가 openGraph를 정의할 때는 src/lib/metadata.ts의 socialMetadata()로 이미지와
기본 속성을 함께 넣습니다. Twitter에도 이미지와 summary_large_image 카드를 명시합니다.
npm run build는 빌드 뒤 scripts/check-site-urls.ts를 실행합니다. canonical·Open Graph·
사이트맵·robots·JSON-LD의 url/@id를 실제 생성 결과에서 모아 URL 파서로 정규화한 뒤,
기준 origin과 대조합니다. canonical은 사이트맵의 해당 페이지 경로까지 일치해야 하며,
사이트맵의 공개 페이지마다 og:image·twitter:image와 summary_large_image 카드가
필수이며, 이미지 URL도 기준 origin의 절대 URL이어야 합니다.
한글/퓨니코드 표기 자체는 실패 조건이 아닙니다.
호스트나 Origin을 비교하는 코드를 추가할 때는 동일한 방식으로 정규화한 값을 비교합니다. 한글 문자열 리터럴과 요청 호스트를 직접 비교하지 않으며, 헤더·호스트 매칭 설정에는 ASCII 정본을 사용합니다. 현재 이 저장소에는 별도 호스트 비교·CORS·미들웨어 설정이 없습니다.
docs/insurance/audit-status.md — 감사 상태 기록, 설계 원칙, 남은 HOLDdocs/insurance/insurance-gen123-engine-design.md — 1~3세대 엔진 근거 조사·구현 설계docs/insurance/multi-claim-design.md — 다회 청구 설계(방문별 행, 연간 횟수 한도, 자기부담 상한 누적)docs/insurance/stack-upgrade-log.md — 스택 업그레이드 기록feature/ HOLD 4종은 근거가 없어서가 아니라 판정 입력축이 없거나(발달장애·임신출산·비중증 제외항목)
공통 규정에 계산 수치가 없어서(비급여 보험료 할인·할증) 막혀 있습니다. 출처는
engine/regulatoryRules.ts에 HOLD/value: null로 등록돼 있고, 항목별 해제 조건은
docs/insurance/audit-status.md §3.2에 있습니다.세부 범위와 보류 이유는 docs/insurance/multi-claim-design.md
§4와 docs/insurance/audit-status.md에서 관리합니다.
sitemap.ts + robots.ts + JSON-LD(WebApplication)