4. Odoo 기술 & 개발(Tech, Architecture)/커스텀 모듈 개발 & API

Odoo Model Inheritance 완벽 가이드: 3가지 모델 상속 방식과 실무 아키텍처

wegosolution 2026. 8. 30. 18:40

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가지 상속 패턴을 제공합니다.

odoo-model-inheritance-architecture-overview

 

① _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)"을 통해 확장하세요.