본문으로 건너뛰기

COZYGONO / FIELD GUIDE

MSDS 초안 사용 가이드

새 원료나 혼합 제품의 성분 정보를 정리하고, 공개 자료와 공급사 원료 SDS 사이의 확인할 부분을 찾을 때 사용합니다.

누가 쓰나요원료 입고 담당자 · 공정 엔지니어 · 안전보건 실무자
01 / PREPARE

시작 전 준비

제품명, 각 원료의 CAS 번호와 완제품 기준 함량, 공급사 원료 SDS의 개정판을 준비하세요.

02 / WORKFLOW

사용 순서

  1. CAS 번호나 물질명으로 찾은 뒤, 표시된 물질 식별정보를 공급사 원료 SDS와 대조합니다. 혼합 원료라면 하위 성분과 함량도 확인합니다.
  2. 완제품 기준 함량을 입력하고 합계, 출처가 없는 값, 미공개 잔량 및 규제 목록의 미수록 표시를 검토합니다.
  3. 분류와 16항목 초안을 만든 뒤 H 코드·그림문자·누락 정보를 원료 SDS와 다시 비교합니다.
03 / READOUT

결과를 읽는 법

검색 성공은 물질 확인이나 분류 확정이 아닙니다. 미수록은 규제 비대상을 뜻하지 않으며, 빈 독성값은 안전하다는 뜻이 아닙니다.

EXAMPLE / TRY & COMPARE

함량 합계와 자료 누락을 따로 확인하기

입력 조건
가상의 성분 A 70%, B 20%를 입력했다고 가정합니다. B의 급성독성 근거는 아직 받지 못했습니다.
계산·비교 방법
70 + 20 = 90%. 미입력 잔량은 10%입니다. 합계 문제와 독성 자료 누락은 서로 다른 검토 항목입니다.
결과와 해석
잔량을 확인하고 B를 30%로 수정해도 B의 독성 근거는 여전히 비어 있습니다. 함량 합계가 맞는다는 이유로 분류를 확정하지 않습니다.
다음 확인
공급사에 B의 SDS 개정판과 분류 근거를 요청하고, 미상 항목을 기록합니다. 이 예시는 특정 물질이나 배합의 안전성을 판정하지 않습니다.
누락 독성값에 기본값을 넣었던 오류 사례
04 / SCOPE

현재 활용 범위

원료 정보 정리, 기존에는 확인할 수 없었던 자료 공백과 그 비율까지 드러낸 내부 검토용 초안, 공급사에 재확인할 항목 목록 작성.

판단 경계법정 MSDS 작성·제출, 현장 게시, 노출 대응 지침을 이 초안으로 대체하지 마세요. 적용 규정과 원료 SDS 원문은 담당자가 확인해야 합니다.

NOTES / FROM THE BUILD

개발 노트

자료가 없을 때 기본값을 넣으면 생기는 일: 혼합물 급성독성 계산의 함정

작성 · 수정

에탄올과 톨루엔을 섞었더니 "흡입하면 유해함"이 나왔습니다. 당시 입력한 자료에는 그 분류의 근거값이 없었는데도 말입니다. 계산식 한 줄이 만든 과잉분류를 추적한 기록입니다.

혼합물 GHS 분류 엔진을 웹용으로 옮기며 발견한 문제입니다. 개발 노트에서 이 대목만 발췌합니다.

1. 입력 근거 없이 문구가 나왔다

에탄올 70%, 톨루엔 30%로 시험 계산을 돌렸습니다. 결과에 이 문구가 붙었습니다.

H332: 흡입하면 유해함

당시 도구에 넣은 자료에는 이 판정을 계산할 성분별 급성 흡입독성 시험값이나 추정값이 없었습니다. 이 글에서 확인한 오류는 그 빈칸을 임의의 값으로 채웠다는 점입니다. 에탄올·톨루엔 또는 이 배합이 유해하지 않다는 판정이 아닙니다. 공개 DB의 조회 결과에는 원출처와 적용 조건을 연결해야 하며, 특정 분류 목록에 항목이 없다는 사실만으로 안전하다고 결론 내릴 수 없습니다.[1]

2. 경계값과 기본값이 같았다

급성독성 혼합물 계산(ATEmix)은 성분의 독성값을 함량으로 가중해 역수 합으로 구합니다. 문제는 독성 자료가 없는 성분을 어떻게 다루느냐였습니다.

기존 구현은 자료가 없으면 경로별 기본값을 넣었습니다. 흡입에는 20 mg/L를 넣고, 증기의 4시간 노출 기준 상한과 비교했습니다. 예를 들어 미국 OSHA HCS의 표 A.1.1에서 증기 구분 4는 10 mg/L 초과·20 mg/L 이하입니다. 가스·분진·미스트는 단위나 경계값이 다르므로 20 mg/L를 모든 흡입 형태의 공통값으로 쓰면 안 됩니다.[3]

모든 성분에 흡입 자료가 없으면 계산은 이렇게 흘러갑니다.

ATEmix = 100 / (70/20 + 30/20) = 20 판정: 20 이하이므로 구분 4 → H332

즉 이 잘못된 기본값 처리와 비교식을 적용하면, 입력을 모두 미상으로 둔 혼합물은 조성과 무관하게 구분 4로 계산됩니다. 위 수식은 당시 코드의 오류를 보여 주는 계산이며 실제 혼합물의 독성 시험 결과가 아닙니다.

3. 미상 성분의 계산과 고지를 구분하기

UNECE의 GHS 교육 예제는 사용할 수 있는 성분 자료로 계산하면서 미상 성분의 비중을 별도로 다룹니다.[2] 자료가 없다는 이유로 구분 경계값을 시험값처럼 만들어 넣는 방식과는 다릅니다.

계산식 보정 조건과 미상 성분 고지 조건도 구분해야 합니다. 예를 들어 미국 OSHA HCS는 혼합물 전체의 시험으로 분류하지 않고 미상 급성독성 성분이 1% 이상 들어간 경우의 고지 조건과, 관련 미상 성분의 총함량이 10%를 넘는 경우의 계산식 보정 조건을 따로 둡니다.[3] 이전 원고의 '10%를 넘으면 고지'라는 설명은 둘을 혼동하여 수정했습니다. 이 수치는 미국 기준을 설명한 것으로, 국내 작성 시에는 적용 법령·고시와 원료 SDS를 별도로 대조해야 합니다.

개발 당시 임의의 기본값을 제거한 뒤에는 다음과 같이 자료의 빈자리를 드러내도록 바꿨습니다.

급성독성(흡입): 입력 자료만으로 판정 불가 — 자료 확보 필요 (미상 성분 100.0%)

"자료가 없다"와 "유해하지 않다"는 다른 말이고, "자료가 없다"와 "구분 4"는 더더욱 다른 말입니다.

4. 안전측 판단이라는 오해

과잉분류는 안전한 쪽으로 틀린 것이니 괜찮다고 여기기 쉽습니다. 실제로는 그렇지 않습니다.

경고 문구가 근거 없이 붙으면 라벨과 보호구 기준이 함께 부풀고, 정작 진짜 위험한 항목이 묻힙니다. 무엇보다 "이 도구는 아무 혼합물에나 흡입 유해를 붙인다"는 사실을 사용자가 눈치채는 순간, 나머지 계산 결과도 신뢰를 잃습니다.

당시 구현에서 급성독성 구분 5를 출력 대상에서 제외한 것도 목표로 삼은 분류 범위를 정하는 작업이었습니다. UN GHS의 분류 체계와 각 국가에서 채택한 구분은 구별해야 합니다. 이 개발 기록만으로 현재 국내 고시의 모든 분류·표시 요건을 구현했다고 판단할 수는 없습니다.

5. 남긴 것

고친 뒤에도 계산 근거는 화면에 그대로 펼쳐 둡니다. 어떤 성분의 어떤 값이 분모에 들어갔는지, 자료가 없어 빠진 성분이 몇 퍼센트인지 보이게 했습니다. 분류 결과만 덩그러니 주는 도구는 검토할 수가 없기 때문입니다.

6. 같은 계산을 비교하기 위한 기록

혼합물 입력을 복사해 다시 확인할 때에는 성분의 질량비 합계, 독성 경로(경구·경피·흡입), 수치의 단위와 근거 SDS를 함께 고정해야 합니다. 서로 다른 경로나 증기·분진·미스트 값을 섞으면 같은 식을 사용해도 비교가 성립하지 않습니다.

자료가 없는 성분의 비중을 별도로 표시하고, 데이터가 없다는 이유로 임의의 독성값을 자동 생성하지 않습니다. 계산기가 분류 문구를 출력했다면 입력 근거와 적용 기준을 함께 확인해야 하며, 이 개발 기록의 특정 예시를 모든 공급사의 원료에 대한 일반적인 분류 결론으로 확대하지 않습니다.

참고 문헌과 해석 범위

  1. PubChem — Data Sources

    수집된 자료의 제공 기관과 원출처를 확인하는 방법입니다. 공개 DB의 조회 결과를 특정 공급사 원료의 최종 분류로 대신하지 않습니다.

  2. UNECE — GHS 급성독성 혼합물 계산 교육 예제 (2008)

    미상 성분의 함량을 보정식과 별도 고지에 반영하는 공식 예제입니다. 원리 설명에 사용하며 현재 국내 법규의 적합성 판정 자료로 사용하지 않습니다.

  3. 미국 OSHA HCS — 29 CFR 1910.1200 Appendix A, A.1

    표 A.1.1의 증기·분진·미스트 기준과 A.1.3.6.2.3–2.4의 미상 성분 처리 조건을 확인했습니다. 미국 기준이며 국내 MSDS에 그대로 적용하는 안내가 아닙니다.

CAS 번호를 넣었는데 왜 안 나올까: 공개 화학 DB의 compound와 substance

작성 · 수정

MSDS 초안 계산기에 실리콘 오일 CAS를 넣었더니 "찾을 수 없음"이 떴습니다. 번호가 틀린 것이 아니라, 공개 화학 데이터베이스가 물질을 담아 두는 층이 두 개였기 때문입니다.

개발 노트에서 한 대목만 옮깁니다. 웹 MSDS 도구를 만들며 실제로 막혔던 지점입니다.

1. 멀쩡한 CAS가 "없는 물질"이 되던 날

도구는 CAS 번호를 받아 공개 화학정보 데이터베이스(PubChem)에서 물성과 GHS 분류를 가져옵니다. 에탄올(64-17-5), 톨루엔(108-88-3) 같은 물질은 잘 나왔습니다. 그런데 현장 배합표에서 흔히 쓰는 원료를 넣자 결과가 비었습니다.

  • 63148-62-9 (실리콘 오일)
  • 8000-28-0 (라벤더 오일)
  • 64742-47-8 (수소첨가 등유)
  • 68439-46-3 (알코올 에톡실레이트)

번호는 모두 정확했습니다. 체크섬 검증도 통과했습니다.

2. 두 개의 층

확인해 보니 데이터베이스는 물질을 두 층으로 나누어 보관하고 있었습니다.

  • compound: 분자 구조가 하나로 정의되는 순물질. 에탄올처럼 구조식을 그릴 수 있는 것.
  • substance: 기관과 공급사가 등록한 원본 레코드. 구조가 하나로 정해지지 않아도 들어갑니다.

폴리머, UVCB(조성이 가변적인 물질), 천연 추출물, 석유 유분은 분자 구조가 하나로 확정되지 않습니다. 이때 compound 검색만으로는 필요한 원료 레코드를 찾지 못할 수 있어 substance 조회도 필요합니다. 실리콘 오일을 조회해 보니 compound는 0건, substance는 184건이었습니다.

조회 코드가 compound 층만 보고 있었으니, 도구 입장에서는 "세상에 없는 물질"이었던 것입니다.

3. 이름이라도 건지기

substance 층에는 GHS 분류도 물성도 거의 없습니다. 등록 정보와 별칭뿐입니다. 그래도 물질명은 건질 수 있었습니다.

다만 별칭 목록을 그대로 쓸 수는 없었습니다. 실리콘 오일의 184건에는 이런 것들이 섞여 있습니다.

  • Poly(dimethylsiloxane) — 16회
  • Silicone oil — 11회
  • MFCD00148360 — 10회
  • ACMC-20ajve, RL04405 — 각 1회

뒤의 둘은 물질명이 아니라 각 데이터베이스의 내부 등록번호입니다. 그래서 여러 등록건에 걸쳐 가장 자주 등장한 이름을 대표로 삼고, 등록번호 형태의 문자열은 걸러내도록 했습니다. 결과는 "Poly(dimethylsiloxane)", "LAVENDER OIL", "Hydrotreated light distillate"처럼 사람이 읽을 수 있는 이름으로 정리됐습니다.

4. 못 채우는 것은 못 채운다고 적기

여기서 한 가지 원칙을 정했습니다. 이름은 자동으로 채우되, GHS 분류와 물성은 비워 두고 "혼합물·UVCB로 등재된 CAS입니다. 원료 SDS의 값을 직접 입력하세요"라고 안내합니다.

공개 데이터에 없는 값을 추정해서 채우는 것이 더 나빴을 것입니다. MSDS는 추정이 아니라 근거가 필요한 문서이고, 현장에는 이미 그 원료의 SDS가 있습니다. 도구가 할 일은 없는 값을 지어내는 것이 아니라, 무엇이 비었는지 정확히 보여 주는 쪽이라고 판단했습니다.

5. 조회 결과를 다시 확인할 수 있게 남기기

재확인할 때에는 CAS, 조회 날짜, 사용한 데이터 계층, 가져온 필드와 비어 있는 필드를 함께 적습니다. 위의 등록 건수와 별칭 빈도는 당시 조사 기록이며 현재 DB의 고정된 값이 아닙니다. 다른 조회 결과가 나오면 먼저 조회 경로와 날짜를 맞춰 비교해야 합니다.

화면에서 이름을 찾았다는 사실과 필요한 안전정보를 확보했다는 사실은 구분합니다. 이름만 채워진 원료에는 원료 SDS 대조가 여전히 필요합니다. 공개 DB의 누락을 '유해하지 않음'으로 바꾸지 않는 것이 이 도구를 검토할 때의 첫 번째 기준입니다.

PDF에서 표를 꺼내는 방법이 다섯 가지인 이유: 켜고 끌 수 있게 만든 파이프라인

작성 · 수정

원료 안전보건자료 PDF를 자동으로 읽어 들이는 작업에서, 하나의 완벽한 방법을 찾는 대신 여러 방법을 켜고 끌 수 있게 만들었습니다. 그렇게 한 이유를 적었습니다.

MSDS 자동 작성 파이프라인 노트에서 설계 판단 부분만 옮깁니다.

1. 같은 규격, 다른 생김새

원료 안전보건자료는 16항목이라는 정해진 규격을 따릅니다. 그래서 처음에는 파싱이 단순할 것이라 생각했습니다. 실제로 받아 본 파일들은 이랬습니다.

  • 텍스트가 온전히 들어 있는 PDF
  • 문서 전체가 이미지 한 장인 스캔본
  • 텍스트는 있는데 글자 코드가 깨져 추출하면 알 수 없는 문자가 나오는 파일
  • 성분표가 표 선 없이 공백 정렬로만 되어 있는 파일
  • 좌우 두 단으로 나뉘어, 순서대로 읽으면 문장이 섞이는 파일

한 가지 방법으로 전부 처리하려는 시도는 매번 어느 한 유형에서 무너졌습니다.

2. 하나로 합치지 않기로 하다

그래서 단계를 나누고, 각 단계를 켜고 끌 수 있게 만들었습니다.

  • 글자 코드 깨짐 감지: 추출 결과가 쓸 수 있는 텍스트인지 먼저 판단
  • 표 추출 계층: 표 구조가 살아 있는 PDF에서 성분표를 그대로 떠냄
  • 항목별 구조화: 텍스트를 항목 단위로 잘라 각각 구조화
  • 전체 페이지 광학 문자 인식: 스캔본을 이미지로 보고 읽음
  • 다단 레이아웃 감지: 두 단으로 나뉜 지면의 읽기 순서를 바로잡음

처음에는 이 판단을 자동화하려 했습니다. 파일을 보고 알맞은 경로를 스스로 고르게 하는 편이 우아해 보였으니까요. 실제로는 검수하는 사람이 원인을 짚을 수 없게 만들었습니다. 결과가 이상할 때 어느 단계가 오작동했는지 알 수 없으면 고칠 수가 없습니다.

3. 값보다 근거를 먼저 저장하기

파이프라인에서 더 중요했던 결정은 따로 있었습니다. 추출한 값만 저장하지 않고, 그 값이 원문 어디에서 왔는지를 함께 남긴 것입니다.

원문 텍스트, 항목별 근거, 후보가 여럿일 때의 비교, 품질 경고를 별도 계층으로 두었습니다. 이렇게 하면 검수 화면에서 "이 인화점은 몇 페이지 어느 문장에서 왔다"를 바로 확인할 수 있습니다.

자동 추출의 정확도를 100%로 올리는 것은 불가능합니다. 대신 틀렸을 때 어디를 봐야 하는지 알 수 있으면, 사람이 고치는 비용이 크게 줄어듭니다.

4. 자동화의 목표를 옮기다

이 작업을 하며 목표가 조금 바뀌었습니다. 처음에는 "사람 없이 문서를 완성한다"였습니다. 지금은 "사람이 검토할 것을 정확히 줄여 준다"입니다.

안전보건자료는 틀리면 곤란한 문서입니다. 자동화가 할 수 있는 가장 큰 기여는 마지막 한 사람의 판단을 대체하는 것이 아니라, 그 사람이 확인해야 할 곳을 좁혀 주는 일이라고 보고 있습니다.

5. 추출 품질을 비교하는 표

방법을 비교할 때에는 같은 PDF와 같은 목표 항목을 사용합니다. 원본이 텍스트 PDF인지 스캔인지, 표가 페이지를 넘어가는지, 단위와 각주가 어디에 있는지를 기록한 뒤 추출된 성분명·함량·단위를 원문과 나란히 놓습니다. 빈 셀을 채운 개수만 세면 잘못 채운 값이 좋아 보일 수 있으므로 누락과 오인식을 구분합니다.

다음 검토자에게는 원문 페이지와 추출값의 연결을 남깁니다. 자동화의 결과가 그럴듯해 보이는가보다, 근거로 돌아가 빠르게 확인할 수 있는가가 중요합니다. 웹에 공개한 간이 계산기는 공개 DB 조회를 제공하며, 여기서 설명한 사내 PDF 파이프라인 전체가 그대로 제공되는 것은 아닙니다.

확장 방향 · 현재 제공하지 않음LATER / IDEA

원료 SDS 개정판 대조, 근거 자료 연결, 사내 검토 이력과 서식 출력은 확장 방향이며 현재 웹 도구의 기능이 아닙니다.

국내 MSDS 제도 참고: 고용노동부 안내 ↗