Skip to content

[데이터] 기관 실명 표기 중단 → 제공 원본 보건기관코드_en 을 키로 사용 (#16) #75

Description

@reo-23

요약

기관 식별자를 정보원 제공 원본인 보건기관코드_en 으로 되돌릴 것을 제안합니다.
현재 화면·API의 기관명·지역은 우리가 외부 목록을 임의로 붙인 값이며,
연도별 자료를 추가 적재하면 조용히 어긋납니다.


1. 현재 상태

익명 코드 3,530개를 보건복지부 실명목록(2022-12-31, 3,598곳)과
scripts/import_ssis_dataset.py 에서 정렬 순서로 1:1 임의 매핑하고 있습니다 (#16).

real_ids   = sorted(inst["id"] for inst in INSTITUTIONS)  # 실명목록 파일 순서
anon_codes = sorted(all_institutions)                     # 코드 오름차순
code_to_real = dict(zip(anon_codes, real_ids))

재고 수치(mu/sigma/on_hand)는 실데이터라 유효하지만,
"그 수치가 어느 기관 것인지"에는 근거가 없습니다.

참고로 ai#57 의 코드 계층 분석(4~5자리 = 기관 종별) 기준으로 대조하면
종별 일치율이 46.5% 입니다. 3,530곳 중 1,889곳이 보건소/보건지소/보건진료소
구분부터 어긋납니다.

2. 연도 확장 시 조용히 틀립니다 ← 핵심

매핑이 "정렬했을 때 몇 번째냐"로 붙기 때문에,
코드 목록이 조금이라도 달라지면 그 뒤가 전부 밀립니다.

2018~2019 추가제공 원장(3개 파일, 6,109,680행)으로 실측했습니다.

  • 20182019 고유 기관코드 1,553개 (전부 20242025 집합에 포함, 신규 0개)
  • 2024~2025 고유 기관코드 3,530개
  • 두 시기 공통 코드 1,553개에 대해 같은 방식으로 2018~2019 를 적재하면
    같은 코드가 같은 실명을 받는 비율 = 11 / 1,553 = 0.71%
    → 앞 11개만 우연히 맞고 12번째 코드부터 어긋납니다.
코드 현재 2018~2019 적재 시
D3;34 중랑구보건소(서울 중랑구) 동대문구보건소(서울 동대문구)
M4434 지장보건진료소(전북 임실군) 면천보건지소(충남 당진시)
S3946 신리보건진료소(강원 평창군) 봉명보건진료소(전남 무안군)

기관이 하나 신설·폐지되기만 해도 동일한 현상이 발생하며,
예외도 오류도 나지 않고 조용히 잘못된 기관에 붙습니다.
향후 정보원이 본 시스템을 운영하며 다른 기간·신규 자료를 적재할 경우
같은 문제가 그대로 재현됩니다.

반면 코드 체계 자체는 20182019 와 20242025 에 걸쳐 일관되게 유지되고 있어,
보건기관코드_en 을 키로 쓰면 어느 연도를 넣어도 동일 기관에 정확히 붙습니다.

3. ai 레포는 이미 코드 기준입니다

  • src/config.pyGROUP_KEYS / SERIES_KEYS / CATEGORICAL_FEATURES 전부 institution_code
  • src/data_loader.py:154result["institution_code"] = chunk["보건기관코드_en"]
  • data/mapping/institution_id_mapping.csv헤더만 있고 데이터 0행
    (anon_institution_code, institution_id, mapping_status, evidence_reference, mapping_version)
    → 대응표 수령 시 채울 자리로 보입니다

즉 실명은 backend 적재 단계에서만 생성되었고, ai 산출물에는 존재하지 않습니다.
현재는 AI(코드 기준)와 backend(실명ID 기준)의 키가 달라 반영 때마다 변환이 필요하며,
그 변환표가 바로 #16 의 임의매핑입니다. 코드로 통일하면 변환 단계가 사라집니다.

4. 운영 DB 현황 (2026-08-12 조회)

  • information_schema 전수 조회 결과 public 스키마에 가명 기관코드 컬럼이 없습니다.
    inventory.institution_id 는 전부 inst_XXXX 이고 원본 코드는 적재 시 폐기되었습니다.
  • institutions 3,598행 — 실명목록 전량. sido 17종·sigungu 224종,
    주소 3,598건·전화번호 3,598건이 재고 데이터와 결합돼 있습니다.
  • inventory 409,459행 / 재고 보유 기관 3,530곳 → 68곳은 재고 0건(매핑 후 남은 실명)
  • users.u_institution_demoinst_0001(종로구보건소)에 결속되어 있습니다.
  • alerts 30건의 message 는 inst_2434 혈당스틱… 형태로 실명 미포함(0건)
    실명은 조회 조인에서만 붙으므로, 조인만 제거하면 경보는 그대로 유지됩니다.

5. 노출 지점

파일 내용
db/schema.sql:26-27, 34 institutions.sido/sigungu + idx_institutions_region
db/queries.py:16 기관 응답에 sido/sigungu
db/queries.py:67-74, 176-186, 231 시도·시군구 필터 / regions() / facilities()
db/queries.py:323, 342-343 재고 목록 — i.name, i.sido, i.sigungu 조인
db/queries.py:355, 468, 668, 696-726 상세·고위험·경보 응답의 institutionName
db/queries.py:833, 867-868 부족현황 — 실명·지역 + ORDER BY institution_name
db/queries.py:508-563 relocation_candidatesORDER BY (ni.sido = si2.sido) DESC 로 임의매핑된 시도를 재배치 우선순위에 사용 (509-515행 주석과 sameSidoTentative 로 한계는 이미 명시됨)
routers/wep_stock.py:65, 81, 86 /institutions /facility-regions /facilities 의 지역 파라미터
routers/graphql_schema.py:161-162, 369-371, 392, 614-620, 814-815 스키마 필드 sido sigungu region_name

6. 해야 할 일

  • 보건기관코드_en원문 그대로 보존 (inventory 컬럼 추가)
    - 시프트 복원 없이 원문 저장. : ; < 포함이라 전 구간 텍스트 취급·인코딩·CSV 이스케이프 확인
  • API 응답에 institutionCode 추가, institutionName/sido/sigungu/address/phone 제외
  • /facility-regions 등 지역 축 엔드포인트 영구 비활성 또는 제거
    - 정보원이 대응표(제공데이터4)를 제공하지 않는 것으로 확정되어, 실명·지역 축은 복구 예정이 없습니다.
    "나중에 재개"가 아니라 지워도 되는 코드로 취급해 주세요.
  • relocation_candidatessido 우선 정렬 제거
  • users 데모 계정 결속을 코드 기준으로 변경
  • 적재 경로 결정
    1. 원장 재적재.DAT 의 코드를 그대로 적재 ([DB] 1,626만행 전량 재적재 (배치 적재·인덱스, 현재 ~40만행) #39 와 병합)
    2. 정렬 역산(임시) — 기존 매핑이 sorted(codes) ↔ sorted(inst_ids) 로 결정적이라
    inst_XXXX → 코드 대조표 재현 가능. 재적재 없이 표시만 선전환할 때 사용

관련

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions