정직한 결론: 오픈소스 대 상용
📍 현재 위치: 참고문헌 직전, 마지막 장입니다. 스택은 완성되었고, 캡스톤(capstone) 배치는 처음부터 끝까지 흘러갔으며, 이제 우리는 청구서를 합산합니다 — 정직하게. 순수 오픈소스(open source)는 어디에서 이겼고, 어디에서 부족했으며, 다음 엔지니어(혹은 다음 감사관)가 그 이유를 이해하도록 그 결정을 어떻게 기록으로 남길 것인가?
이 책 전체는 하나의 긴 주장이었습니다 — 결정론적으로 시뮬레이션된 유가식(fed-batch) CHO + 프로테인 A(Protein A) 단일클론항체(monoclonal antibody, mAb) 라인을 대상으로, 노트북 한 대 위에서, 바이오공정 데이터 플랫폼의 대부분을 오픈소스로 구축할 수 있다는 것입니다 — 유가식 모드(며칠에 걸쳐 영양분을 공급하는 방식)로 배양된 CHO(Chinese Hamster Ovary, 중국 햄스터 난소) 세포 배양이 mAb(치료용 항체 단백질)를 분비하고, 그것이 나중에 프로테인 A 포집 컬럼에서 정제되는 라인입니다. 동반 저장소(companion repo)는 실행 가능한 절반을 증명합니다. 복제하고, 몇 개의 make 타깃을 입력하면, 히스토리안(historian, 모든 측정값을 기록하는 시계열 데이터베이스)이 채워지고, 배치가 맥락화(contextualize, 원시 태그가 그것이 속한 배치와 장비에 연결됨)되며, 감사 체인(audit chain)이 검증되고, 소프트 센서(soft-sensor, 측정하기 쉬운 신호로부터 측정하기 어려운 양을 추론하는 모델)가 학습합니다. 그러나 "구축할 수 있다"는 것이 곧 "전부를 구축해야 한다"는 주장과 같았던 적은 한 번도 없습니다. 이 장은 그 결산입니다. 이 장은 의도적으로 책에서 코드가 가장 적은 장인데, 이 장이 산출하는 것은 서비스가 아니라 결정이기 때문입니다.
데이터 플랫폼을 짓는 일은 집을 짓는 일과 같습니다. 슬래브를 붓고, 벽을 세우고, 배관을 깔고, 조명을 직접 배선할 수 있습니다 — 오픈소스는 그 모든 작업을 위한 진정으로 훌륭하고 무료인 자재를 건네줍니다. 그러나 건축 검사관이 사용 승인 허가에 서명할 때, 책임을 지는 것은 목재상이 아니라 여러분입니다. 검사관이 가장 중요하게 여기는 방들 — 여러분이 만들어 출하한 것의 법적 기록을 담는 방들 — 에 대해서는, 대부분의 사람들이 보험에 가입해 있고 자기 이름을 걸고 작업에 서명하는 면허를 가진 계약업자를 고용합니다. 이 장은 어떤 방을 직접 골조로 세우고 어떤 방을 도급으로 맡길지에 대한 정직한 점수표이며, 거기에 더해 왜 그렇게 선택했는지를 기록하는 한 장짜리 양식입니다.
이 장에서 다루는 내용
- 우리가 구축한 순수 오픈소스 스택이 진정으로 무엇을 제공하는지, 그리고 상용이나 하이브리드가 책임 있는 선택이 되는 지점이 어디인지를 계층별로 정리한 점수표.
- 가격표가 결코 보여 주지 않는 숨은 비용: 검증 부담(validation burden), 공급망(supply chain) 소유, 그리고 벤더 책임성(vendor accountability).
- 구축-대-구매(build-vs-buy) 의사결정 프레임워크, 그리고 여러분의 저장소에 그대로 붙여 넣을 수 있는 아키텍처 의사결정 기록(Architecture Decision Record, ADR) 템플릿.
- 참조용 "정직한 하이브리드(honest hybrid)" 목표 아키텍처 — 실제 시설이 실제로 출하하는 형태.
점수표: 우리가 실제로 구축한 것, 그리고 그것이 실제로 든 비용
이 책의 모든 장은 같은 스택의 또 한 계층을 다루었고, 그 계층이 어디에서 충분하지 않게 되는지를 솔직하게 말해 주었습니다. 그 결론들을 한곳에 모으면 패턴이 드러납니다. 오픈소스는 스택의 바닥과 중간 — 계층화된 아키텍처를, 바닥의 생산 현장에서 위로 맨 꼭대기의 분석까지 읽으면 연결성(connectivity), 수집(ingestion), 히스토리화(historization), 맥락화, 의미론(semantics), 분석(analytics) — 에서 결정적으로 이기며, 검증된 GMP 진실 기록(record of truth)이 자리 잡는 바로 그 지점에서 점수는 상용 또는 하이브리드 쪽으로 기웁니다.
여기 계층별 정직한 점수표가 있습니다. OSS 도구와 그 핀(pin)은 examples/platform/compose/compose.yaml에 정의된 실제 작동 스택에서 가져온 진짜이며, 결론들은 앞선 장들이 얻어 낸 것입니다.
| 계층 | 이 책의 OSS 도구 | 순수 OSS 결론 | 상용 / 하이브리드가 이기는 지점 |
|---|---|---|---|
| 엣지 연결성 | OPC UA (asyncua) | 승리. 성숙하고, 표준 기반이며, 무료. | 벤더 드라이버 인증; OPC UA 보안을 잘못 처리하는 수많은 현장 장비(생산 현장의 계측기와 컨트롤러), 대부분의 배포가 건너뛰는 그 부분. |
| 메시지 버스 | MQTT + Sparkplug B (eclipse-mosquitto:2.0.22) | 승리. 가볍고, 어디에나 있으며, 브로커 비종속. | 벤더 SLA를 갖춘 브로커 HA 클러스터. |
| 히스토리안 / TSDB (시계열 데이터베이스) | TimescaleDB (timescale/timescaledb:2.17.2-pg17) | 포착과 쿼리에서 승리. | HA(고가용성), PB(페타바이트) 규모의 압축, 30년 보존 SLA(서비스 수준 협약) — Timescale 라이선스(TSL) 상용 등급. |
| 배치 및 장비 모델 | PostgreSQL (ISA-88/95 배치 및 장비 표준 — 배치 및 장비 모델 참조) — 히스토리안과 동일한 timescale/timescaledb:2.17.2-pg17 컨테이너 | 승리. 관계형(relational) 조인 백본은 관계형 조인 백본일 뿐. | 검증되고 구성 가능한 MES(제조 실행 시스템) 제품. |
| 맥락화 | SQL 뷰(view) | 승리. 이것은 그저 좋은 스키마 설계일 뿐. | — |
| 의미론 / 디지털 스레드 | RDF / SPARQL (apache/jena-fuseki:5.2.0) | 승리. 여기서는 개방형 표준(RDF 트리플 더하기 SPARQL 쿼리 언어)이 어떤 독점 그래프보다 낫다 — 의미론과 지식 그래프 참조. | 관리형 그래프 + 온톨로지 큐레이션 서비스. |
| 시각화 | Grafana (grafana/grafana-oss:11.4.0) | 로컬 사용에서 승리. | AGPL 재배포/SaaS는 의무를 발생시킴; 상용 대시보드는 지원을 묶어 제공. |
| 컴플라이언스 / 진실 기록 | Postgres 감사 + 해시 체인 (각 레코드가 직전 레코드에 암호학적으로 연결되어, 이후의 어떤 변경도 탐지 가능함) | 부분적. 탐지 가능하지만 변조-불가능하지는 않음 — 변조를 드러내지만 막지는 못함. | 상용/하이브리드. 검증된 MES / eQMS(전자 품질 관리 시스템), 자격을 갖춘 전자서명, 벤더 책임성. |
| 분석 / 소프트 센서 | Python (scikit-learn PLS) | 승리. 과학은 개방되어 있다. | 출하에 영향을 주는 모델을 위한 검증된 모델링 플랫폼. |
쉬운 두 행: 오픈소스가 그냥 이기는 곳
두 개의 분석 행은 가장 깨끗한 "OSS 승리"입니다. examples/analytics/soft_sensor.py에서 라만-대-역가(Raman-to-titer) 소프트 센서 — 인라인 라만(Raman) 스펙트럼(어떤 분자 결합이 존재하는지를 보고하는 광산란 측정)으로부터 역가(titer)(배양액 내 항체 농도, 단위는 그램 매 리터)를 예측하는 PLS(부분 최소 제곱, Partial Least Squares) 모델 — 를 학습시켰을 때, 개방형 스택은 단지 돌아간 것이 아니라 진정으로 유용한 모델을 만들어 냈습니다. R²(모델이 변동의 얼마만큼을 설명하는지, 1.0이 완벽)는 1에 가깝게 나왔고, RMSE(전형적인 예측 오차, 단위는 g/L)는 작게 나왔습니다.
PLS soft-sensor (titer from Raman): R2=0.9923 RMSE=0.1498 g/L (6 comps, 701 wavenumbers, 235 train / 101 test)
ASSERT ok: R2 > 0.85 — the Raman dataset is genuinely predictive of titer.
scikit-learn(BSD 라이선스)은 배치 내 보류 분할(within-batch hold-out split)에 대해 0.99의 R²를(현장 정확도가 아닙니다 — 적절한 배치 단위 제외 교차검증(leave-one-batch-out)과 적용 범위(applicability-domain) 한계는 공정 분석: SPC, MVDA & 소프트 센서에서 다룹니다) 공짜로 안겨 주었습니다 — 인라인 라만(Raman) 스펙트럼은 역가(titer)가 유가식 배양 동안 0에서 수 g/L까지 오르며 상승하는 항체 농도를 보고하는 바로 그 분자 밴드를 추적하는데, 그래서 PLS 모델이 R²=0.99로 그것을 복원해 냅니다. 화학계량학(chemometrics)을 이보다 더 잘 해낼 상용 PLS 엔진은 없습니다. 이쪽은 답이 쉬운 결론의 측면입니다. "바이오프로세싱 4.0(Bioprocessing 4.0)"에 관한 동료 심사(peer-reviewed) 조사들도 반대 방향에서 같은 결론에 도달합니다. 디지털 도구의 산업 채택을 가로막는 것은 알고리즘의 가용성보다는 공통 표준과 통합의 부재라는 것입니다 — 바로 개방형, 표준 기반 스택이 메우는 데 능한 그 간극입니다 [9].
그러나 그 단일 숫자가 무엇이 아닌지를 주목하세요. 그 숫자와 출하 등급 모델 사이의 간극이야말로 쉬운 결론이 어려워지는 바로 그 지점이기 때문입니다. R²=0.99는 배치 내 보류 분할 — 학습과 검증 행이 같은 유가식 배양에서 추출됨 — 에서 나왔는데, 배치 내 자매들은 독립적인 예시가 아닙니다. 이 캠페인의 모든 배치는 같은 작업 세포은행(working cell bank)에서 유래하며 종종 같은 미디어 로트와 같은 캡처 스키드를 공유하므로, 행 단위 무작위 분할은 거의 쌍둥이를 학습/검증 경계 양쪽에 들여보내고 모델은 사실상 이미 본 데이터로 스스로를 채점합니다. 정직한 규율은 그룹 분할(grouped split) — leave-one-batch-out, 한 배치의 모든 레코드를 한쪽에 통째로 — 이며, 이것이 5권의 모델과 검증 장이 구축하는 GroupKFold/중첩 교차검증(nested cross-validation) 기본값이고, derivedFrom 걷기가 추적하는 계보가 바로 그 분할의 그룹 키입니다. 현장 등급 소프트 센서는 또한 적용 범위(applicability domain) — 새 배치가 모델이 학습한 분광 엔벨로프 밖에 놓이면 예측을 거부하는 게이트(가령 PLS 호텔링 T²/SPE 쌍) — 가 필요하며, 그래서 자신만만하게 외삽하는 대신 자기 깊이를 벗어난 추측을 거부합니다 [9]. 그리고 일단 배포되면 공정 드리프트 논의가 다루는 MLOps 의 사후 생애 전체가 필요합니다. 라만 검정선은 자기 정확한 프로브에 묶여 있고(기기 대 기기 차이만으로 발표된 세포 밀도 예측이 약 20% 움직였고, 명시적 검정 전이(calibration transfer)가 그것을 절반으로 줄였습니다), 살아 있는 세포는 캠페인마다 진정으로 떠돌며(공정 드리프트, 보존해야 할 실재 신호), 예측기는 그 움직이는 공정에 대해 진부해집니다(모델 드리프트, 감지해야 할 결함) — 모니터가 구별해야 할 별개의 두 가지이며, 첫째는 레이블 없는 입력 드리프트 검사(PSI)로, 둘째는 드문 오프라인 기준점에서만 잡힙니다. 그 어느 것도 라이브러리로서의 scikit-learn에는 들어 있지 않습니다 — 그것들은 그 라이브러리를 둘러싼 검증된 생애주기에 삽니다. 그것이 바로 점수표의 구별입니다. 화학계량학 은 OSS 승리이지만, 출하에 영향을 주는 모델 — 그 출력이 처분(disposition)을 바꿀 수 있는 모델 — 은 진실 기록과 동일한 검증되고 책임지는 기준을 물려받으며, 그래서 분석 행은 엔지니어링과 모니터링에는 "승리", 출하에는 "검증된 모델링 플랫폼"으로 읽히는 것입니다.
어려운 행은 컴플라이언스 행이며, 그것이 어려운 이유는 가격표가 결코 보여 주지 않는 것들 때문입니다.
숨은 비용: 검증 부담, 공급망, 책임성
순진한 비용 비교는 오픈소스는 무료이고 상용 소프트웨어는 비싸다고 말합니다. 그 비교는 양쪽 방향 모두에서 틀렸으며, 이 장의 핵심은 바로 그 이유입니다.
검증 부담은 라이선스 비용이 사라질 때 함께 사라지지 않는다
이 책의 어떤 오픈소스 구성 요소도 "21 CFR Part 11 준수"(전자 기록과 전자서명을 규율하는 FDA 규정)로 출하되지 않는데, 컴플라이언스는 다운로드의 속성이 아니라 검증된 시스템 더하기 절차의 속성이기 때문입니다 — 머리말이 세웠고 모든 신뢰(Trust) 장이 강화한 주제입니다. GAMP 5(준수하는 GxP 전산화 시스템을 위한 ISPE 산업 지침)는 2판에서 규제 대상 기업(우수 제조 관리 기준, Good Manufacturing Practice을 따르는 제조사)이 자신의 검증 노력을 줄이기 위해 공급자 관여를 극대화하고 벤더 문서를 활용해야 한다고 명시합니다 [1]. 오픈소스를 선택하면 활용할 공급자가 없습니다 — 여러분이 공급자입니다. 사용자 요구사항, IQ/OQ/PQ(설치·운영·성능 적격성 평가, Installation, Operational, Performance Qualification — 오픈소스 스택 검증: GAMP 5 & CSA 참조), 추적성 행렬(traceability matrix), 공급자 평가(supplier assessment), 그 모든 것을 여러분이 작성합니다. 좋은 소식은, GAMP 5가 움직여 온 방향이자 FDA의 컴퓨터 소프트웨어 보증(Computer Software Assurance, CSA) 지침이 강하게 밀어붙이는 방향대로, 이 부담이 리스크 기반이라는 점입니다. 저위험, 비기록 구성 요소는 무거운 문서화 대신 자동화된 테스트와 기존 증거에 기댈 수 있습니다 [2]. 그래서 이 책은 테스트 스위트(make test)를 검증 증거로 삼고 모든 이미지를 태그로 핀 고정하며 불변의 sha256 다이제스트(digest)를 versions.lock에 기록했습니다(한 이미지, 즉 위치가 옮겨진 커뮤니티 Fuseki는 사용 전 검증 대상으로 표시) — 보증 노력을 사라지게 만들기 위해서가 아니라 가장 부담이 적게 만들기 위해서였습니다.
더 이상 벤더에게 돈을 주고 소유하게 하지 않는 공급망
여러분은 더 이상 벤더에게 비용을 지불해 소유하게 하지 않는 공급망을 물려받습니다. 오픈소스를 선택한다는 것은 제3자 및 공급망 리스크를 스스로 관리하기로 선택하는 것입니다. NIST의 보안 소프트웨어 개발 프레임워크(Secure Software Development Framework)는 그 의무를 직접적으로 명명합니다. 여러분은 재사용하는 구성 요소를 검토하고, 그렇지 않았다면 벤더에게 위임했을 보안 요구사항을 직접 표현해야 합니다 [6]. 2026년의 현실 — 그해 초 널리 사용되는 컨테이너 스캐너의 손상된 릴리스(release) 사건 — 은 여러분의 보안 도구조차 위협 표면(threat surface)의 일부라는 점을 일깨워 줍니다.
오픈소스의 답은 투명성입니다. 소프트웨어 자재 명세서(Software Bill of Materials)는 벤더 없이 진실 기록을 소유할 수 있도록 공급자, 구성 요소, 버전에 대한 가시성을 제공하면서, 여러분이 방금 떠맡은 유지보수를 정직하게 문서화합니다 [7]. 그리고 이를 위한 도구 자체가 훌륭한 오픈소스입니다 — Syft는 컨테이너 이미지나 파일시스템에서 곧바로 SBOM을 생성합니다 [8]. 저장소에는 핀 고정된 모든 compose 이미지에 대해 Syft를 실행하는 make sbom 타깃이 있습니다(examples/Makefile 참조). 아래 명령은 그것이 하는 일의 단일 이미지 형태입니다 — versions.lock에 핀 고정된 실제 히스토리안 이미지를 대상으로 실행하면, 실제로 무엇이 돌아가는지를 다이제스트별로 정확히 목록화합니다.
# The single-image shape of `make sbom`. Inventory the real historian/relational
# image — the accountability OSS *can* deliver.
syft timescale/timescaledb:2.17.2-pg17 -o spdx-json > sbom.spdx.json
NTIA 최소 요소 — 공급자, 구성 요소 이름, 버전, 고유 식별자, 의존성 관계, 작성자, 타임스탬프 — 를 갖춘 SBOM은 오픈소스 운영자가 "벤더에게 전화하기"를 대신하는 수단입니다. 누구의 허락도 없이 내 스택에 무엇이 들어 있고 어디에서 왔는지에 답할 수 있습니다 [7].
SBOM 레코드 해부: 운영자가 벤더에게 전화하기를 대신하는 수단
그 일곱 요소의 목록은 Syft가 쓸 파일을 열어 보기 전까지는 추상적입니다. spdx-json 출력은 이미지를 패키지의 그래프로 기술하는 하나의 큰 JSON 문서입니다. 단일 패키지 항목 하나를 골라 내면 — 가령 히스토리안 컨테이너가 링크하는 OpenSSL 라이브러리 — NTIA 최소 요소 일곱 가지 각각이 구체적인 JSON 필드에 대응합니다. 아래 해부는 바로 그 패키지 하나를 필드별로 본 것입니다. 그것은 또한 이 책이 examples/platform/db/40-gov.sql에서 구축하는 gov.supplier_register 테이블 — component, image, digest, license, gamp_category — 의 필드 수준 거울이기도 합니다. 주석이 말하듯 그 테이블은 versions.lock으로부터 생성되며, SBOM이 목록화하는 것과 동일한 다이제스트 핀입니다. 이렇게 펼쳐 보이는 핵심은 추상적인 의무를 구체적으로 만드는 데 있습니다. libssl3(OpenSSL 암호화 라이브러리)에 대한 CVE(공통 취약점 및 노출, Common Vulnerabilities and Exposures 항목 — 고유 ID가 붙어 공개 발표된 보안 결함)가 터졌을 때, 이 레코드의 versionInfo와 PURL(패키지 URL, Package URL — 패키지와 그 정확한 버전을 지명하는 표준 문자열)이 바로 내가 영향을 받는가를 몇 초 안에, 전화통 너머의 벤더 없이 답하게 해 주는 것입니다.
하나의 SPDX 패키지 항목을 일곱 가지 NTIA 최소 요소에 대비해 해부한 것 — 오픈소스 운영자가 벤더에게 전화하기를 대신하는 수단이며,
versions.lock에 핀 고정된 실제 다이제스트에 근거합니다.
저자가 AI의 도움을 받아 직접 제작한 그림입니다.
표시된 값은 timescale/timescaledb:2.17.2-pg17 같은 Debian 기반 이미지에 대해 Syft가 내보내는 것을 대표하는 예시입니다. 필드들 — name, versionInfo, supplier, externalRefs, relationships, creationInfo.creators, creationInfo.created — 은 NTIA 최소 요소가 요구하는 바로 그 SPDX 2.3 운반 필드입니다 [7]. make sbom 타깃은 CycloneDX를 내보냅니다. 여기 해부는 그에 상응하는 SPDX 2.3 필드를 사용합니다 — 둘 다 일곱 가지 NTIA 최소 요소를 운반하며, 이 요소들은 형식에 구애받지 않습니다. 이것이 제공하는 책임성은 실재하지만, 그 형태를 주목하세요. SBOM은 무엇과 어디에서 왔는지를 말해 줍니다. 그것이 고장 났을 때 누가 답하는지는 말해 주지 않습니다 — 그리고 그것이 바로 오픈소스가 구조적으로 공급할 수 없는 한 가지 비용입니다.
책임성은 오픈소스로 대체할 수 없는 비용이다
조사관이 여러분의 배치 기록(batch record)에서 데이터 무결성(data integrity) 문제를 발견했을 때, 누가 그것에 답할 것인지에 대해 EU Annex 11(전산화 시스템에 대한 EU GMP 규정)은 분명합니다. 공급자의 책임을 명시한 공급자와의 공식 합의가 있어야 하고, 공급자는 평가되어야 하며, 규제 대상 제조사가 궁극적으로 책임을 진다는 것입니다 [3]. 상용 벤더는 그 공식 합의에 서명하고 그 책임을 계약상으로 집니다. 오픈소스 프로젝트의 라이선스는 설계상 모든 보증을 부인합니다. 진실 기록 자체 — FDA 지침이 신뢰할 수 있고, 정확하며, 귀속 가능하고, 검토된 감사 추적을 갖출 것을 요구하는 데이터 [4] — 에 대해서는, 그 결여된 책임성이야말로 책임 있는 구축-대-구매 결정을 검증된, 벤더가 뒷받침하는 시스템 쪽으로 기울게 하는 바로 그 요인입니다.
이것이 바로 우리 컴플라이언스 계층이 자신의 한계에 대해 정직한 이유입니다. examples/platform/db/50-alcoa.sql의 ALCOA+(귀속 가능, 판독 가능, 동시 기록, 원본, 정확 — 더하여 지속성과 가용성, Attributable, Legible, Contemporaneous, Original, Accurate) 감사 체인은 아름답고 무료인 메커니즘입니다 — 그러나 맨 위의 주석을 읽어 보세요.
-- 50-alcoa.sql — ALCOA+ by construction (Chapters 20 & 21).
-- A generic, trigger-based audit trail: every INSERT/UPDATE/DELETE on a
-- registered table is appended to audit.change_log with who/what/when/old/new,
-- and each row is hash-chained to the previous one so tampering is *detectable*.
-- The book is explicit that a superuser who disables the trigger can still
-- bypass this — hash chaining makes tampering evident, not impossible.
make alcoa는 audit.verify_chain()을 실행하고 체인이 온전할 때 깨진 링크 0개를 반환합니다. 그것은 실재하며, 가질 만한 가치가 있습니다. 그러나 "탐지 가능하지만, 불가능하지는 않음"은 다섯 단어로 압축된 결론 전부입니다. 메커니즘은 오픈소스이고, 컴플라이언스 — 검증된 절차, 변경 통제(change control), 책임을 지는 소유자 — 는 하이브리드의 마지막 한 구간입니다.
현장 증거: OSS LIMS 격차 분석이 실제로 발견한 것
이것은 추상적인 걱정이 아닙니다. 증거는 발표되어 있습니다. 이 책이 교육용 시스템으로 사용한 오픈소스 LIMS인 SENAITE가 가장 깨끗하게 문서화된 사례입니다. SENAITE에 대한 유일한 공개 21 CFR Part 11 격차 분석 — 버전 1.3.2, 2019년 10월 1일자로 프로젝트 자체 커뮤니티 포럼에 게시됨 — 은 규정을 요구사항 하나하나 따라가며 예상 가능한 열린 격차들을 발견합니다. 전자서명 처리, 감사 추적의 완전성, 계정 식별과 비밀번호 통제, 데이터 보존 강제는 모두 다운로드가 이미 갖춘 속성이 아니라 구현자가 여전히 해야 할 작업으로 표시됩니다 [11]. 그 문서야말로 기억해 둘 현장 실패입니다. 그것은 6년이 되었고, 오래전에 대체된 버전을 대상으로 작성되었으며, 공인 평가자가 아니라 커뮤니티가 작성한 것입니다 — 그래서 그것은 최신의, 방어 가능한 검증 기록이 되지는 못한 채 격차의 방향만을 알려 줍니다. 그 교훈은 SENAITE를 넘어 점수표의 모든 도구로 일반화됩니다. 오픈소스 프로젝트는 훌륭한 소프트웨어일 수 있으면서도 Part 11이 요구하는 검증된 절차, 서명 통제, 보존 강제를 전혀 출하하지 않을 수 있습니다. 격차 분석은 "이것을 우리 스스로 검증해야 한다"를 구호에서 체크리스트로 바꾸는 산출물입니다 — 앞 절이 결코 사라지지 않는다고 말한 바로 그 검증 부담입니다.
구축-대-구매 프레임워크, 그리고 그것을 ADR로 기록하기
그렇다면 계층별로 실제로 어떻게 결정할까요? 프레임워크는 하나의 질문을 네 가지 방식으로 묻는 것입니다.
- 이 계층은 규제 대상 통제 전략(control strategy)이나 진실 기록에 닿는가? 이 계층을 통과하는 값이 출하 결정을 바꿀 수 있다면, 기준은 "검증되고 책임을 진다"입니다. 그것이 기록의 하류(downstream)에 있는 엔지니어링, 모니터링, 또는 분석이라면, 오픈소스가 대개 더 나은 구매입니다. A-Mab 사례 연구 — ICH Q8(R2)/Q9/Q10 지침(의약품 개발, 품질 리스크 관리, 품질 시스템에 대한 국제 조화 표준)에 근거한 정통 유가식 CHO + 프로테인 A QbD(설계 기반 품질, Quality by Design — 나중에 시험으로 품질을 확인하는 대신 공정을 이해하여 품질을 처음부터 설계해 넣는 것) 참조 — 는 어떤 파라미터가 핵심(critical)인지, 따라서 스택의 어느 부분이 그 기준을 물려받는지를 보여 주는 지도입니다 [10]. 구체적으로, "진실 기록"은 1권이 따라가는 하류 정제 트레인에 매달린 처분입니다. 프로테인 A 포집 풀의 숙주세포 단백질(host-cell protein) 제거, 직교(orthogonal) 바이러스 안전 단계(바이러스 불활화와 20나노미터 바이러스 여과)에 걸쳐 합산된 로그 감소 값(log-reduction value, LRV — 한 단계가 오염물을 줄이는 10의 거듭제곱 수), 폴리싱 단계의 응집체 제거, 그리고 UF/DF의 최종 농도와 완충액입니다. 그 각각은 합격 한계가 출하를 결정하는 CQA이므로, 그 결과를 보유하고 서명하는 시스템은 검증되고 책임지는 기준을 물려받습니다 — 반면 같은 스키드의 공정 중 압력을 단지 추세화하는 히스토리안은 그렇지 않습니다. 그 경계는 소프트웨어 질문이기에 앞서 단위공정 질문입니다.
- 검증 부담은 무엇이며, CSA가 그것을 비례적으로 만들 수 있는가? 저위험 히스토리안 읽기-복제본(read-replica, 다른 시스템이 결코 쓰기 없이 쿼리할 수 있는 데이터베이스의 읽기 전용 사본)은 보증 비용이 저렴합니다. 배치 처분(batch disposition)에 대한 자격을 갖춘 전자서명을 포착하는 시스템은 그렇지 않습니다 [2]. 그 부담은 구체적입니다. 규제 경로 위의 시스템은 IQ/OQ/PQ 사다리를 얻습니다 — 설치 적격성 평가(installation qualification)는 그것이 명시된 버전으로 배포되었음을 증명하고(
versions.lock의 태그-더하기-다이제스트 핀이 이를 기계 검사 가능한 증거로 제공합니다), 운영 적격성 평가(operational qualification)는 그것이 자기 범위 전반에서 규격대로 동작함을 증명하며, 성능 적격성 평가(performance qualification)는 종단 간 동작이 실제 데이터에서 알려진 결과를 재현함을 증명합니다 — 그리고 이미지 다이제스트, 스키마, 또는 로드 작업에 대한 이후의 어떤 변경도 핫패치되는 대신 변경 통제 아래 그 사다리에 다시 들어갑니다. 그리고 플랜트는 영원히 한 사이트가 아니므로, 같은 증거는 기술 이전(tech transfer)을 통해 이동합니다. 스택이 개발 사이트에서 상용 플랜트로 옮겨 가거나, 10리터 개발 바이오리액터에서 2000리터 생산 트레인으로 스케일업될 때, 검증된 산출물은 다시 발명되는 대신 받는 사이트의 시스템에 대해 재자격(re-qualify)됩니다 — 다이제스트로 핀 고정하고 개방형 표준 위에 모델링하는 것(그래서 IRI와 SHACL 형상이 그대로 이동하는 것)이 CSA가 비례적으로 만들려는 그 이동의 비용을 낮추는 이유가 바로 그것입니다. - 검사에 실패하면 누가 책임을 지는가? 정직한 답이 "보증 없이, 우리 말고는 아무도"라면, 그것은 무료가 아니라 실재하는 비용입니다 [3].
- 대안의 종속(lock-in) 비용은 얼마인가? 개방형 표준(OPC UA, MQTT/Sparkplug, ISA-88/95, RDF)은 OSS를 지지하는 가장 강력한 논거입니다. 그것들은 모든 미래 마이그레이션을 더 저렴하게 만들고, SBOM은 문을 열어 둡니다 [7].
바이오프로세싱 문헌은 같은 갈림길을 세 가지 실행 경로로 표현합니다. 시스템 통합업체와 제휴하거나, 기성품을 구매하거나, 사내에서 개발하는 것 — 그리고 낮은 인더스트리 4.0(Industry 4.0) 채택과 공통 표준의 부재가 그 선택을 어렵게 만든다는 점을 기록합니다 [9]. 점수표는 여러분이 근거를 기록할 때에만 영업 홍보가 아니게 됩니다. 의견을 방어 가능한 엔지니어링 결정으로 바꾸어 주는 규율이 바로 아키텍처 의사결정 기록입니다. 맥락, 결정, 그 결과를 담은 짧고 날짜가 박힌 문서입니다 [5]. 저장소가 그것이 규율하는 코드 옆에 커밋하도록 권하는 템플릿이 여기 있습니다.
# ADR-0028: Build-vs-buy for the GMP record-of-truth
- Status: Accepted Date: 2026-06-14
## Context
The fed-batch CHO + Protein A line needs a system of record for the
batch disposition. Open-source Postgres + audit hash chain makes
tampering *detectable* (make alcoa -> 0 broken links) but ships no
vendor accountability and is not Part 11-compliant out of the box.
## Decision
Use a VALIDATED commercial MES/eQMS for the signed record of truth.
Keep the OSS stack (TimescaleDB historian, contextualization, SPARQL
digital thread, PLS soft-sensor) as a read-mostly NOA (NAMUR Open
Architecture)-side layer.
## Consequences
+ Vendor carries the Annex 11 supplier agreement & accountability.
+ OSS layer stays cheap, fast to evolve, lock-in-resistant (open standards).
- Two systems to reconcile; the OSS<->MES boundary must stay explicit.
- We still own validation of the OSS layer (risk-based, CSA-leveraged).
ADR의 핵심은 결론 그 자체가 아닙니다. 여섯 달 뒤 누군가 "왜 그냥 모든 것에 Postgres를 쓰지 않았나요?"라고 물을 때, 그 답이 근거가 온전한 채로 기록되어 있다는 것입니다.
ADR 해부: 엔지니어가 떠난 뒤에도 살아남도록 결정을 기록하기
위 템플릿은 의도적으로 짧으며, 그 안의 모든 줄이 하중을 받는 부재입니다. 엔지니어링 산출물로서의 ADR의 기원인 Michael Nygard의 원래 정식화는 그저 몇 개의 이름 붙은 섹션일 뿐이며, 각 섹션은 감사관이나 후임자가 언젠가 묻게 될 하나의 질문에 답합니다 [5]. ADR-0028을 필드별로 읽으면 그 규율이 드러납니다. id는 영원히 인용할 수 있는 안정적이고 정렬 가능한 핸들이고, status는 이것이 초안 의견인지 살아 있는 약속인지를 말하며, date는 이 근거가 참이었던 때를 찍는데 맥락은 나이를 먹기 때문입니다. context는 결론 이전의 작용하는 힘들을 진술하여 독자가 그것이 여전히 유효한지 판단하게 하고, decision은 이 레코드가 약속하는 단 하나의 선택이며, consequences는 승리와 비용을 의도적으로 정직하게 나열하여 나중에 누구도 그 트레이드오프가 공짜였던 척하지 못하게 합니다.
ADR-0028을 필드별로 해부 — 슬러그, 상태 알약, 날짜, 컨텍스트, 결정, 정직한 플러스-마이너스 결과, 그리고 나중의 결정이 이것을 지우지 않고 은퇴시키게 해 주는 supersedes 연결.
저자가 AI의 도움을 받아 직접 제작한 그림입니다.
대부분의 엔지니어가 건너뛰지만 감사에서 가장 중요한 필드는 암묵적인 supersedes / superseded-by 연결입니다. ADR은 제자리에서 편집되지 않습니다 — 트레이드오프가 바뀌면 옛것을 대체하는 새 ADR을 작성하고, 옛것은 날짜가 온전한 채로 저장소에 남습니다. 그 추가 전용 습관은 ALCOA+ 감사 체인이 데이터에 강제하는 바로 그 습관을 결정에 적용한 것입니다. 왜의 기록은 무엇의 기록만큼 불변입니다. 누구나 조용히 덮어쓸 수 있는 위키 페이지는 이렇게 할 수 없지만, 그것이 규율하는 코드 옆에 커밋된 날짜 박힌 파일은 할 수 있습니다.
결론 자체가 트리플이고, 경계는 SHACL 형상이다
점수표의 핵심 산출물 — ADR이 잉크로 그어 둔 OSS<->MES 경계 — 은 단지 마크다운 표가 아닙니다. 그것은 이 책이 이미 구축한 디지털 스레드 계층이 데이터로 운반할 수 있는 무언가입니다. 의미론 장은 플랜트를 RDF로 모델링했는데, 거기서 모든 사실은 주어-술어-목적어 트리플(triple, 자원 기술 프레임워크의 원자)이고 계보는 derivedFrom 엣지의 사슬입니다 — 의미론과 지식 그래프 참조. 구축-대-구매 결정은 같은 그래프로 곧장 떨어집니다. bp:DispositionRecord bp:governedBy bp:ADR-0028 과 bp:DispositionRecord bp:ownedBy bp:ValidatedMES 는 어느 계층이 서명된 기록을 소유하는지를 기록하는 두 트리플이며, 이는 온톨로지 책이 출하된 로트가 bp:QP-role에 귀속된 서명을 지닌다고 기록하는 것과 같은 방식입니다(상위 척추, 관계와 계보). 데이터로 진술되면 경계는 기계 검사 가능해집니다.
그것이 점수표의 "검증되고 책임지는" 기준이 기억되는 대신 강제되게 합니다. 온톨로지 책에서 출하 규격은 닫힌 세계 SHACL 게이트(형상 제약 언어, Shapes Constraint Language — 그래프가 요구된 구조를 갖췄는지 검증하는 W3C 표준)입니다. bp:ReleaseShape는 출하된 모든 로트가 CQA마다 정확히 하나의 규격 내 값 그리고 귀속 가능한 bp:approvedBy 서명 — 21 CFR Part 11 / Annex 11 조건 — 을 지니도록 고집하며, 어느 하나라도 빠지면 닫힌 채로 실패합니다 — 출하 게이트와 SHACL. 이 장이 주장하는 경계는 형상 하나를 더 추가하면 따라 나옵니다. bp:DispositionRecord로 타입된 어떤 노드든 검증되고 벤더가 뒷받침하는 시스템에 bp:ownedBy 여야 한다는 제약이며, 그래서 맨 OSS 감사 체인에 연결된 처분은 서명이 빠진 것과 정확히 똑같이 게이트를 실패합니다. 그 규율은 온톨로지 책이 실행 가능한 역량 질문(competency question, CQ — 모델이 답해야 하는 질문을 기대 결과와 짝지어 PASS/FAIL 테스트로 돌리는 것)으로 돌리는 바로 그것입니다. "모든 서명된 처분이 책임지는 시스템에 소유되어 있는가?"는 한 줄짜리 ASK 쿼리이고, "대체된 ADR이 규율하는 모든 기록을 보여 달라"는 위의 그 supersedes 연결을 걷습니다. 다시 말해 결론은 산문만이 아닙니다 — 그것은 게이트가 검사할 수 있는 트리플이며, 바로 그 개방형 표준의 이식성(독점 그래프 대신 RDF)이 애초에 디지털 스레드 행을 OSS 승리로 만든 것입니다.
정직한 하이브리드 목표 아키텍처
점수표와 프레임워크를 합치면, 실제 시설이 실제로 출하하는 아키텍처가 나옵니다 — "전부 오픈소스"도 아니고 "전부 상용"도 아닌, 경계선을 잉크로 그어 둔 의도적인 하이브리드입니다.
정직한 하이브리드. 넓은 오픈소스 구역 — 여러분이 이 책에서 구축한 모든 것 — 은 연결성, 히스토리화, 맥락화, 의미론, 분석을, 종속에 강한 개방형 표준 위에서 모두 처리합니다. 좁은 상용-검증 구역은 서명된 진실 기록과 자격을 갖춘 서명을 소유하는데, 여기서는 벤더 책임성이 타협 불가입니다. 둘 사이의 선은 읽기 위주의 NOA(NAMUR Open Architecture) 경계입니다. 개방형 스택은 읽고 모델링하며, 검증된 시스템은 기록을 보유합니다. 저자가 AI의 도움을 받아 직접 제작한 그림입니다.
이것은 약함에서 비롯된 타협이 아닙니다. 그것은 가장 강력한 설계입니다. 오픈소스가 진정으로 더 나은 곳 — 속도, 비용, 개방성, 종속 저항성 — 에 오픈소스를 쓰고, 책임성이 진정으로 요구되는 곳에 책임성을 씁니다.
왜 중요한가
이 결론을 어느 방향으로든 틀리게 내리면 대가를 치릅니다. 무료라는 이유로 검증되지 않은 오픈소스 위에 규제 대상 기록을 구축하면, 검사 도중에 "무료"가 결코 예산에 잡지 않은 검증-및-책임성 청구서를 동반했음을 알게 됩니다 [3]. 안전하게 느껴진다는 이유로 모든 것을 상용으로 구매하면, 개방형 표준이 공짜로 해 주는 연결성, 히스토리화, 분석에 벤더 마진을 지불하면서, 슬그머니 여러분 자신의 데이터로부터 스스로를 잠가 버립니다. 제대로 해내는 엔지니어는 계층별로 우리가 무엇을 구축했고, 무엇을 구매했으며, 그 기록된 근거가 무엇인지를 말할 수 있는 사람들입니다 — 점수표, 프레임워크, ADR가 여러분에게 주는 것이 정확히 이것입니다.
실제 현장에서는
이 장이 점수 매긴 하이브리드가 실제로 출하되는 패턴입니다. 실제 CHO + 프로테인 A mAb 시설은 서명된 진실 기록을 위해 검증된 상용 MES와 히스토리안을 운영하며, 점점 더 그 옆에 맥락화, 분석, 엔지니어링을 위한 오픈소스 계층을 함께 운영합니다 — 그 계층은 소유 비용이 더 저렴하고 더 빠르게 진화하며, 개방형 표준이 데이터의 이식성을 유지해 주기 때문입니다. 같은 점수표는 업스트림이 고전적 유가식이든 다중 컬럼 연속 포집을 갖춘 강화 관류(intensified perfusion)든 동일하게 성립합니다. 규제 대상 기록의 경계는 움직이지 않습니다. 이 경계들이 이론적이지 않고 실재해야 하는 지점을 주의 깊게 새기세요. 2026년 중반 현재 이 책의 어떤 오픈소스 도구도 — PostgreSQL도, Grafana도, Fuseki도, Keycloak(오픈소스 신원 및 로그인 서버)도 — "Part 11 준수 제품"으로 출하되지 않습니다. 그것들은 메커니즘을 출하하며, 여러분은 컴플라이언스를 구축하고, 검증하며, 절차로 둘러쌉니다. 이 책이 교육용 시스템으로 다룬 OSS LIMS인 SENAITE는 경고의 각주입니다. 그 유일하게 발표된 Part 11 격차 분석(gap analysis)은 2019년 것이고, 여전히 전자서명, 보존, 비밀번호 통제에서 실재하는 격차를 나열합니다 [11]. 마케팅 성숙도는 검증된 성숙도가 아닙니다 — 그리고 정직한 결론은 그 구별을 잉크로 지켜 내는 결론입니다.
핵심 용어
- 구축-대-구매(Build-vs-buy) — 계층마다 내리는, 오픈소스 부품으로 능력을 조립할지(구축) 벤더 제품을 라이선스할지(구매) 사이의 결정; 흔히 의도적인 하이브리드로 해결된다.
- 총소유비용(Total cost of ownership, TCO) — 어떤 선택의 전체 생애 비용으로, 어떤 가격표도 보여 주지 않는 비용을 포함한다: 검증 부담, 공급망 유지보수, 그리고 벤더 책임성 결여의 비용.
- 아키텍처 의사결정 기록(Architecture Decision Record, ADR) — 하나의 아키텍처 선택에 대한 맥락, 결정, 결과를 담은 짧고 날짜가 박힌 버전 관리 문서로, 그 결정을 내린 엔지니어가 떠난 뒤에도 근거가 살아남도록 한다.
- 검증 부담(Validation burden) — 규제 대상 기업이 수행해야 하는 IQ/OQ/PQ, 추적성, 공급자 평가 노력; 리스크 기반 CSA와 공급자 증거 활용으로 줄일 수는 있으나 없앨 수는 없다 — 오픈소스에는 여러분이 공급자이기에 결여된 것.
- 벤더 책임성(Vendor accountability) — Annex 11이 요구하는 합의에 따라 상용 공급자가 지는 계약상 책임; 라이선스가 보증을 부인하기에 오픈소스가 구조적으로 공급할 수 없는 비용.
- 소프트웨어 자재 명세서(Software Bill of Materials, SBOM) — 시스템 안의 모든 구성 요소, 버전, 공급자에 대한 공식 목록; 오픈소스 운영자가 "벤더에게 전화하기"를 대신하는 수단이자, 공급망 리스크를 투명하게 소유하는 기반.
- NTIA 최소 요소(NTIA minimum elements) — 사용 가능한 SBOM이 모든 구성 요소에 대해 담아야 하는 일곱 가지 데이터 필드 — 공급자, 구성 요소 이름, 버전, 고유 식별자, 의존성 관계, SBOM 데이터 작성자, 타임스탬프 — 이며, 각각은 SPDX나 CycloneDX 레코드의 구체적인 필드에 대응한다.
- 대체(Supersede, ADR 생애주기) — 바뀐 결정을 원본을 편집하지 않고 옛것을 대체하는 새 ADR로 포착하는 추가 전용 관례; 감사 체인이 데이터를 불변으로 유지하듯, 날짜가 박힌 근거를 불변으로 유지한다.
- 정직한 하이브리드(Honest hybrid) — 이 책이 주장하는 목표 아키텍처: 연결성에서 분석까지를 담당하는 넓은 오픈소스 구역과, 서명된 기록을 담당하는 좁은 상용-검증 구역이, 읽기 위주의 NOA(NAMUR Open Architecture) 경계에서 이어진 형태.
- 그룹(leave-one-batch-out) 분할 — 한 배치의 모든 레코드 — 이상적으로는 한 세포은행에서 나온 모든 배치 — 를 학습/검증 경계의 한쪽에 통째로 두어, 모델이 진정으로 본 적 없는 로트로 채점되게 하는 검증 규율;
derivedFrom계보가 곧 그 그룹 키이며, 소프트 센서의 R²=0.99 뒤에 있는 배치 내 보류 분할은 이것이 아니므로 그 숫자는 현장 정확도가 아니라 배치 내 결과다. - 적용 범위(Applicability domain) — 모델이 학습한 입력의 엔벨로프, 그리고 새 배치가 그 밖에 놓이면 예측을 거부하는 게이트(소프트 센서의 경우 PLS 호텔링 T²/SPE 쌍); 그래서 출하에 영향을 주는 모델은 자기 깊이를 벗어난 추측 대신 자신만만한 외삽을 거부한다.
- 공정 드리프트 대 모델 드리프트(Process drift vs. model drift) — 공정 드리프트는 살아 있는 세포가 캠페인마다 진정으로 떠도는 것으로, 디지털 스레드가 보존해야 할 실재 제조 신호이고, 모델 드리프트는 예측기가 그 움직이는 공정에 대해 진부해지는 것으로, 감지해야 할 결함이다 — 둘을 혼동하면 모니터가 헛짖거나 실재 이동을 놓친다.
- 처분 경계 형상(Disposition-boundary shape) — 점수표의
OSS<->MES경계를 기계 검사 가능하게 만드는 SHACL 제약:bp:DispositionRecord는 검증되고 책임지는 시스템에bp:ownedBy여야 하며, 그래서 맨 OSS 감사 체인에 연결된 서명된 기록은 서명이 빠진 것과 정확히 똑같이 게이트를 실패한다 — 역량 질문 테스트가 강제할 수 있는 트리플로 표현된 결론.
다음 이야기
그것이 결론이며, 구축의 끝입니다. 짧은 한 절이 남아 있습니다. 참고문헌(References) — 이 책의 모든 주장 뒤에 있는 검증된 출처들, 그리고 "모든 주장은 실행 가능하거나 인용되어 있다"가 우리가 지킨 약속이었음을 합당하게 확인하고 싶어 하는 검토자에게 건넬 수 있는 인용들입니다.