온톨로지(Ontology) 완벽 가이드: 개념부터 실무 설계·활용까지
왜 온톨로지를 알아야 할까?
리워드·이벤트·사용자 행동 데이터를 다루다 보면, “포인트”와 “마일리지”를 같은 것처럼 쓸지 말지, “이벤트”와 “캠페인”을 어떻게 구분할지 같은 질문이 계속 나옵니다. 팀마다 용어가 달라서 API·DB·문서가 서로 엇갈리면, 나중에 통합·분석 비용이 크게 늘어납니다. 우리 팀도 여러 서비스를 붙이면서 “도메인 용어와 관계를 한 번에 정의해 두면 좋겠다”는 필요가 생겼고, 그 과정에서 온톨로지를 도입해 본 경험을 이 글에 정리했습니다.
1. 온톨로지란 무엇인가?
**온톨로지(Ontology)**는 어떤 영역(도메인)에서 쓰는 **개념(Concept)**과 개념 사이의 관계(Relation), 그리고 개념이 가진 **속성(Property)**을 명시적으로 정의한 지식 모델입니다. 철학에서 쓰이던 말을 컴퓨터 과학·AI·시맨틱 웹에서 가져와, “기계가 이해할 수 있는 형태로 지식을 표현하는 방법”으로 쓰입니다.

온톨로지는 개념·관계·속성·인스턴스를 명확히 정의해, 사람과 시스템이 같은 의미로 소통하게 돕습니다.
1.1 온톨로지의 네 가지 핵심 요소
| 요소 | 설명 | 예시 (리워드 도메인) |
|---|---|---|
| 개념(Class) | 도메인에서 다루는 “종류” | User, Reward, Event, Action |
| 관계(Relation) | 개념 간의 연결 | User earns Reward, Event triggers Action |
| 속성(Property) | 개념이 가진 특성 | Reward.pointValue, Event.startDate |
| 인스턴스(Instance) | 실제 데이터 하나하나 | user_123, reward_daily_login |
우리가 리워드 엔진을 설계할 때 “어떤 행동(Action)이 어떤 보상(Reward)을 발생시키는지”를 코드와 DB만으로는 한계가 있어, 먼저 온톨로지 스케치를 그린 뒤에 테이블·API를 맞춰 갔습니다.
2. 온톨로지를 쓰는 이유 (실무 관점)
2.1 용어와 의미를 팀·시스템 간에 통일
- 문제: “이벤트”를 A팀은 “사용자 행동”, B팀은 “기획 이벤트(캠페인)”로 쓰면, 통계·API·문서가 서로 안 맞습니다.
- 대응: 온톨로지에서
UserAction,Campaign처럼 개념을 나누고, 관계(UserperformsUserAction,CampaigncontainsUserAction)를 정의해 두면, 신규 인력·외부 연동 시에도 “뜻”이 한 번에 전달됩니다.
2.2 검색·추천·AI의 입력으로 활용
- 개념과 관계가 명시되면, “이 사용자가 어떤 행동을 했을 때 어떤 보상을 줘야 하는지” 같은 규칙을 코드뿐 아니라 지식 그래프로 표현할 수 있습니다.
- 우리도 리워드 규칙을 “트리거 → 조건 → 보상” 형태로 정리할 때, 온톨로지에 정의한
Action,Condition,Reward를 재사용해, 규칙 엔진과 문서가 같은 용어를 쓰도록 맞춰 두었습니다.
2.3 시맨틱 웹·SEO·구조화 데이터
- 웹 페이지에 JSON-LD나 RDF로 온톨로지 기반 마크업을 넣으면, 검색 엔진이 “이 페이지가 무엇에 대한 글인지” 더 정확히 이해합니다.
- 블로그·서비스 페이지에
BlogPosting,Organization,Event등을 쓰는 것도, 일종의 “웹용 온톨로지(Schema.org)”를 따르는 것입니다.
3. 온톨로지 설계 절차 (실무 체크리스트)
우리 팀이 리워드·이벤트 도메인에 적용할 때 따랐던 순서입니다.
3.1 도메인 범위 정하기
- 질문: “어디까지를 한 번에 정의할 것인가?”
- 예: “리워드 지급”만 할지, “이벤트 기획·참여·지급·정산”까지 할지.
- 팁: 처음엔 범위를 좁게 잡고, 핵심 개념 5~10개만 정리한 뒤 점진적으로 넓히는 편이 안전합니다.
3.2 핵심 개념(클래스) 뽑기
- 질문: “이 도메인에서 반드시 말해야 하는 명사는?”
- 예: User, Reward, RewardType(포인트/마일리지/쿠폰), Action(행동), Event, Campaign, Rule …
- 주의: “이벤트”처럼 여러 뜻으로 쓰이는 말은
UserAction,Campaign처럼 나눠서 정의해 두는 것이 좋습니다.
3.3 관계(Relation) 정의하기
- 질문: “A와 B가 어떤 연결로 이어지는가?”
- 예:
- User
earnsReward - Event
triggersAction - Rule
grantsRewardwhenAction
- User
- 팁: 관계 이름을 동사로 두면, 나중에 “누가 무엇을 한다” 형태로 읽기 쉽습니다.
3.4 속성(Property) 정하기
- 질문: “각 개념을 구분·검색·계산할 때 꼭 필요한 정보는?”
- 예: Reward.pointValue, Reward.currency, Event.startDate, Event.endDate, User.id …
- 주의: “나중에 필요할 것 같아서” 속성을 너무 많이 넣으면 관리 부담이 커지므로, 1차 출시에 필요한 것 위주로 두고 확장하는 것을 권장합니다.
4. 간단한 온톨로지 예제 (리워드 도메인)
아래는 리워드·행동·이벤트를 최소한으로 정의한 예시입니다. 실제 서비스에 맞게 클래스와 관계를 더 쪼개거나 넓힐 수 있습니다.
4.1 클래스와 관계 스케치
User --(performs)--> Action
Action --(type)--> ActionType // login, purchase, share ...
Event --(contains)--> Action
Rule --(when)--> Action
Rule --(then)--> Reward
User --(earns)--> Reward
Reward --(type)--> RewardType // point, mileage, coupon
4.2 JSON-LD 형태로 표현하기
웹·API에서 쓰기 좋게 JSON-LD로 옮기면 아래와 비슷하게 표현할 수 있습니다.
1{
2 "@context": "https://itemscv.com/ns/reward/v1",
3 "@graph": [
4 {
5 "@id": "https://itemscv.com/ns/reward#User",
6 "@type": "rdfs:Class",
7 "rdfs:label": "사용자"
8 },
9 {
10 "@id": "https://itemscv.com/ns/reward#Reward",
11 "@type": "rdfs:Class",
12 "rdfs:label": "보상"
13 },
14 {
15 "@id": "https://itemscv.com/ns/reward#earns",
16 "@type": "rdf:Property",
17 "rdfs:domain": "https://itemscv.com/ns/reward#User",
18 "rdfs:range": "https://itemscv.com/ns/reward#Reward",
19 "rdfs:label": "획득하다"
20 }
21 ]
22}실제 서비스에서는 이 스키마를 바탕으로 DB 테이블·API 스펙·문서를 맞춰 가면, “포인트”와 “마일리지”를 같은 필드로 섞어 쓰는 실수를 줄일 수 있습니다.
5. 실무에서 자주 겪는 실패와 대응
5.1 온톨로지를 한 번에 완성하려 함
- 문제: 처음부터 모든 개념·관계를 정의하려다 보면 설계가 길어지고, 실제 개발과 동기가 떨어집니다.
- 대응: “리워드 지급”처럼 한 흐름만 먼저 정의하고, 그 부분만 코드·DB에 반영해 본 뒤, 점차 이벤트·캠페인·정산으로 넓혀 가는 방식을 추천합니다.
5.2 팀이 정의를 따로 쓰지 않음
- 문제: 온톨로지는 만들어 두었는데, 개발·기획·운영이 기존 습관대로 다른 용어를 쓰면 효과가 반감됩니다.
- 대응: 온톨로지 문서를 공유 저장소에 두고, API·DB 필드명·문서 링크를 “이 개념으로 통일”한다고 팀에 안내한 뒤, 코드 리뷰·문서 리뷰에서 용어 일치를 확인하는 과정을 넣었습니다.
5.3 관계만 많고 “왜 이 관계인지”가 없음
- 문제: 관계를 많이 정의하다 보면, “실제로 어떤 비즈니스 로직에서 쓰는 관계인지”가 흐려집니다.
- 대응: 각 관계에 “이 관계가 필요한 사용 시나리오(예: 지급 규칙 판단, 대시보드 집계)”를 한 줄씩 적어 두면, 나중에 유지보수·확장 시 판단이 쉬워집니다.
6. 참고 자료
📚 더 깊이 학습하고 싶을 때 참고한 자료들입니다.
- W3C OWL Web Ontology Language — 온톨로지를 표현하는 표준 언어
- Schema.org — 웹 페이지·이벤트·조직 등을 위한 공통 온톨로지
- JSON-LD 공식 사이트 — JSON으로 시맨틱 데이터 표현
- Protégé (Stanford) — 온톨로지 편집·시각화 도구
- Linked Data Patterns — 링크드 데이터·온톨로지 설계 패턴
7. 정리
온톨로지는 “도메인의 개념과 관계를 명시적으로 정의해, 사람과 시스템이 같은 의미로 소통하게 하는 지식 모델”입니다. 리워드·이벤트처럼 여러 팀·시스템이 맞닿는 도메인에서는, 용어와 관계를 한 번 정리해 두면 API·DB·문서·규칙 엔진이 일관되게 유지되기 쉽습니다. 우리도 리워드 엔진과 이벤트 시스템을 붙이면서 작은 온톨로지부터 적용해 본 결과, “의미 통일”과 “규칙 설계” 측면에서 이득을 봤습니다. 처음에는 범위를 좁게 잡고, 핵심 개념 5~10개와 관계만 정의한 뒤, 실제 코드·DB에 반영해 보면서 점진적으로 넓혀 가시면 좋습니다.
이 글은 itemSCV 팀이 작성·검수했습니다. 리워드·이벤트·데이터 모델링 관련 문의는 문의하기를 이용해 주세요.