수정 이력(7건, 최종 수정 2026년 09월 15일)
이 글에 적용한 변경 사항의 기록입니다. 보관해 둔 수정 전 버전은 DOI가 부여된 고정 URL에서 읽을 수 있습니다.
- front matter의 locale을 ja에서 ko로 바로잡아 이 글이 일본어 블로그 목록이 아니라 한국어 블로그 목록에 실리도록 했습니다. 본문은 바꾸지 않았습니다.
- 관련 기사 링크를 한국어 permalink에 맞추는 등 CI가 지적한 표시용 수정을 반영했습니다. 본문의 기술적인 주장은 바꾸지 않았습니다.
- permalink·저자 표기·지식 맵 래퍼·깨진 내부 링크 등 CI가 지적한 표시용 수정을 반영했습니다. 본문의 기술적인 주장은 바꾸지 않았습니다.
- 기사 서두에 「이 기사의 지식 맵」 절을 추가했습니다. 본문에서 다루는 개념과 그 관계를 요약·그림·상세 페이지 링크로 정리한 것입니다. 본문의 주장은 바꾸지 않았습니다.
- 외부 리뷰(1283건)에 대응해 본문을 갱신했습니다. 개별 변경 내용은 이 아래의 이력을 참조하세요.
- `IsValidInsurerNumber`가 끝자리가 아닌 자리에 숫자가 아닌 문자가 섞인 입력에 대해 `false`가 아니라 `ArgumentException`을 던지고 있었습니다. 검사하던 것이 끝 1자리뿐이었고, 나머지는 그대로 `CheckDigit`에 넘기고 있었기 때문입니다. OCR이나 바코드, 수기 입력을 통과시키는 이상 여기서는 `bool`로 끝까지 반환해야 하므로, 전체 자리를 먼저 검사하도록 바꿨습니다.
- 서두에 대상 독자와 용어 표를 추가해, 레세프트 청구 실무 지식이 없어도 읽을 수 있게 했습니다. check digit 계산을 C#으로도 보이고(4자리 구 정관을 대상 외로 두는 판정을 포함합니다), Luhn 알고리즘과의 관계를 「9를 빼는 것」과 「2자리를 나눠 더하는 것」이 동치인 이유까지 설명했습니다. 손계산 예는 표로 다시 짰습니다.
- 최초 공개
이 글을 인용하기(DOI(등록된 아카이브): 10.5281/zenodo.22174849)
아래 DOI는 이전에 등록된 아카이브를 가리키며 현재 본문과 다를 수 있습니다. 현재 본문을 참조할 때는 이 페이지의 URL을 사용하세요.
Go Komura (2026). 「보험자번호 8자리는 무엇을 말하나 ── 법별번호·도도부현번호·검증번호를 레세콘 구현에서 읽다」. 합동회사 코무라소프트. https://comcomponent.com/ko/blog/insurer-number-structure/
- DOI(등록된 아카이브)
- 10.5281/zenodo.22174849
- DOI(마지막 등록 버전)
- 10.5281/zenodo.22174850
보험증(지금은 마이넘버 보험증의 자격 정보 화면)에 인쇄되어 있는 보험자번호. 레세프트 청구에서는 반드시 등장하는 8자리(가끔 6자리) 숫자이지만, 「이 번호는 사실 읽을 수 있다」는 것을 아는 엔지니어는 의외로 많지 않습니다. 앞 2자리로 가입한 제도가 보이고, 다음 2자리로 보험자의 도도부현이 보이며, 끝 1자리로는 검산까지 됩니다. 즉 보험자번호는 단순한 일련번호가 아니라 구조를 가진 코드입니다.
ORCA 시리즈 네 번째 글은, 예고했던 레세프트 점검 이야기에 앞서, 이 보험자번호를 번외편으로 한 편 따로 해부합니다. 다루는 내용은 다음 네 가지입니다.
- 보험자번호의 구성 ── 법별번호·도도부현번호·보험자별번호·검증번호
- 검증번호(check digit)의 손계산과 ORCA의 COBOL 구현
- 구·정부관장건강보험(현·協会けんぽ)만 「4자리」였던 역사적 특례
- 그 특례의 흔적이 2026년 공개 ORCA 소스에 지금도 살아 있다는 것
제도 쪽 서술은 후생노동성의 「보험자번호, 공비부담자번호, 공비부담의료의 수급자번호 및 의료기관 코드와 약국 코드 설정요령」(이하 「설정요령」)을 1차 자료로 하고, 구현 쪽은 이전 글까지와 같이, 공식 공개된 日レセ 본체 5.2계 소스(2026년 7월 공개 스냅샷) 를 실제로 읽고 확인한 결과에 근거합니다.
대상 독자와, 이 기사에서 쓰는 네 가지 용어
상정하는 독자는 의료기관용 시스템(레세콘·전자의무기록·접수나 청구 쪽 업무 앱)을 만들거나 연동하는 엔지니어와, 의료 데이터 반입을 담당하는 정보시스템 담당자입니다. 레세프트 청구 실무 지식은 전제로 하지 않습니다. 다음 네 단어만 알면 읽을 수 있고, 시리즈 앞 세 편을 읽지 않아도 이 기사는 단독으로 성립합니다.
| 용어 | 의미 |
|---|---|
| 레세프트 | 진료보수명세서. 의료기관이 한 달분의 진료 내용을 모아, 심사지불기관(사회보험진료보수지급기금·국민건강보험단체연합회)을 거쳐 보험자에게 비용을 청구하기 위한 명세 |
| 레세콘 | 레세프트 컴퓨터. 레세프트의 작성·청구를 담당하는 업무 시스템. 진료 기록을 쓰는 전자의무기록과는 다른 소프트웨어 |
| 日レセ | 일본의사회가 제공하는 「日医標準レセプトソフト」의 약칭. ORCA 프로젝트의 핵심인 레세콘이며, 본 기사에서 읽는 소스 코드는 이것입니다 |
| 보험자 | 공적 의료보험을 운영하는 주체. 協会けんぽ, 건강보험조합, 시정촌(국민건강보험), 후기고령자의료광역연합 등. 본 기사의 주인공인 보험자번호가 식별하는 것은 이 단위입니다 |
레세콘과 전자의무기록의 관계, ORCA의 전체 모습 자체는 시리즈 첫 글에서 다룹니다.
목차
- 먼저 결론 ── 보험자번호는 「제도+지역+일련번호+검산」으로 이루어져 있다
- 법별번호 ── 앞 2자리로 제도가 보인다
- 도도부현번호와 보험자별번호 ── 어느 보험자인지까지 보인다
- 검증번호 ── 모듈러스 10 웨이트 2-1을 손계산한다
- 예외 이야기 ── 구 정관건보의 보험자번호는 「4자리」였다
- 보험자번호로 「알 수 없는 것」
- ORCA는 어떻게 구현하는가 ── 두 개의 마스터와 자릿수 분기
- 번호를 다루는 시스템을 만드는 쪽의 실무 포인트
- 정리
- 참고 자료
그림의 실선은 항상 성립하는 관계, 점선은 조건이 붙는 관계입니다(성립 조건은 상세 페이지의 관계별 설명에 적혀 있습니다). 관계 전체 목록(총 18건, 근거와 확신도 포함)과 주요 개념의 정의는 지식 맵 상세 페이지에 정리되어 있습니다(일본어). 데이터: JSON-LD / Turtle
1. 먼저 결론 ── 보험자번호는 「제도+지역+일련번호+검산」으로 이루어져 있다
설정요령 제1은 보험자번호를 이렇게 정합니다.
| 위치 | 자릿수 | 이름 | 의미 |
|---|---|---|---|
| 1〜2번째 자리 | 2 | 법별번호 | 의료보험 제도의 구분(協会けんぽ, 조합건보, 후기고령자의료…) |
| 3〜4번째 자리 | 2 | 도도부현번호 | 보험자 소재지의 도도부현 |
| 5〜7번째 자리 | 3 | 보험자별번호 | 제도·도도부현 안에서의 보험자마다의 번호 |
| 8번째 자리 | 1 | 검증번호 | check digit(모듈러스 10 웨이트 2-1) |
다만 예외가 본칙에 적혀 있습니다. 국민건강보험(퇴직자의료를 제외)만 법별번호가 없고, 도도부현번호 2자리+보험자별번호 3자리+검증번호 1자리의 합계 6자리입니다. 보험증의 보험자번호가 6자리라면, 그것만으로 「시정촌 국민건강보험 또는 국민건강보험조합」임을 알 수 있습니다.
설정요령에 실린 예를 그대로 쓰면, 06130488이라는 보험자번호는 다음과 같이 읽힙니다.
06 13 048 8
│ │ │ └ 검증번호(제4장에서 검산합니다)
│ │ └ 보험자별번호: 도쿄 조합 안에서의 048번
│ └ 도도부현번호: 13 = 도쿄
└ 법별번호: 06 = 조합관장건강보험
「도쿄도에 있는 건강보험조합 중 하나」라는 데까지, 마스터를 조회하지 않고 번호만으로 알 수 있습니다. 이후 장에서 각 부품을 차례로 봅니다.
2. 법별번호 ── 앞 2자리로 제도가 보인다
법별번호는 설정요령 별표 1(1) 「법별번호 및 제도의 약칭표」에서 정합니다. 의료보험 제도의 주요한 것을 발췌합니다.
| 법별번호 | 제도 | 약칭 |
|---|---|---|
| 01 | 協会けんぽ(전국건강보험협회관장건강보험. 구·정부관장건강보험) | (協) |
| 02 | 선원보험 | (船) |
| 03 / 04 | 일용특례피보험자의 보험(일반요양 / 특별요양비) | (日) |
| 06 | 조합관장건강보험 | (組) |
| 07 | 자위관 등의 요양 급여 | (自) |
| 31〜34 | 공제조합(국가공무원 / 지방공무원 등 / 경찰 / 공립학교·사학진흥) | (共) |
| 39 | 후기고령자의료 | (高) |
| 63, 72〜75 | 특례퇴직(특정건보조합 / 각 특정공제조합) | (退) |
| 67 | 국민건강보험법에 의한 퇴직자의료 | ─ |
| (없음·6자리) | 국민건강보험(퇴직자의료를 제외) | ─ |
읽는 법의 실무 포인트는 세 가지입니다.
- 레세프트 제출처가 갈린다. 피용자보험(01〜34, 63, 72〜75)의 레세프트는 사회보험진료보수지급기금으로, 국민건강보험(6자리와 법별 67)과 후기고령자의료(39)는 국민건강보험단체연합회로 제출합니다. 레세프트 청구 세계에서 「사회보험」「국민건강보험」로 나눠 부르는 구분은, 보험자번호 앞자리를 보면 기계적으로 판정할 수 있다는 뜻입니다.
- 국민건강보험 계열인데 8자리 번호가 있다. 국민건강보험의 퇴직자의료(67)는 국민건강보험 제도이면서 예외적으로 법별번호가 붙은 8자리입니다. 「6자리=국민건강보험, 8자리=사회보험」으로 단순화해 구현하면 여기서 함정에 빠집니다.
- 1보험자=1번호가 아니다. 별표 1의 주기대로, 63·72〜75는 특례퇴직피보험자를 위한 법별번호입니다. 같은 건강보험조합이 일반 피보험자용으로 06 번호, 특례퇴직피보험자용으로 63 번호처럼 여러 보험자번호를 가지는 경우가 있습니다.
덧붙여, 잘 닮은 8자리 번호로 공비부담자번호가 있습니다(생활보호의 12, 정신통원의료의 21 등). 구성도 「법별 2자리+도도부현 2자리+실시기관 3자리+검증 1자리」로 똑같지만, 이는 의료보험의 보험자번호와는 별 체계입니다. 레세프트에서도 기재란이 따로 마련되어 있습니다. 혼동의 주의점은 제6장에서 다시 다룹니다.
3. 도도부현번호와 보험자별번호 ── 어느 보험자인지까지 보인다
3〜4번째 자리의 도도부현번호는 설정요령 별표 2에서 01(홋카이도)〜47(오키나와)로 정합니다. 배열은 일반적으로 쓰는 도도부현 코드(JIS)와 같고, 도쿄는 13, 오사카는 27입니다. 기준은 보험자의 소재지이므로, 전국 전근이 있는 회사라도 건보조합의 소재지가 도쿄면 13이 됩니다.
5〜7번째 자리의 보험자별번호는 그 제도·도도부현 안에서 보험자마다 붙는 번호입니다. 누가 번호를 정하는지도 통지에 명시되어 있고, 현행 규정에서는 協会けんぽ는 도도부현 지부마다 후생노동성 보험국이, 조합건보는 건강보험조합마다 지방후생(지)국이, 국민건강보험은 시정촌·국민건강보험조합마다 도도부현이, 후기고령자의료는 후기고령자의료광역연합이, 공제조합은 각 주관 관청이 정합니다(쇼와 51년 제정 당시에는 사회보험청 장관이나 도도부현 지사가 설정자였으나, 행정 조직 재편과 함께 현재 기관으로 이어졌습니다).
즉 보험자번호는 전국에서 일원 채번되는 것이 아니라, 「제도×도도부현」 틀 안에서 분산 채번되는 코드입니다. 일련번호 부분만 꺼내도 의미가 없고, 법별번호·도도부현번호와 짝을 이뤄야 비로소 보험자를 유일하게 가리킵니다. 이 점은 뒤에서 볼 ORCA의 마스터 설계(보험자 마스터의 키가 보험자번호 그 자체인 것)와도 맞습니다.
참고로 協会けんぽ는 법인으로서는 전국건강보험협회 하나이지만, 보험자번호는 도도부현 지부마다 붙어 있습니다(헤세이 20년 9월 18일 청보험발 제0918001호). 「보험자번호가 식별하는 단위」와 「법인으로서의 보험자」가 일치하지 않을 수 있다는 좋은 예입니다.
4. 검증번호 ── 모듈러스 10 웨이트 2-1을 손계산한다
끝 1자리 검증번호의 산출 방법도 설정요령에 절차로 적혀 있습니다.
- 검증번호를 제외한 각 자리에, 끝자리를 기점으로 차례로 2와 1을 곱한다
- 곱의 합을 구한다. 다만 곱이 2자리가 되는 경우는 1번째 자리와 2번째 자리 숫자의 합으로 한다
- 10과 「2의 합의 아래 1자리」의 차를 검증번호로 한다. 다만 아래 1자리가 0일 때는 검증번호를 0으로 한다
이른바 모듈러스 10 웨이트 2-1(M10W21)입니다. 제1장의 06130488로 검산해 봅니다. 검증번호를 뺀 7자리 0613048이 대상이고, 가중치는 오른쪽 끝 8을 기점으로 2, 1, 2, 1…을 할당합니다.
| 항목 | 1번째 자리 | 2번째 자리 | 3번째 자리 | 4번째 자리 | 5번째 자리 | 6번째 자리 | 7번째 자리 |
|---|---|---|---|---|---|---|---|
| 숫자 | 0 | 6 | 1 | 3 | 0 | 4 | 8 |
| 가중치(오른쪽 끝 기점) | 2 | 1 | 2 | 1 | 2 | 1 | 2 |
| 곱 | 0 | 6 | 2 | 3 | 0 | 4 | 16 |
| 합에 더하는 값 | 0 | 6 | 2 | 3 | 0 | 4 | 7 ← 1+6 |
합은 0+6+2+3+0+4+7 = 22. 아래 1자리가 2이므로 검증번호는 10 - 2 = 8이 되어, 06130488의 끝 8과 일치합니다(아래 1자리가 0일 때만 검증번호도 0입니다).
덧붙여 이 계산은 신용카드 번호 등의 검사 숫자에 쓰는 Luhn 알고리즘과 실질적으로 같은 것입니다. Luhn은 「오른쪽 끝부터 한 자리 걸러 2배로 하고, 2배한 결과가 9를 넘으면 9를 뺀 뒤, 전부 더한 합계가 10의 배수가 되도록 끝자리를 정한다」고 설명되지만, 곱은 최대 18이므로 「9를 빼는 것」은 「2자리를 1자리씩 나눠 더하는 것」과 같은 결과가 됩니다. M10W21이라는 이름에 익숙하지 않아도, Luhn을 짜 본 적이 있으면 같은 코드라는 것을 알 수 있습니다.
코드로 쓰면 몇 줄입니다.
def check_digit(code: str) -> int:
"""검증번호를 제외한 보험자번호 자리열에서 check digit을 구한다"""
total = 0
for i, ch in enumerate(reversed(code)):
n = int(ch) * (2 if i % 2 == 0 else 1)
total += n // 10 + n % 10
return (10 - total % 10) % 10
assert check_digit("0613048") == 8
의료 쪽 업무 앱은 C#이나 COBOL로 짜는 경우가 많아서, C# 판도 둡니다(.NET Framework 4.x에서도 .NET 8에서도 그대로 통과하는 범위의 구문입니다).
// 검증번호를 제외한 자리열에서 check digit을 구한다
public static int CheckDigit(string code)
{
int total = 0;
for (int i = 0; i < code.Length; i++)
{
// 오른쪽 끝을 기점으로 2,1,2,1…의 가중치를 곱한다
int digit = code[code.Length - 1 - i] - '0';
if (digit < 0 || digit > 9)
{
throw new ArgumentException("숫자가 아닌 문자가 포함되어 있습니다", nameof(code));
}
int n = digit * ((i % 2 == 0) ? 2 : 1);
total += n / 10 + n % 10; // 곱이 2자리면 1자리씩 나눠 더한다
}
return (10 - total % 10) % 10;
}
// 보험자번호(6자리 국민건강보험 / 8자리)의 끝 1자리를 검산한다.
// 구 정관의 4자리 번호는 검증번호가 없으므로 이 함수의 대상 외로 둔다(제5장)
public static bool IsValidInsurerNumber(string number)
{
if (string.IsNullOrEmpty(number)) { return false; }
if (number.Length != 6 && number.Length != 8) { return false; }
// 전체 자리를 먼저 본다. 끝 1자리만 검사하고 끝나면, 중간 자리에 숫자가 아닌
// 문자가 섞인 입력이 CheckDigit까지 닿아, false가 아니라 ArgumentException으로
// 돌아가게 된다. OCR·바코드·수기 입력을 통과시키는 이상, 여기서는 bool로
// 끝까지 반환해야 하는 경로
foreach (char c in number)
{
if (c < '0' || c > '9') { return false; }
}
int check = number[number.Length - 1] - '0';
return CheckDigit(number.Substring(0, number.Length - 1)) == check;
}
// CheckDigit("0613048") == 8 / IsValidInsurerNumber("06130488") == true
여기서 구현상의 함정을 하나. 가중치 「2,1,2,1…」은 오른쪽 끝 기점으로 정의되어 있습니다. 사실 보험자번호에 한정하면, 검증 대상 자리열이 7자리(8자리 번호) 또는 5자리(6자리 국민건강보험)로 홀수이므로, 왼쪽 끝부터 2,1,2,1…을 곱해도 할당은 같아집니다(홀수 길이에서는 가중치 배열이 좌우 대칭이 되기 때문입니다). 위험한 것은 이 루틴을 짝수 자리 번호에 그대로 쓴 순간입니다. 예를 들어 공비부담의료의 수급자번호는 수급자 구분 6자리+검증번호 1자리여서, 검증 대상이 6자리 짝수입니다. 왼쪽 끝 기점으로 짠 구현은 여기서 모든 자리의 가중치가 하나 어긋나 다른 값을 반환합니다. 보험자번호만으로 테스트하고 있으면 절대 눈치채지 못한다는 성질이 있습니다.
흥미로운 점은, ORCA 소스에 바로 이 함정의 흔적이 남아 있다는 것입니다. check digit의 산출·검증을 한곳에서 맡는 공통 서브프로그램 cobol/common/ORCSCHKDGT.CBL(컴포넌트명 「체크디지트 산출(체크)」)은 보험자번호에 한하지 않고 최대 20자리 번호를 받는 범용 루틴이지만, 그 수정 이력에는 이렇게 있습니다.
* プログラム修正履歴
* Maj/Min/Rev 修正者 日付 内容
* 01.00.01 MCC-太田 01/04/17 算術式の方法を右端から行う
2000년 12월 신규 작성부터 4개월 후인 2001년 4월에 「산술식 방법을 오른쪽 끝부터 수행한다」는 수정이 들어가 있습니다. 주석 처리되어 남은 구 코드를 읽으면, 초판은 왼쪽 끝부터 차례로 가중치를 곱하고 있었음을 알 수 있습니다. 앞에서 말했듯 홀수 자리 보험자번호에서는 왼쪽 끝 기점이라도 결과가 맞아 버리므로, 이 오류는 짝수 자리 번호를 검증해야 비로소 표면에 나옵니다. 수정 후의 코드는 자리열 오른쪽 끝 인덱스를 IDY에 잡고, IDY를 줄이면서 오른쪽 끝 기점으로 가중치를 곱하고, 곱이 2자리가 되면 WRK-CD2-1 + WRK-CD2-2로 분해해 합산한 뒤, 마지막으로 10 - (합 mod 10)을 반환하는, 설정요령 절차 그대로의 구현입니다. 25년 전 수정 이력 한 줄이, 그대로 「check digit은 오른쪽 끝 기점으로 짜라. 홀수 자리 테스트만으로 안심하지 마라」는 주의로 지금도 쓸모가 있습니다.
5. 예외 이야기 ── 구 정관건보의 보험자번호는 「4자리」였다
여기까지가 원칙입니다. 그리고 보험자번호에는 역사상 가장 큰 예외가 있었습니다. 설정요령 제1의 7에 이렇게 있습니다.
정부관장건강보험(일용특례피보험자의 보험을 제외.)의 보험자번호에 관한 특례 정부관장건강보험(…)의 보험자번호에 대해서는, 당분간, 상기 1 및 3에도 불구하고, 도도부현번호 2자리 및 보험자(시정촌)별번호 2자리를 조합한 4자리 번호를 보험자번호로 하며, 이 경우의 도도부현번호는 사회보험사무소 소재지의 도도부현마다 별표 3에 정하는 번호로 한다.
協会けんぽ의 전신인 정부관장건강보험(정관건보)은, 중소기업 종업원이 가입하는, 가입자 수로 국내 최대급 제도였습니다. 그 최대 제도의 보험자번호가,
- 8자리가 아니라 4자리(법별번호 없음, 게다가 검증번호도 없음)
- 도도부현번호는 통상의 별표 2가 아니라 전용 별표 3
- 보험자는 국가(하나)인데, 번호는 사회보험사무소마다
라는 삼중의 특례였습니다. 별표 3의 번호는 통상 표와는 닮은 데가 없습니다.
| 도도부현 | 통상의 도도부현번호(별표 2) | 정관 전용(별표 3) |
|---|---|---|
| 도쿄 | 13 | 21 |
| 가나가와 | 14 | 31 |
| 아이치 | 23 | 51 |
| 오사카 | 27 | 41 |
| 후쿠오카 | 40 | 75 |
| 오키나와 | 47 | 82 |
이 특례는 「당분간」인 채로 수십 년 이어졌고, 2008년 10월 1일 전국건강보험협회(協会けんぽ) 발족으로 비로소 해소되었습니다. 현재 요령(쇼와 51년 통지의 현행판)에서는, 協会けんぽ의 보험자번호는 도도부현 지부마다 정한 8자리 번호(앞에서 든 청보험발 제0918001호)로 되어 있습니다. 법별번호는 정관 시대와 같은 01입니다.
ORCA 소스에 남은 「정관」의 흔적
제도상으로는 2008년에 끝난 이야기이지만, 레세콘은 옛 데이터도 계속 다룹니다. 2026년 공개 ORCA 5.2계 소스에는, 정관 4자리 시대의 흔적이 지금도 현역으로 남아 있습니다.
그 1: 자릿수로 제도를 추정하는 분기. 환자 등록의 보험 입력 검사 서브 cobol/orca12/ORCSP03A.CBL은, 입력된 보험자번호의 자릿수를 4·6·8 중 하나로 한정한 뒤(그 밖은 오류), 보험자 마스터 미등록 번호에 대해 자릿수로부터 제도(ORCA 내부의 「보험번호」)를 추정합니다.
* 法より編集
EVALUATE WRK-MOJ-MAX
WHEN 4
* 政府管掌
MOVE "001" TO WRK-HKNJA-HKNNUM
WHEN 6
* 国保
MOVE "060" TO WRK-HKNJA-HKNNUM
WHEN 8
* その他
PERFORM 1003-HKNNUM-HBTNUM-SEC
END-EVALUATE
4자리면 정부관장(내부 코드 001), 6자리면 국민건강보험(060), 8자리면 앞 2자리 법별번호로 마스터를 조회한다. 제1〜3장에서 본 번호 체계의 지식이 그대로 COBOL 분기가 되어 있습니다. 그리고 4자리 정관 번호에는 검증번호가 없으므로, 직전의 모듈러스 10 검사도 「자릿수가 4보다 클 때」만 실행됩니다. 특례는 검산 로직에까지 파급되어 있습니다.
그 2: 정관과 협회의 바꿔 읽기. 데이터 이행·반입 쪽에도 대응이 있습니다. 환자 보험 정보의 반입 배치 cobol/orcabt/ORCVTPTHKNINF.CBL에는,
* 協会けんぽ対応
IF PTHKN-HKNNUM = "001"
* 政管で保険者番号が8桁は協会とする
IF WRK-LEN = 8
MOVE "009" TO PTHKN-HKNNUM
END-IF
END-IF
와 같이, 「정관(001)으로 들어왔지만 보험자번호가 8자리면 協会けんぽ(009)로 바꿔 읽는다」는 처리가 있습니다. 내부적으로는 구·정관과 현·協会けんぽ가 다른 보험번호로 공존하며, 자릿수가 신구를 가르는 단서가 됩니다. 레세프트 집계 쪽의 cobol/orcabt/ORCBG014.CBL에서는, 001과 009를 「정관은 협회로 바뀐다」는 주석과 함께 같은 구분으로 묶습니다.
그 3: 표시명의 바꿔 쓰기. 결정타는 보험 명칭 편집의 공통 루틴 cobol/common/ORCSHKNMEI.CBL입니다.
01 CONST-H201001 PIC X(08) VALUE "20081001".
...
IF ( ORCSHKNMEI-SRYYMD >= CONST-H201001 )
AND ( COMB-HKNNUM = "001" )
INSPECT COMB-SYU-TANSEIDONAME
REPLACING ALL "政管" BY "協会"
END-IF
協会けんぽ 발족일 20081001이 상수로 들어가 있고, 진료일이 그 이후이면 제도 단축명에 들어 있는 「政管」 문자열을 「協会」로 치환합니다. 마스터상의 명칭은 옛것 그대로, 진료일에 따라 표시만 바꿉니다. 2008년 9월 30일 이전 진료라면 지금도 「政管」으로 표시되는 구조입니다. 제도의 역사가 문자열 치환 한 문장으로 실행 시에 재현됩니다.
6. 보험자번호로 「알 수 없는 것」
「어디까지 알 수 있는지」를 따라왔으니, 경계선도 그어 둡니다. 보험자번호로 알 수 없는 것입니다.
- 개인은 특정할 수 없다. 보험자번호가 가리키는 것은 보험자(의 단위)까지입니다. 개인의 식별은 피보험자증의 기호·번호(및 온라인 자격확인의 개인 단위화로 추가된 2자리 가지번호)가 담당합니다. 이전에 본 온라인 자격확인에서도, 조회 조건은 보험자번호+기호·번호+가지번호의 짝이었습니다.
- 본인부담 비율은 정해지지 않는다. 법별번호로 제도는 보이지만, 창구 부담은 연령이나 소득 구분으로 바뀝니다. 「39이니까 1할」 같은 비약은 금물이며, 부담 비율은 자격확인 결과(고령수급자증·한도액 인정 정보 등)로 판정하는 것입니다.
- 보험자의 명칭·연락처는 나오지 않는다. 번호에서 「도쿄의 조합건보 048번」까지는 알아도, 그것이 어느 조합인지는 보험자 마스터와 맞춰 봐야 비로소 알 수 있습니다. 번호 체계는 검색 키만 줄 뿐입니다.
- 공비부담자번호와는 다른 세계. 생활보호(법별 12)나 자립지원의료(21) 등의 8자리 번호는 공비부담자번호이며, 보험자번호의 법별번호 표와는 다른 표에서 채번됩니다. 같은 「8자리·법별 2자리+도도부현 2자리+3자리+검증 1자리」 구조이므로, 포맷만 보고 동일시하면 사고가 납니다. 레세프트상에서도 보험과 공비는 다른 란입니다.
7. ORCA는 어떻게 구현하는가 ── 두 개의 마스터와 자릿수 분기
제5장에서 본 분기 뒤에 있는, ORCA의 보험자번호 쪽 데이터 설계를 정리합니다. 등장하는 마스터는 크게 둘입니다.
보험번호 마스터 tbl_hknnum은 「제도」 층입니다. 제도는 3자리 내부 코드 「보험번호」(001=정관, 009=協会けんぽ, 060=국민건강보험, 039=후기고령자…)로 식별됩니다. 다만 실제 기본 키는 보험번호 단독이 아니라, 의료기관번호·적용개시일·구분(HOSPNUM, HKNNUM, TEKSTYMD, PAYKBN)을 포함하는 복합 키이며, 같은 제도의 레코드를 적용 기간의 세대로 겹칠 수 있는 구조입니다. 부담 비율 같은 속성이 제도 개정으로 바뀌어도, 기간으로 끌어올 수 있습니다. 정의(record/tbl_hknnum.db)에는 법별번호 HBTNUM, 제도 명칭 SEIDONAME/단축명 TANSEIDONAME 외에, 본인·가족 × 입원·외래마다의 부담률이나 상한액 필드가 늘어서 있습니다. 주목할 것은 세 가지 체크 구분입니다.
HBTNUMCHKKBN── 법별번호 체크 구분KENSNUMCHKKBN── (부담자번호의) 검증번호 체크 구분JKYSKENSNUMCHKKBN── 수급자번호의 검증번호 체크 구분
번호 검사를 걸지 여부가 제도마다의 마스터 설정이라는 뜻입니다. 실제로 공비 입력 검사 서브 cobol/orca12/ORCSP03B.CBL을 읽으면, 부담자번호의 모듈러스 10 검사는 KENSNUMCHKKBN = "1"일 때만 실행되고, 수급자번호는 구분이 "3"이면 오류가 아니라 경고(확인하면 통과)로 다루고 있습니다. 공비의 수급자번호에는 자치체마다 검증번호가 없는 체계가 섞여 있으므로, 검사 강도를 데이터로 조절할 수 있게 한 것입니다. validation을 코드에 바로 쓰지 않고 마스터로 빼는 이 설계는, 제도의 다양성과 25년 함께해 온 레세콘의 지혜라고 할 수 있습니다.
보험자 마스터 tbl_hknjainf는 「보험자」 층입니다. 키는 의료기관번호+보험자번호 그 자체이며, 보험자 명칭·우편번호·주소·전화번호·피보험자증의 기호, 그리고 소속 제도(보험번호)를 가집니다(record/tbl_hknjainf.db). 제5장의 ORCSP03A.CBL 처리 순서는 이 이층 구조를 전제로 합니다.
- 보험자번호 자릿수가 4·6·8이 아니면 즉시 오류
- 먼저 보험자 마스터(
tbl_hknjainf)를 검색. 등록되어 있으면 명칭·주소·급여율·제도가 모두 확정 - 미등록이면, 4자리 초과에 한해 모듈러스 10으로 검산(
ORCSCHKDGT호출) - 자릿수와 법별번호로부터 제도를 추정(4자리→정관, 6자리→국민건강보험, 8자리→
tbl_hknnum을 법별번호로 검색)
즉 「번호 체계에서 이끌어 낼 수 있는 것」은 미등록 시의 fallback이며, 올바른 값은 어디까지나 마스터라는 우선순위입니다. 제6장의 「번호에서 명칭은 알 수 없다」는 한계에 대한, 구현 쪽 답이 이 2단 구성입니다.
덧붙여 보험자번호를 보관하는 필드 HKNJANUM은 PIC X(08) ── 숫자형이 아니라 8자리 문자열로 정의되어, COBOL 소스 650개 이상에서 참조됩니다. 앞이 0인 번호(법별 01〜07 등)를 숫자로 두면 선행 제로가 떨어지는, 다음 장의 주의점을, 형 선택이 처음부터 피하고 있는 형태입니다.
8. 번호를 다루는 시스템을 만드는 쪽의 실무 포인트
보험자번호(및 같은 형의 공비부담자번호)를 다루는 시스템을 설계·구현할 때의 요점을 정리합니다.
- 문자열로 둔다. 숫자로 두지 않는다. 법별 01〜07대 번호는 앞이 0입니다. Excel을 거치는 순간에 선행 제로가 떨어져 7자리가 되는 사고는, 의료 데이터 연동의 단골 트러블입니다. CSV 반입 쪽에서는 「자릿수가 부족한 번호」를 감지해 걸러 내거나 경고하는 설계로 해 주세요.
- 자릿수는 4·6·8 세 가지를 전제로. 현행 신규 데이터는 6자리(국민건강보험)와 8자리이지만, 과거 데이터에는 구 정관의 4자리가 있을 수 있습니다(제5장). ORCA가 지금도 4자리를 받는 것은 이 역사에 대한 배려입니다. 「8자리 고정·제로 패딩」 정규화를 섣불리 하면, 구 데이터나 다른 시스템과의 대조에서 불일치가 납니다.
- check digit 검증은 「걸 수 있는 번호」에만 건다. M10W21 검산은 강력하지만, 구 정관 4자리에는 검증번호가 없고, 공비의 수급자번호에는 검증번호가 없는 체계도 있습니다. ORCA처럼 「어느 번호에 검증을 걸지」를 마스터 설정으로 빼고, 경고와 오류를 구분해 쓰는 것이 실전적입니다.
- 법별번호 분기는 마스터 구동으로. 제출처(지급기금/국민건강보험단체연합회) 판정 등에서 법별번호를 쓸 때는, 법별번호→제도 대응표를 코드에 바로 쓰지 말고 마스터(테이블)에 두세요. 법별번호는 제도 개정으로 추가되어 온 역사가 있고, 앞으로도 늘어날 수 있습니다.
- 보험자번호와 공비부담자번호를 같은 열에 넣지 않는다. 구조가 같아도 체계는 별개입니다(제6장). 데이터 모델상으로도 별 항목으로 두고, 대조 키에는 「번호의 종류」를 넣는 것을 권합니다.
- 온라인 자격확인 시대에도 보험자번호는 현역. 마이넘버 보험증으로의 이행으로 기호·번호를 의식하는 장면은 줄어들지만, 온라인 자격확인의 조회·응답 XML에도
InsurerNumber(보험자번호)는 건재하고, 레세프트의 청구처 판정도 보험자번호 기반 그대로입니다. 「곧 사라질 번호」가 아니라, 자격 정보의 핵심 키로 남는 전제로 설계해 주세요.
9. 정리
- 보험자번호는 법별번호 2자리+도도부현번호 2자리+보험자별번호 3자리+검증번호 1자리의 8자리(국민건강보험만 법별 없는 6자리). 앞 2자리로 제도와 청구처(지급기금/국민건강보험단체연합회)가, 다음 2자리로 보험자의 도도부현이 보인다.
- 끝의 검증번호는 모듈러스 10 웨이트 2-1. 가중치는 오른쪽 끝 기점이며, 홀수 자리 보험자번호에서는 왼쪽 끝 기점의 잘못된 구현이라도 우연히 일치하지만, 짝수 자리 번호(공비의 수급자번호 등)에 그대로 쓰면 무너진다. ORCA의 공통 서브
ORCSCHKDGT.CBL에는 2001년에 「산술식 방법을 오른쪽 끝부터 수행한다」고 수정한 이력이 남아 있다. - 최대의 예외는 구·정부관장건강보험. 「당분간」인 채로 수십 년, 전용 도도부현번호 표를 쓴 4자리(법별번호도 검증번호도 없음)로 운용되다가, 2008년 10월 協会けんぽ 발족으로 8자리화되었다.
- ORCA 소스에는, 4자리→정관으로 추정하는 분기, 8자리면 協会けんぽ로 바꿔 읽는 반입 처리, 진료일이 2008년 10월 1일 이후면 표시명의 「政管」을 「協会」로 치환하는 처리와, 이 특례의 흔적이 2026년 현역 코드로 남아 있다.
- 번호로 알 수 있는 것은 보험자의 단위까지. 개인·부담 비율·보험자 명칭은 알 수 없다. 구현은 「제도 마스터+보험자 마스터」 이층으로 두고, 번호 체계로부터의 추정은 미등록 시의 fallback에 철저하는 것이 ORCA 방식이며, 번호를 다루는 시스템 일반에 응용할 수 있다.
시리즈 다음은, 당초 예고대로 레세프트의 점검·사정 로직을 예정합니다. 의료기관 안의 데이터 검사와 심사지불기관 쪽의 컴퓨터 검사가 각각 무엇을 보는지를, 마찬가지로 소스와 공개 자료에서 분해합니다.
10. 참고 자료
- 보험자번호, 공비부담자번호, 공비부담의료의 수급자번호 및 의료기관 코드와 약국 코드 설정요령(후생노동성·헤세이 20년 3월판 별첨 2 PDF) ── 본문의 구성·검증번호 산출 절차·법별번호 표(별표 1)·도도부현번호 표(별표 2)·정관 특례(제1의 7)와 전용 번호 표(별표 3)의 인용원
- 보험자번호 등의 설정에 대하여(쇼와 51년 8월 7일 청보발 제34호·보발 제45호, 현행판) ── 協会けんぽ의 보험자번호를 도도부현 지부마다의 번호(헤세이 20년 9월 18일 청보험발 제0918001호)로 하는 현행 규정
- 보험자번호에 대하여 - 協会けんぽ(전국건강보험협회) ── 도도부현 지부마다의 현행 보험자번호 일람
- 日レセ 본체 5.2계 소스 코드(2026년 7월 공개 스냅샷)
cobol/common/ORCSCHKDGT.CBL/cobol/orca12/ORCSP03A.CBL/cobol/orca12/ORCSP03B.CBL/cobol/common/ORCSHKNMEI.CBL/cobol/orcabt/ORCVTPTHKNINF.CBL/cobol/orcabt/ORCBG014.CBL/record/tbl_hknnum.db/record/tbl_hknjainf.db외 ── 본문의 구현·수정 이력·테이블 정의 서술은 모두 이 스냅샷에 근거한다
관련 기사
같은 태그를 공유하는 최신 기사입니다. 더 가까운 주제로 지식을 넓힐 수 있습니다.
전자처방전이 레세콘의 무엇을 바꾸는가 ── 소스 코드로 읽는 ORCA의 전자처방전 대응
전자처방전에 레세콘이 갖춰야 할 것은 무엇인가. 처방전 ID·교환번호·리필을 관리하는 ORCA(니치레세)의 테이블 설계, 전자처방전 CSV 연동, 발행 형태 희망이 온라인 자격확인에서 넘어오는 흐름까지, 공개 소스 코드의 실측으로 해설합니다.
사정(査定)과 반려(返戻)는 어디서 일어나는가 ── 레셉트 점검 로직을 ORCA의 소스코드와 공개 자료로 분해한다
레셉트의 사정·반려는 어디서 일어나는가. ORCA의 데이터 체크 업무와 체크마스터, 레세덴 데이터 체크, 심사지급기관의 컴퓨터 체크·대조점검·종람점검까지, 레셉트 점검의 다단계 구조를 공개 소스와 공개 자료로 해설합니다.
마이나보험증을 태그하면 무슨 일이 일어나는가 ── 온라인 자격확인과 레세콘 연계를 ORCA 소스코드로 읽다
마이나보험증을 태그한 뒤 보험 자격이 레세콘에 등록되기까지를, 온라인 자격확인의 전체 흐름과 ORCA(니치레세) 공개 소스로 해설합니다. 온자 관련 API 20개, tbl_onshi_* 테이블 13개, 2020~2026년 제도 대응 연표를 포함합니다.
ORCA(니치레세)는 전자차트가 아니다 ── 엔지니어 관점에서 정리하는 레세콘과 의료 시스템 구성
ORCA(니치레세)는 전자차트가 아니라 레세콘입니다. 엔지니어 관점에서 의료기관의 시스템 구성, 레셉트 업무, COBOL 약 406만 행의 소스 내용, 니치레세API, WebORCA 전환의 요점을 공개 소스 실측으로 정리합니다.
닛레세 API의 전체 구조를 소스코드로 파악한다 ── ORCA의 공개 소스를 읽다(전 137개 엔드포인트 대응표 포함)
닛레세 API의 전체 구조를 ORCA(일본의사회 표준 레셉트 소프트웨어)의 공개 소스코드로 파악합니다. 전 137개 엔드포인트 대응표, patientgetv2를 끝까지 추적하는 예, 5.1 계열과의 버전 간 diff 실측, 문서화되지 않은 API...
관련 토픽
이 기사와 가까운 토픽 페이지입니다. 기사를 출발점 삼아 관련 서비스와 다른 기사로 이어집니다.
Windows 기술 토픽
Windows 개발, 장애 조사, 기존 자산 활용에 관한 KomuraSoft LLC 기사를 모은 토픽 허브입니다.
이 주제와 연결되는 서비스
이 기사는 다음 서비스 페이지로 이어집니다. 가까운 입구부터 확인해 주세요.
기술 상담 & 설계 리뷰
보험자번호·공비부담자번호 같은 업무 코드 체계의 설계나 validation 방침을 정리하는 일은, 의료 분야에 국한되지 않고 업무 시스템의 기술 상담·설계 리뷰에서 자주 나오는 주제입니다.
Windows 앱 개발
보험자번호의 입력 검사나 마스터 대조를 포함하는 접수·청구 쪽 업무 앱은, 원내·사내 Windows 단말에서 돌아가는 경우가 많아 Windows 앱 개발의 범위입니다.
자주 묻는 질문
이 기사 주제에 대해 상담 시 자주 나오는 질문을 모았습니다.
- 보험자번호로 개인을 특정할 수 있습니까?
- 할 수 없습니다. 보험자번호가 식별하는 것은 「어느 보험자(協会けんぽ ○○지부, ○○건강보험조합, ○○시의 국민건강보험 등)인가」까지입니다. 개인의 식별은 피보험자증의 기호·번호(온라인 자격확인의 개인 단위화로 추가된 2자리 가지번호를 포함)가 담당하며, 보험자번호와는 다른 항목입니다.
- 보험자번호가 6자리인 보험증과 8자리인 보험증이 있는 이유는 무엇입니까?
- 국민건강보험(퇴직자의료를 제외)만 법별번호가 없는 6자리(도도부현번호 2자리+보험자별번호 3자리+검증번호 1자리)로 정해져 있기 때문입니다. 피용자보험(協会けんぽ·조합건보·공제 등)과 후기고령자의료, 국민건강보험의 퇴직자의료(법별 67)는 법별번호 2자리를 앞에 붙인 8자리입니다.
- 보험자번호의 마지막 1자리는 무슨 숫자입니까?
- 검증번호(check digit)입니다. 끝자리를 제외한 각 자리에 오른쪽 끝부터 차례로 2, 1, 2, 1…을 곱하고, 곱이 2자리가 되면 1자리씩 나눠 합산한 뒤, 그 합의 아래 1자리를 10에서 뺀 수(아래 1자리가 0이면 0)가 검증번호가 됩니다. 이른바 모듈러스 10 웨이트 2-1 방식으로, 입력 실수의 상당수를 이 1자리로 검출할 수 있습니다.
- 옛날 協会けんぽ(정부관장건강보험)의 보험자번호가 4자리였다는 것은 사실입니까?
- 사실입니다. 후생노동성 설정요령에 「정부관장건강보험의 보험자번호는 당분간 도도부현번호 2자리+보험자별번호 2자리의 합계 4자리로 한다」는 특례가 명시되어 있었습니다. 게다가 도도부현번호는 통상의 표와는 다른 전용 표(도쿄=21, 오사카=41 등)였습니다. 2008년 10월 協会けんぽ 발족에 따라 도도부현 지부별 8자리 번호로 전환되었습니다.