창고에 물건을 대충 던져 넣으면, 나중에 정작 필요한 걸 찾을 때 창고 전체를 뒤져야 한다 — 온톨로지도 똑같다
온톨로지 설계, 처음부터 잘하는 사람은 없다
온톨로지를 처음 설계할 때는 대개 “일단 데이터부터 넣고 보자”는 식으로 시작한다. 문제는 그렇게 쌓인 Object Type이 나중에 정리가 안 된 창고처럼 되어버린다는 점이다. 뭐가 어디 있는지, 같은 물건이 몇 군데 겹쳐 있는지 아무도 모른다.

Palantir 공식 문서는 이런 실수를 8가지 안티패턴으로 정리해두고 있다.[1] 이 중 “같은 고객을 세 가지 이름으로 부르는 문제”는 이미 다른 글에서 다뤘으니, 여기서는 나머지 실전에서 자주 마주치는 6가지를 정리한다.
실수 1: 뭐든 한 박스에 다 넣는다 — God Object
창고에 “자산”이라고 적힌 박스 하나를 만들어 놓고, 장비도 넣고, 소프트웨어 라이선스도 넣고, 부동산 문서도 넣고, 금융 상품 계약서도 넣는다고 해보자. 박스 하나만 열면 다 나오니 편해 보이지만, 실제로 뭘 찾으려면 박스 전체를 뒤져야 한다.
공식 문서가 드는 예시가 정확히 이거다 — 장비, 소프트웨어 라이선스, 부동산, 금융상품을 전부 하나의 Asset Object Type으로 욱여넣는 경우다.[1] 이게 바로 God Object다. 해결책은 각각을 별도 Object Type으로 쪼개고, 공통으로 필요한 속성(예: “감가상각 대상인가”)은 인터페이스로 묶는 것이다.[1]
실수 2: ETL 부산물까지 다 옮겨 담는다 — Kitchen Sink
창고 정리를 한다면서 이삿짐 상자에 붙어 있던 운송장 라벨, 포장 테이프 조각까지 같이 보관하는 사람은 없다. 그런데 온톨로지에서는 이게 자주 벌어진다. CRM 데이터를 온톨로지로 옮기면서 _crm_extracted_at, _crm_batched_at 같은 ETL 처리 메타데이터까지 그대로 속성으로 끌고 오는 경우다.[1]
이런 필드는 비즈니스 사용자에게 아무 의미가 없다. 원본 시스템의 기술적 흔적일 뿐이다. 공식 문서의 원칙은 명확하다 — 비즈니스 또는 기술적 가치가 분명한 속성만 의도적으로 선별해서 담는다.[1]
실수 3: 망치 하나로 모든 걸 두드린다 — Golden Hammer
정리를 잘하는 사람도 도구를 잘못 쓰면 창고가 엉망이 된다. 못을 박아야 할 곳에 스크루드라이버를 쓰고, 나사를 조여야 할 곳에 망치를 쓰는 식이다. 온톨로지에서는 Action Type과 파이프라인을 헷갈려 쓰는 경우가 여기에 해당한다.
공식 문서는 대량 배치 처리를 Action Type으로 구현하거나, 반대로 사용자가 직접 판단해야 하는 자동 할당 업무를 파이프라인으로 처리하는 걸 예로 든다.[1] 원칙은 이렇다 — 사람이 판단해서 결정을 내리는 일에는 Action Type, 자동화된 대량 변환에는 파이프라인.[1] 도구를 작업 성격에 맞게 골라야 한다.
실수 4: 서랍 하나에 손잡이를 열 개 만든다 — Action Sprawl
서랍 하나 여는데 손잡이가 열 개씩 달려 있으면 오히려 헷갈린다. 온톨로지에서 “직원 이름 업데이트”, “이메일 업데이트”, “부서 업데이트” 액션을 각각 따로 만드는 게 이 경우다.[1]
실제로는 “직원 정보 수정”이라는 하나의 비즈니스 작업 안에 이름·이메일·부서 변경이 같이 일어나는 경우가 대부분이다. 공식 문서의 해법은 관련된 변경사항을 하나의 비즈니스 작업 단위 Action으로 번들링하는 것이다.[1]
실수 5: 옛날 영수증도 창고에 그대로 쌓아둔다 — Time Machine
계약서를 개정할 때마다 v1, v2, v3를 전부 별도의 독립된 물건처럼 창고 선반에 나란히 올려두는 경우가 있다. 공식 문서는 계약의 각 버전을 별도 Object로 만드는 걸 Time Machine 안티패턴으로 부른다.[1]
해결책은 계약을 하나의 Object로 유지하면서, 이력은 연결된 별도 이력 Object Type이나 시계열 속성으로 관리하는 것이다.[1] 버전 자체가 새로운 엔티티인 것처럼 다루면, “지금 유효한 계약이 뭐냐”는 질문에 답하기 위해 매번 최신 버전을 찾아 헤매야 한다.
실수 6: 라벨에 “물건”이라고만 써 붙인다 — The Misnomer
창고 선반에 “물건”, “것”, “종류”라고만 적어놓으면 나중에 아무도 뭐가 들었는지 모른다. 온톨로지에서 Item, value, type, date 같은 모호한 이름을 쓰는 경우가 이거다.[1] 공식 문서는 Product, monetaryValue, orderPlacedDate처럼 구체적이고 사람이 읽어서 바로 이해되는 이름을 쓰라고 권한다.[1]
그래서 창고를 어떻게 정리할 것인가 — 4가지 원칙
공식 문서는 위 실수들을 피하기 위한 설계 원칙을 우선순위 순으로 정리해두고 있다.[2]
- 현실을 모델링하지, 원본 데이터를 모델링하지 않는다. CSV 한 줄을 그대로 옮기는 대신(“OrderData”에 고객명·이메일·상품코드가 뒤섞인 형태), 주문·고객·상품을 별도 엔티티로 나눈다.[2]
- 세 번째 반복되면 리팩토링한다. 같은 구조를 두 번은 우연일 수 있지만, 세 번째부터는 패턴이다 — 즉시 통합하거나 인터페이스로 추상화한다.[2]
- 핵심은 보호하고, 확장은 열어둔다. 기존 Object Type에 새 속성을 계속 추가하는 대신, 별도 연결 Object Type이나 인터페이스로 확장한다. 예를 들어 장비에 인증 정보가 필요하면
Equipment를 건드리지 않고Equipment Certification을 새로 연결한다.[2] - 깊은 상속 대신 조합을 쓴다. 하나의 대상이 여러 성격(건물이면서 동시에 예약 가능한 자원인 경우 등)을 가질 때, 상속 체인을 깊게 파지 말고
Building,SchedulableResource같은 인터페이스를 여러 개 조합한다.[2]
공식 문서는 이 원칙들이 “절대 법칙이 아니라 가이드”라고도 명시한다.[2] 마감이 급하면 일단 합리적인 선에서 구현하고 개선 계획을 남기는 것도 괜찮다 — 다만 명명, 의미의 명확성, 보안만큼은 타협하지 말라고 못박는다.[2]
FAQ
Q. 이 안티패턴들을 지금 당장 다 고쳐야 하나요? 아닙니다. 공식 문서도 트레이드오프를 인정합니다. 성능이나 마감 때문에 일부 타협은 가능하지만, 명명 규칙과 의미의 명확성만큼은 나중에 고치기가 훨씬 어려우니 초기에 신경 쓰는 게 낫습니다.
Q. God Object인지 아닌지 어떻게 판단하나요? “이 Object Type이 현실에서 서로 다른 두 가지 이상의 것을 가리키고 있는가”를 자문해보면 됩니다. 장비와 소프트웨어 라이선스를 둘 다 “Asset”이라 부르고 있다면 이미 God Object입니다.
Q. Kitchen Sink와 필요한 메타데이터는 어떻게 구분하나요? 비즈니스 사용자에게 그 속성의 의미를 설명할 수 있는지가 기준입니다. “이 값이 언제 배치 처리됐는지”는 엔지니어에게나 의미 있지, 현업 담당자에게는 의미가 없습니다.
참고자료
[1] Palantir, Ontology design: Anti-patterns, Foundry 공식 문서.
[2] Palantir, Ontology design: Best practices, Foundry 공식 문서.
설계 리뷰 체크리스트
새 Object Type을 배포하기 전에, 앞서 다룬 안티패턴들을 체크리스트로 한 번씩 점검하면 많은 재작업을 미리 막을 수 있습니다.
| 점검 질문 | 해당 안티패턴 |
|---|---|
| 이 Object Type이 서로 다른 성격의 개체를 한데 묶고 있지 않은가 | God Object |
ETL 처리용 내부 필드(_extracted_at 등)가 그대로 노출돼 있지 않은가 |
Kitchen Sink |
| 같은 개념을 가리키는 Object Type이 이미 다른 팀에 있지 않은가 | 네이밍 중복 |
| Link Type의 카디널리티가 실제 업무 규칙과 일치하는지 현업과 재확인했는가 | 잘못된 카디널리티 |
| 계산식을 여러 화면에 각자 구현하지 않고 Object Type 안에 한 번만 정의했는가 | 계산 로직 중복 |
| 권한 설정이 배포 전에 이미 확인됐는가(배포 후 추가 아님) | 권한 설계 누락 |
이 표를 신규 Object Type을 승인하는 리뷰 단계에 그대로 끼워 넣으면, 설계 실수가 운영 단계까지 넘어가는 걸 상당 부분 미리 걸러낼 수 있습니다. 창고 비유로 돌아가면, 물건을 넣기 전에 “이게 어느 칸에 들어가야 하는지” 한 번 더 확인하는 습관인 셈입니다.
