보험자번호 8자리는 무엇을 말하는가 ── 법별번호・도도부현번호・검증번호를 레세콘 구현에서 읽는다

· · 의료IT, ORCA, 보험자번호, 레세콘, 레셉트, 의료사무

보험증(지금은 마이나보험증의 자격정보 화면)에 인쇄되어 있는 보험자번호. 레셉트 청구에서는 반드시 등장하는 8자리(때로는 6자리) 숫자이지만, ‘이 번호는 사실 읽을 수 있다’는 사실을 아는 엔지니어는 의외로 적지 않을까요. 앞의 2자리로 가입한 제도를 알 수 있고, 다음 2자리로 보험자의 도도부현을 알 수 있으며, 마지막 1자리로는 검산까지 할 수 있습니다──즉 보험자번호는 단순한 일련번호가 아니라 구조를 가진 코드입니다.

ORCA 시리즈의 네 번째 편은, 예고했던 레셉트 점검 이야기에 앞서 이 보험자번호를 번외편으로 독립시켜 해부합니다. 다루는 내용은 다음 4가지입니다.

  • 보험자번호의 구성 ── 법별번호・도도부현번호・보험자별번호・검증번호
  • 검증번호(체크 디지트)의 수계산과 ORCA의 COBOL 구현
  • 옛 정부관장건강보험(현 협회건보)만 ‘4자리’였던 역사적 특례
  • 그 특례의 흔적이 2026년 공개된 ORCA 소스에 지금도 남아 있다는 것

제도 측 서술은 후생노동성의 ‘보험자번호, 공비부담자번호, 공비부담의료의 수급자번호 및 의료기관코드와 약국코드 설정요령’(이하 ‘설정요령’)을 1차 자료로 삼았고, 구현 측은 지난번까지와 마찬가지로 공식 공개된 니치레세 본체 5.2계열 소스(2026년 7월 공개 스냅샷) 를 실제로 읽고 확인한 결과에 근거합니다.

대상 독자와 이 글에서 사용하는 4가지 용어

이 글이 상정하는 독자는 의료기관용 시스템(레세콘・전자차트・접수나 청구 관련 업무 애플리케이션)을 만들거나 연동하는 엔지니어, 그리고 의료 데이터 반입을 담당하는 정보시스템 담당자입니다. 레셉트 청구 실무 지식은 전제로 하지 않습니다. 다음 4개 용어만 알아두면 읽을 수 있으며, 시리즈 앞의 세 편을 읽지 않았더라도 이 글은 단독으로 성립합니다.

용어 의미
레셉트 진료보수명세서. 의료기관이 한 달분의 진료 내용을 정리하여, 심사지급기관(사회보험진료보수지급기금・국민건강보험단체연합회)을 거쳐 보험자에게 비용을 청구하기 위한 명세서
레세콘 레셉트 컴퓨터. 레셉트의 작성・청구를 담당하는 업무 시스템. 진료 기록을 작성하는 전자차트와는 별개의 소프트웨어
니치레세 일본의사회가 제공하는 ‘일의표준레셉트소프트’의 약칭. ORCA 프로젝트의 핵심을 이루는 레세콘으로, 이 글에서 다루는 소스 코드가 이것
보험자 공적 의료보험을 운영하는 주체. 협회건보, 건강보험조합, 시정촌(국민건강보험), 후기고령자의료광역연합 등. 이 글의 주역인 보험자번호가 식별하는 것이 바로 이 단위

레세콘과 전자차트의 관계, ORCA의 전체상 자체는 시리즈 1편에서 다루고 있습니다.

목차

  1. 먼저 결론 ── 보험자번호는 ‘제도+지역+일련번호+검산’으로 이루어져 있다
  2. 법별번호 ── 앞 2자리로 제도를 알 수 있다
  3. 도도부현번호와 보험자별번호 ── 어느 보험자인지까지 알 수 있다
  4. 검증번호 ── 모듈러스10 웨이트2-1을 손으로 계산한다
  5. 예외 이야기 ── 옛 정관건보의 보험자번호는 ‘4자리’였다
  6. 보험자번호로 ‘알 수 없는 것’
  7. ORCA는 어떻게 구현하고 있는가 ── 2개의 마스터와 자릿수 분기
  8. 번호를 다루는 시스템을 만드는 쪽의 실무 포인트
  9. 정리
  10. 참고 자료

1. 먼저 결론 ── 보험자번호는 ‘제도+지역+일련번호+검산’으로 이루어져 있다

설정요령 제1은 보험자번호를 다음과 같이 정하고 있습니다.

위치 자릿수 이름 의미
1~2번째 자리 2 법별번호 의료보험제도의 구분(협회건보, 조합건보, 후기고령자의료…)
3~4번째 자리 2 도도부현번호 보험자 소재지의 도도부현
5~7번째 자리 3 보험자별번호 제도・도도부현 안에서의 보험자별 번호
8번째 자리 1 검증번호 체크 디지트(모듈러스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자리) 국민건강보험(퇴직자의료 제외)

읽는 법의 실무적인 포인트는 3가지입니다.

  1. 레셉트의 제출처가 갈린다. 피용자보험(01~34, 63, 72~75)의 레셉트는 사회보험진료보수지급기금으로, 국민건강보험(6자리와 법별67)과 후기고령자의료(39)는 국민건강보험단체연합회로 제출합니다. 레셉트 청구의 세계에서 ‘사보(社保)’・’국보(国保)’로 구분해 부르는 것은, 보험자번호의 앞자리만 보면 기계적으로 판정할 수 있다는 뜻입니다.
  2. 국보 계열인데 8자리 번호가 있다. 국보의 퇴직자의료(67)는 국보 제도이면서도 예외적으로 법별번호가 붙은 8자리입니다. ‘6자리=국보, 8자리=사보’로 단순화해서 구현하면 여기서 걸려 넘어집니다.
  3. 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자리인 검증번호의 산출 방법도 설정요령에 절차로 명시되어 있습니다.

  1. 검증번호를 제외한 각 자리에, 마지막 자리를 기점으로 순서대로 2와 1을 곱한다
  2. 곱의 합을 구한다. 다만 곱이 2자리가 되는 경우에는 1의 자리와 10의 자리 숫자의 합으로 한다
  3. 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:
    """검증번호를 제외한 보험자번호 자릿수 문자열에서 체크 디지트를 구한다"""
    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에서도 그대로 동작하는 범위의 문법입니다).

// 검증번호를 제외한 자릿수 문자열에서 체크 디지트를 구한다
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의 소스에는 바로 이 함정의 흔적이 남아 있습니다. 체크 디지트의 산출・검증을 도맡는 공통 서브프로그램 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년 전 수정 이력 한 줄이 그대로 ‘체크 디지트는 오른쪽 끝 기점으로 작성하라. 홀수 자리 테스트만으로 안심하지 마라’는 주의사항으로 지금도 도움이 되는 셈입니다.

5. 예외 이야기 ── 옛 정관건보의 보험자번호는 ‘4자리’였다

여기까지가 원칙입니다. 그리고 보험자번호에는 역사상 가장 큰 예외가 있었습니다. 설정요령 제1의 7에는 이렇게 되어 있습니다.

정부관장건강보험(일용특례피보험자의 보험을 제외한다.)의 보험자번호에 관한 특례 정부관장건강보험(…)의 보험자번호에 대해서는, 당분간, 위 1 및 3에도 불구하고, 도도부현번호 2자리 및 보험자(시정촌)별번호 2자리를 조합한 4자리 번호를 보험자번호로 하며, 이 경우의 도도부현번호는 사회보험사무소의 소재지 도도부현별로 별표3에서 정하는 번호로 한다.

협회건보의 전신인 정부관장건강보험(정관건보)은 중소기업 종업원이 가입하는, 가입자 수로는 국내 최대급 제도였습니다. 그 최대 제도의 보험자번호가,

  1. 8자리가 아니라 4자리(법별번호 없음, 게다가 검증번호도 없음)
  2. 도도부현번호는 통상의 별표2가 아니라 전용 별표3
  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자리 시대의 흔적이 지금도 현역으로 남아 있습니다.

첫 번째: 자릿수로 제도를 추정하는 분기. 환자등록의 보험 입력 체크 서브 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보다 클 때’만 실행됩니다. 특례는 검산 로직에까지 파급되어 있는 것입니다.

두 번째: 정관과 협회의 치환. 데이터 이행・반입 쪽에도 대응이 있습니다. 환자보험정보 반입 배치 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를 ‘정관은 협회로 변경된다’는 주석과 함께 같은 구분으로 묶고 있습니다.

세 번째: 표시명 재작성. 압권은 보험명칭 편집의 공통 루틴 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는 어떻게 구현하고 있는가 ── 2개의 마스터와 자릿수 분기

5장에서 본 분기의 배경에 있는, ORCA의 보험자번호 관련 데이터 설계를 정리합니다. 등장하는 마스터는 크게 2가지입니다.

보험번호 마스터 tbl_hknnum은 ‘제도’ 계층입니다. 제도는 3자리 내부 코드인 ‘보험번호’(001=정관, 009=협회건보, 060=국보, 039=후기고령자…)로 식별됩니다. 다만 실제 주키는 보험번호 단독이 아니라, 의료기관번호・적용개시일・구분(HOSPNUM, HKNNUM, TEKSTYMD, PAYKBN)을 포함한 복합키로, 같은 제도의 레코드를 적용 기간의 세대로 겹쳐 쌓을 수 있는 구조입니다──부담비율 같은 속성이 제도 개정으로 바뀌어도 기간으로 조회할 수 있는 것입니다. 정의(record/tbl_hknnum.db)에는 법별번호 HBTNUM, 제도명칭 SEIDONAME/축약명 TANSEIDONAME 외에, 본인・가족×입원・외래별 부담률이나 상한액 필드가 늘어서 있습니다. 주목할 것은 3가지 체크 구분입니다.

  • HBTNUMCHKKBN ── 법별번호 체크 구분
  • KENSNUMCHKKBN ── (부담자번호의) 검증번호 체크 구분
  • JKYSKENSNUMCHKKBN ── 수급자번호의 검증번호 체크 구분

번호 체크를 걸지 여부가 제도별 마스터 설정으로 되어 있다는 것입니다. 실제로 공비 입력 체크 서브 cobol/orca12/ORCSP03B.CBL을 읽어 보면, 부담자번호의 모듈러스10 체크는 KENSNUMCHKKBN = "1"일 때만 실행되고, 수급자번호는 구분이 "3"이면 에러가 아니라 경고(확인하면 통과시킬 수 있음)로 취급됩니다. 공비의 수급자번호에는 지자체마다 검증번호가 없는 체계가 혼재되어 있으므로, 체크의 강도를 데이터로 조정할 수 있도록 한 것입니다. 검증 로직을 코드에 직접 박아 넣지 않고 마스터로 빼내는 이 설계는, 제도의 다양성에 25년간 대응해 온 레세콘의 지혜라고 할 수 있습니다.

보험자 마스터 tbl_hknjainf는 ‘보험자’ 계층입니다. 키는 의료기관번호+보험자번호 그 자체이며, 보험자명칭・우편번호・주소・전화번호・피보험자증의 기호, 그리고 소속 제도(보험번호)를 갖습니다(record/tbl_hknjainf.db). 5장에서 본 ORCSP03A.CBL의 처리 순서는 이 이층 구조를 전제로 하고 있습니다.

  1. 보험자번호의 자릿수가 4・6・8이 아니면 즉시 에러
  2. 먼저 보험자 마스터(tbl_hknjainf)를 검색한다. 등록되어 있으면 명칭・주소・급여율・제도가 모두 확정
  3. 미등록이면, 4자리를 초과하는 경우에 한해 모듈러스10으로 검산(ORCSCHKDGT 호출)
  4. 자릿수와 법별번호로 제도를 추정(4자리→정관, 6자리→국보, 8자리→tbl_hknnum을 법별번호로 검색)

즉 ‘번호 체계에서 도출할 수 있는 것’은 미등록 시의 폴백이며, 정답은 어디까지나 마스터라는 우선순위입니다. 6장의 ‘번호로는 명칭을 알 수 없다’는 한계에 대한, 구현 쪽의 답이 바로 이 2단 구조입니다.

덧붙여 보험자번호를 담는 필드 HKNJANUMPIC X(08)──수치형이 아니라 8자리 문자열로 정의되어 있으며, 650개 이상의 COBOL 소스에서 참조되고 있습니다. 앞자리가 0인 번호(법별 01~07 등)를 수치로 가지면 앞자리의 0이 사라진다는 다음 장의 주의점을, 자료형 선택 단계에서 애초에 회피하고 있는 형태입니다.

8. 번호를 다루는 시스템을 만드는 쪽의 실무 포인트

보험자번호(및 동형인 공비부담자번호)를 다루는 시스템을 설계・구현할 때의 요점을 정리합니다.

  1. 문자열로 보관한다. 수치로 보관하지 않는다. 법별 01~07번대 번호는 앞자리가 0입니다. Excel을 거치는 순간 앞자리 0이 사라져 7자리가 되어버리는 사고는 의료 데이터 연계에서 단골로 발생하는 문제입니다. CSV 반입 쪽에서는 ‘자릿수가 부족한 번호’를 감지하여 거부・경고하는 설계로 만드세요.
  2. 자릿수는 4・6・8의 3가지를 전제로 한다. 현행 신규 데이터는 6자리(국보)와 8자리이지만, 과거 데이터에는 옛 정관의 4자리가 존재할 수 있습니다(5장). ORCA가 지금도 4자리를 받아들이는 것은 이 역사에 대한 배려입니다. ‘8자리 고정・0채움’으로 안이하게 정규화하면, 예전 데이터나 다른 시스템과의 대조에서 불일치가 발생합니다.
  3. 체크 디지트 검증은 ‘검증할 수 있는 번호’에만 적용한다. M10W21의 검산은 강력하지만, 옛 정관의 4자리에는 검증번호가 없고, 공비의 수급자번호에는 검증번호가 없는 체계도 있습니다. ORCA처럼 ‘어느 번호에 검증을 적용할지’를 마스터 설정으로 빼내어, 경고와 에러를 구분해 사용하는 것이 실전적입니다.
  4. 법별번호에 의한 분기는 마스터 주도로 만든다. 제출처(지급기금/국보련) 판정 등에 법별번호를 사용할 경우, 법별번호→제도 대응표를 코드에 직접 박아 넣지 말고 마스터(테이블)에 보관하세요. 법별번호는 제도 개정으로 추가되어 온 역사가 있으며, 앞으로도 늘어날 수 있습니다.
  5. 보험자번호와 공비부담자번호를 같은 열에 넣지 않는다. 구조가 같아도 체계는 별개입니다(6장). 데이터 모델상으로도 별도 항목으로 두고, 대조 키에는 ‘번호의 종류’를 포함할 것을 권장합니다.
  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년의 현역 코드로 남아 있다.
  • 번호로 알 수 있는 것은 보험자 단위까지. 개인・부담비율・보험자명칭은 알 수 없다. 구현은 ‘제도 마스터+보험자 마스터’의 이층 구조로 갖추고, 번호 체계로부터의 추정은 미등록 시의 폴백에 철저히 국한하는 것이 ORCA 방식이며, 번호를 다루는 시스템 전반에 응용할 수 있다.

시리즈 다음 편은 당초 예고한 대로 레셉트의 점검・사정(査定) 로직을 예정하고 있습니다. 의료기관 내부의 데이터 체크와 심사지급기관 측의 컴퓨터 체크가 각각 무엇을 보고 있는지를, 마찬가지로 소스와 공개 자료로부터 분해합니다.

10. 참고 자료

같은 태그를 공유하는 최신 기사입니다. 더 가까운 주제로 지식을 넓힐 수 있습니다.

이 기사와 가까운 토픽 페이지입니다. 기사를 출발점 삼아 관련 서비스와 다른 기사로 이어집니다.

이 기사는 다음 서비스 페이지로 이어집니다. 가까운 입구부터 확인해 주세요.

기술 상담 & 설계 리뷰

보험자번호・공비부담자번호와 같은 업무 코드 체계의 설계나 검증(밸리데이션) 방침 정리는, 의료 분야에 국한되지 않고 업무 시스템의 기술 상담・설계 리뷰에서 자주 다루는 주제입니다.

Windows 앱 개발

보험자번호 입력 체크나 마스터 대조를 포함한 접수・청구 관련 업무 애플리케이션은 병원 내・사내의 Windows 단말에서 동작하는 경우가 많아, Windows 애플리케이션 개발이 다루는 범위입니다.

자주 묻는 질문

이 기사 주제에 대해 상담 시 자주 나오는 질문을 모았습니다.

보험자번호로 개인을 특정할 수 있나요?
할 수 없습니다. 보험자번호가 식별하는 것은 '어느 보험자(협회건보 ○○지부, ○○건강보험조합, ○○시의 국보 등)인가'까지입니다. 개인의 식별은 피보험자증의 기호・번호(온라인자격확인의 개인 단위화로 추가된 2자리 가지번호를 포함)가 담당하며, 보험자번호와는 별개의 항목입니다.
보험자번호가 6자리인 보험증과 8자리인 보험증이 있는 이유는 무엇인가요?
국민건강보험(퇴직자의료 제외)만이 법별번호를 갖지 않는 6자리(도도부현번호 2자리+보험자별번호 3자리+검증번호 1자리)로 정해져 있기 때문입니다. 피용자보험(협회건보・조합건보・공제조합 등)과 후기고령자의료, 국보의 퇴직자의료(법별67)는 법별번호 2자리를 앞에 붙인 8자리입니다.
보험자번호의 마지막 1자리는 무슨 숫자인가요?
검증번호(체크 디지트)입니다. 마지막 자리를 제외한 각 자리에 오른쪽 끝부터 순서대로 2, 1, 2, 1…을 곱하고, 곱이 2자리가 되면 1자리씩 나눠서 합산하며, 그 합의 1의 자리를 10에서 뺀 값(1의 자리가 0이면 0)이 검증번호가 됩니다. 이른바 모듈러스10 웨이트2-1 방식으로, 입력 실수의 상당수를 이 한 자리로 검출할 수 있습니다.
옛 협회건보(정부관장건강보험)의 보험자번호가 4자리였다는 것이 사실인가요?
사실입니다. 후생노동성의 설정요령에 '정부관장건강보험의 보험자번호는 당분간 도도부현번호 2자리+보험자별번호 2자리를 합친 총 4자리로 한다'는 특례가 명시되어 있었습니다. 게다가 도도부현번호는 통상의 표와는 별도의 전용표(도쿄=21, 오사카=41 등)였습니다. 2008년 10월 협회건보 발족과 함께 도도부현 지부별 8자리 번호로 전환되었습니다.

저자 프로필

기사 저자의 프로필 페이지입니다.

Go Komura

합동회사 코무라소프트 대표

Windows 소프트웨어 개발, 기술 상담, 장애 조사를 중심으로 재현이 어려운 장애 조사와 기존 자산이 남아 있는 프로젝트에 강점이 있습니다.

블로그 목록으로 돌아가기