요약
기관 식별자를 정보원 제공 원본인 보건기관코드_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행)으로 실측했습니다.
- 2018
2019 고유 기관코드 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.py — GROUP_KEYS / SERIES_KEYS / CATEGORICAL_FEATURES 전부 institution_code
src/data_loader.py:154 — result["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_demo 가 inst_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_candidates — ORDER 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으로 되돌릴 것을 제안합니다.현재 화면·API의 기관명·지역은 우리가 외부 목록을 임의로 붙인 값이며,
연도별 자료를 추가 적재하면 조용히 어긋납니다.
1. 현재 상태
익명 코드 3,530개를 보건복지부 실명목록(2022-12-31, 3,598곳)과
scripts/import_ssis_dataset.py에서 정렬 순서로 1:1 임의 매핑하고 있습니다 (#16).재고 수치(mu/sigma/on_hand)는 실데이터라 유효하지만,
"그 수치가 어느 기관 것인지"에는 근거가 없습니다.
참고로
ai#57의 코드 계층 분석(4~5자리 = 기관 종별) 기준으로 대조하면종별 일치율이 46.5% 입니다. 3,530곳 중 1,889곳이 보건소/보건지소/보건진료소
구분부터 어긋납니다.
2. 연도 확장 시 조용히 틀립니다 ← 핵심
매핑이 "정렬했을 때 몇 번째냐"로 붙기 때문에,
코드 목록이 조금이라도 달라지면 그 뒤가 전부 밀립니다.
2018~2019 추가제공 원장(3개 파일, 6,109,680행)으로 실측했습니다.
2019 고유 기관코드 1,553개 (전부 20242025 집합에 포함, 신규 0개)→ 같은 코드가 같은 실명을 받는 비율 = 11 / 1,553 = 0.71%
→ 앞 11개만 우연히 맞고 12번째 코드부터 어긋납니다.
기관이 하나 신설·폐지되기만 해도 동일한 현상이 발생하며,
예외도 오류도 나지 않고 조용히 잘못된 기관에 붙습니다.
향후 정보원이 본 시스템을 운영하며 다른 기간·신규 자료를 적재할 경우
같은 문제가 그대로 재현됩니다.
반면 코드 체계 자체는 2018
2019 와 20242025 에 걸쳐 일관되게 유지되고 있어,보건기관코드_en을 키로 쓰면 어느 연도를 넣어도 동일 기관에 정확히 붙습니다.3. ai 레포는 이미 코드 기준입니다
src/config.py—GROUP_KEYS/SERIES_KEYS/CATEGORICAL_FEATURES전부institution_codesrc/data_loader.py:154—result["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이고 원본 코드는 적재 시 폐기되었습니다.institutions3,598행 — 실명목록 전량.sido17종·sigungu224종,주소 3,598건·전화번호 3,598건이 재고 데이터와 결합돼 있습니다.
inventory409,459행 / 재고 보유 기관 3,530곳 → 68곳은 재고 0건(매핑 후 남은 실명)users.u_institution_demo가inst_0001(종로구보건소)에 결속되어 있습니다.alerts30건의 message 는inst_2434 혈당스틱…형태로 실명 미포함(0건) —실명은 조회 조인에서만 붙으므로, 조인만 제거하면 경보는 그대로 유지됩니다.
5. 노출 지점
db/schema.sql:26-27, 34institutions.sido/sigungu+idx_institutions_regiondb/queries.py:16sido/sigungudb/queries.py:67-74, 176-186, 231regions()/facilities()db/queries.py:323, 342-343i.name, i.sido, i.sigungu조인db/queries.py:355, 468, 668, 696-726institutionNamedb/queries.py:833, 867-868ORDER BY institution_namedb/queries.py:508-563relocation_candidates—ORDER 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-815sidosigunguregion_name6. 해야 할 일
보건기관코드_en을 원문 그대로 보존 (inventory컬럼 추가)- 시프트 복원 없이 원문 저장.
:;<포함이라 전 구간 텍스트 취급·인코딩·CSV 이스케이프 확인institutionCode추가,institutionName/sido/sigungu/address/phone제외/facility-regions등 지역 축 엔드포인트 영구 비활성 또는 제거- 정보원이 대응표(제공데이터4)를 제공하지 않는 것으로 확정되어, 실명·지역 축은 복구 예정이 없습니다.
"나중에 재개"가 아니라 지워도 되는 코드로 취급해 주세요.
relocation_candidates의sido우선 정렬 제거users데모 계정 결속을 코드 기준으로 변경1. 원장 재적재 —
.DAT의 코드를 그대로 적재 ([DB] 1,626만행 전량 재적재 (배치 적재·인덱스, 현재 ~40만행) #39 와 병합)2. 정렬 역산(임시) — 기존 매핑이
sorted(codes) ↔ sorted(inst_ids)로 결정적이라inst_XXXX → 코드대조표 재현 가능. 재적재 없이 표시만 선전환할 때 사용관련