1. Odoo 상속의 기본 동작 원리 (How Inheritance Works)
Odoo 상속 메커니즘은 기존 모델(Base Model)을 기반으로 커스텀 모듈에서 확장 모델(Extended Model)을 선언하여 기능을 병합하는 구조로 동작합니다.
| 구분 | 대상 모델 예시 | 보유 필드 구성 | 설명 |
| Base Model | sale.order | name, partner_id, amount_total, state 등 | Odoo 표준 원본 판매 주문 모델 |
| Inherited (확장) | 커스텀 모듈 | customer_reference, extra_note 등 | 개발자가 추가 정의한 신규 커스텀 필드 |
| Result (결과) | Extended sale.order | 원본 필드 + 추가 커스텀 필드 통합 | 원본 코드를 건드리지 않고 최종 병합된 모델 |
👉 [이전 글: Odoo Model 정의와 Field 타입 완벽 가이드 바로가기]
2. Odoo 3대 모델 상속 방식 (Types of Inheritance)
Odoo는 업무 요구사항과 데이터베이스 설계 방식에 따라 3가지 상속 패턴을 제공합니다.

① _inherit: 기존 모델 확장 (In-place Extension)
새로운 테이블이나 모델을 생성하지 않고, 이미 존재하는 표준 모델에 필드나 비즈니스 메서드를 직접 덧붙여 확장하는 가장 대표적인 방식입니다.
Python
from odoo import models, fields
class SaleOrder(models.Model):
_inherit = "sale.order"
customer_reference = fields.Char(string="Customer Reference")
- _inherit = "sale.order": 별도의 _name을 지정하지 않아 기존 sale.order 모델 자체를 직접 확장합니다.
- 적용 시점: 기존 표준 앱(영업, 재고, 회계 등)의 기본 모델에 몇 가지 추가 필드나 커스텀 로직을 덧붙일 때 사용합니다.
② _name + _inherit: 기존 모델 기반 새 모델 생성 (Extension Prototype)
기존 모델의 모든 필드와 메서드 정의를 복제해 상속받으면서, 데이터베이스 상에는 독립된 별도의 신규 모델(테이블)을 생성하는 방식입니다.
Python
from odoo import models, fields
class CustomSaleOrder(models.Model):
_name = "custom.sale.order"
_inherit = "sale.order"
extra_note = fields.Text()
- _name과 _inherit 동시 사용: sale.order의 데이터 구조를 물려받되, PostgreSQL 상에 custom_sale_order라는 독립된 테이블을 새로 생성합니다.
- 적용 시점: 기존 모델의 비즈니스 로직과 구조는 재사용하되, 원본 데이터와 완전히 분리된 데이터셋을 별도로 운영하고자 할 때 사용합니다.
③ _inherits: 위임 상속 (Delegation Inheritance)
새로운 모델을 생성하면서 특정 Many2one 관계형 필드를 매개로 대상 모델의 필드 및 동작을 위임받아 투명하게 접근하는 방식입니다.
Python
from odoo import models, fields
class Employee(models.Model):
_name = "hr.employee"
_inherits = {'res.partner': 'partner_id'}
partner_id = fields.Many2one(
'res.partner',
string="Related Partner",
required=True,
ondelete='cascade'
)
- _inherits = {'res.partner': 'partner_id'}: hr.employee 레코드에서 employee.name처럼 res.partner의 필드에 직접 접근할 수 있도록 위임 관계를 정의합니다.
- 적용 시점: 다형성(Polymorphism)이나 복합 엔티티 구조에서 다른 모델의 정보를 포함(Has-a)하여 연동할 때 활용합니다.
3. 상속 방식 3종 비교 및 선택 기준
| 상속 방식 | 신규 모델 생성 여부 | DB 테이블 변화 | 핵심 사용 목적 및 특징 |
| _inherit | 없음 (기존 모델 유지) | 기존 테이블 컬럼 추가 | 표준 기능에 필드 및 메서드 단순 확장 |
| _name + _inherit | 신규 모델 생성 | 신규 독립 테이블 생성 | 기존 스키마 구조를 복제하여 별도 데이터 관리 |
| _inherits | 신규 모델 생성 | 신규 테이블 + FK 연결 | Many2one 필드를 매개로 타 모델 필드 위임 참조 |
4. Odoo 상속이 필수적인 이유와 골든 룰
- 표준 소스 코드 무결성 유지: Odoo 코어 파일을 수정하지 않아 타 표준 모듈과의 충돌 위험이 없습니다.
- 버전 업그레이드 용이성: Odoo 새 버전 릴리즈 시 원본 코드가 유지되므로 커스텀 모듈의 호환성만 점검하여 안전하게 마이그레이션할 수 있습니다.
- 모듈화 및 유지보수성: 기능 단위로 커스터마이징이 모듈화되어 필요한 기능을 선택적으로 활성화/비활성화할 수 있습니다.
💡 Golden Rule: Odoo 코어 소스는 절대 직접 수정하지 말고, 반드시 "상속(Inheritance)"을 통해 확장하세요.
'4. Odoo 기술 & 개발(Tech, Architecture) > 커스텀 모듈 개발 & API' 카테고리의 다른 글
| Odoo Recordset 완벽 가이드: 개념부터 필수 가공 메서드 3종과 self 다루기 (0) | 2026.09.05 |
|---|---|
| Odoo Views & XML 구조 완벽 가이드: 5가지 핵심 뷰와 UI 렌더링 원리 (0) | 2026.08.30 |
| Odoo 개발의 시작: Model 정의와 Field 타입(기본·관계형) 완벽 가이드 (0) | 2026.08.29 |
| SQL 없이 데이터 다루는 Odoo ORM 기초: 실무 핵심 메서드 7가지 완벽 정리 (0) | 2026.08.29 |