소개
Odoo에서는 데이터 구조와 저장소를 ‘모델’로 정의합니다. 거래서, 견적서, 제품 같은 모든 비즈니스 정보는 각각의 모델에 기록되어 데이터베이스에 보관됩니다.
모델에 대한 이해는 개발자와 기능 컨설턴트 모두에게 필수적입니다. 모델은 Odoo 데이터 아키텍처의 기초로서 필드 정의, 관계, 비즈니스 로직을 규정합니다. Odoo의 모든 모델은 일관된 설계 패턴을 따릅니다.
이 글은 Odoo에서 가장 핵심적인 모델 중 하나인 product.template에 초점을 맞춥니다. 맞춤 모듈을 개발하든 외부 시스템과 통합하든, 제품 카탈로그를 설정하든 결국 이 모델을 다루게 됩니다.
product.template 모델이란 무엇인가
product.template은 서로 비슷하지만 색상이나 사이즈처럼 일부 속성만 다른 제품들을 그룹화하기 위한 개념입니다. 각 변형을 따로 만들기보다 템플릿에 공통 속성을 두고, 변형(variants)으로 갈라 관리합니다.
이 모델은 판매, 구매, 재고, 이커머스, 제조 등 시스템 전반에서 사용됩니다. 카탈로그에 제품을 등록하면 product.template 레코드가 생성되고, 주문에서는 템플릿을 기반으로 한 특정 변형을 선택하게 됩니다.
product 모듈에서 이 모델이 정의되며 다른 모듈들은 Odoo의 상속 메커니즘으로 기능을 덧붙입니다. 예를 들어 Sale은 가격·청구 관련 필드를 추가하고 Purchase는 공급사 관련 속성을 더합니다. Inventory는 재고 추적을 담당하죠. 핵심 구조를 중복하지 않고 필요한 부분만 확장합니다.
product.template과 product.product의 차이를 정확히 아는 것이 중요합니다. 템플릿은 공유 속성을 담고, 실제 개별 품목의 바코드나 SKU 같은 변형 고유 정보는 product.product에 보관됩니다.
모델의 주요 필드들
다음은 product.template에서 특히 자주 쓰이고 중요한 필드들입니다. 이들을 이해하면 제품 모델을 효율적으로 다룰 수 있습니다.
1. name
유형: Char. 제품의 표시 이름을 저장합니다. 다양한 뷰에서 주요 식별자로 사용됩니다.
2. create_date
유형: Datetime. 레코드가 생성된 일시를 자동으로 기록합니다. 감사와 보고에 유용합니다.
3. write_date
유형: Datetime. 마지막 수정 일시를 자동으로 기록합니다. 데이터 변경 시점을 추적할 수 있습니다.
4. active
유형: Boolean. 소프트 삭제 플래그입니다. False로 하면 기본 보기에서 숨겨지지만 물리적으로 삭제되지는 않습니다.
5. sequence
유형: Integer. 목록 정렬에 사용되는 표시 순서 값입니다. 숫자가 작을수록 앞에 표시됩니다.
6. type
유형: Selection. 제품 유형(소모품, 서비스, 재고관리 품목)을 지정합니다. 소모품은 재고 추적을 하지 않고, 서비스는 물리 재고가 없습니다.
7. categ_id
유형: Many2one (product.category). 제품 카테고리로 보고, 기본 라우팅과 분류에 영향을 줍니다. 카테고리는 계층 구조를 가질 수 있습니다.
8. list_price
유형: Float. 판매 가격(권장가)입니다. 견적 생성 시 기본값으로 사용되며 가격표나 변형별 가격으로 덮어쓸 수 있습니다.
9. standard_price
유형: Float. 원가입니다. 마진 계산과 재고 평가에 사용되어 수익성 보고에 영향을 줍니다.
10. currency_id
유형: Many2one (res.currency). list_price와 standard_price의 통화 정보입니다. 일반적으로 회사 설정을 따릅니다.
11. uom_id
유형: Many2one (uom.uom). 판매 단위(예: 개, kg, L)를 정의합니다. 수량 표현 기준이 됩니다.
12. uom_po_id
유형: Many2one (uom.uom). 구매 단위로, 판매 단위와 달라 변환이 필요한 경우에 사용됩니다.
13. default_code
유형: Char. 내부 참조 코드 또는 SKU로 외부 시스템과 매핑할 때 유용합니다. 가능한 고유하게 관리하는 것이 좋습니다.
14. barcode
유형: Char. 스캐닝용 바코드입니다. POS나 창고 업무에서 사용되며, 변형 단위의 바코드는 일반적으로 product.product에 둡니다.
15. description
유형: Char. 내부용 설명으로 내부 사용자에게만 보입니다. 제품 관련 메모를 남기는 용도입니다.
16. description_sale
유형: Text. 고객에게 보여질 판매 설명입니다. 견적서나 청구서에 포함되며 HTML을 넣어 서식을 적용할 수 있습니다.
17. description_purchase
유형: Text. 구매용 설명으로 발주서와 매입청구서에 표시되어 구매 담당자가 공급사와 소통할 때 사용됩니다.
18. sale_ok
유형: Boolean. 판매 가능 여부를 나타냅니다. False면 판매·견적 폼에서 보이지 않습니다.
19. purchase_ok
유형: Boolean. 구매 가능 여부를 나타냅니다. False면 구매 폼에서 보이지 않습니다.
20. weight
유형: Float. 배송비 계산과 물류에서 쓰이는 제품 무게입니다. 단위는 회사의 UoM 설정을 따릅니다.
21. volume
유형: Float. 물류·창고 용량 계획에서 필요한 체적 정보입니다.
22. product_variant_ids
유형: One2many (product.product). 템플릿에서 파생된 변형 목록입니다. 각 변형은 템플릿의 속성을 상속합니다.
23. product_variant_count
유형: Integer. 변형 개수로 product_variant_ids로부터 산출됩니다. 화면 표시와 필터링에 활용됩니다.
24. image_1920
유형: Binary. 제품 이미지 파일입니다. 여러 크기로 저장되어 폼, 리포트, 웹사이트에서 사용됩니다.
25. responsible_id
유형: Many2one (res.users). 제품 담당자(책임자)입니다. 제품 관리와 활동 할당에 사용됩니다.
26. company_id
유형: Many2one (res.company). 다중 법인 환경에서 해당 제품이 속한 회사를 표시합니다.
27. tax_ids
유형: Many2many (account.tax). 판매 시 적용할 고객 세금 목록입니다. 견적 및 송장에 적용됩니다.
28. supplier_tax_id
유형: Many2many (account.tax). 매입 시 적용되는 공급자 세금입니다. 매입청구서에 반영됩니다.
29. attribute_line_ids
유형: One2many. 변형 생성을 위한 속성 라인(예: 사이즈, 색상)을 정의합니다.
30. route_ids
유형: Many2many (stock.route). 재고 흐름을 결정하는 라우트로 구매·제조 등 이동 방식을 지정합니다.
31. property_stock_production
유형: Many2one (stock.location). 제조 제품의 생산 위치 지정에 사용됩니다. 재고형 제품이면서 제조 라우트가 있을 때 적용됩니다.
32. property_stock_inventory
유형: Many2one (stock.location). 재고 조정 시 사용할 저장 위치입니다. 재고실사와 수정에 활용됩니다.
33. property_valuation
유형: Selection. 재고평가 방식(자동/수동)을 선택합니다. 비용 계산 방식에 영향을 줍니다.
34. property_cost_method
유형: Selection. 원가 계산 방법(표준원가/선입선출 등)을 지정합니다. 재고 가치를 산정하는 기본 규칙입니다.
35. property_account_income_id
유형: Many2one (account.account). 판매 시 수익 계정으로 청구서 작성에 사용됩니다.
36. property_account_expense_id
유형: Many2one (account.account). 매입 시 비용 계정으로 매입청구서 처리에 사용됩니다.
37. invoice_policy
유형: Selection. 청구 타이밍(주문 수량 기준 또는 배송 완료 기준)을 선택합니다. 수익 인식 시점에 영향을 줍니다.
38. expense_policy
유형: Selection. 비용 인식 시점(주문 또는 배송)을 지정합니다.
39. service_type
유형: Selection. 서비스형 제품의 처리 방식(수동, 근무시간 기반, 마일스톤 등)을 정의합니다.
40. optional_product_ids
유형: Many2many (product.template). 업셀용 옵션 제품 목록으로 견적 작성 시 함께 추천됩니다.
비즈니스 워크플로우에서의 활용 방식
1. 영업 및 견적
영업 담당자가 견적을 만들 때 카탈로그에서 제품을 선택합니다. 템플릿은 공통 정보를 제공하며, 사이즈나 색상 같은 속성이 있는 제품은 변형을 선택해 주문 라인에 반영합니다.
2. 이커머스(웹사이트)
웹사이트에서는 고객이 제품 목록에서 템플릿 단위로 제품을 보고, 상세 페이지에서 원하는 변형을 선택합니다. 템플릿이 공통 설명과 이미지를 관리합니다.
3. 구매 및 공급사 관리
구매 주문과 매입청구서는 제품 템플릿 정보를 참조합니다. purchase_ok 필드로 구매 가시성을 제어하고, supplier_tax_id나 uom_po_id가 구매 동작을 결정합니다.
4. 재고 및 제조
재고 이동과 제조 오더는 주로 변형 단위를 기준으로 처리됩니다. 템플릿은 라우트, 평가 방식, 원가 정책을 정의하며 실제 재고는 변형별로 추적됩니다.
5. 청구(인보이싱)
송장과 매입 청구서의 품목 라인은 템플릿 기반 정보를 사용합니다. 세금 규칙과 회계 계정은 템플릿에서 제공되며 invoice_policy에 따라 수익 인식 시점이 결정됩니다.
개발자가 이 모델을 확장하는 방법
개발자는 여러 패턴으로 product.template을 확장합니다. Odoo의 모델 상속이 핵심 수단입니다.
모델 상속
모델을 확장하려면 _inherit = 'product.template'를 사용합니다. 이렇게 하면 새로운 필드를 추가하거나 메서드를 재정의, 제약을 붙이는 등 기능 확장이 가능합니다. 원본 파일을 수정하지 않고 별도 모듈로 변경을 관리해 업그레이드와 유지보수가 수월해집니다.
필드 추가
상속 모델에 새로운 필드를 선언합니다. Char, Many2one, Boolean, Integer, Text, Selection 등 적절한 타입을 사용하고, 다중 법인 환경에서는 회사 의존 필드를 고려하세요.
파이썬 확장
create, write, unlink 같은 메서드를 오버라이드해 추가 로직을 구현할 수 있습니다. 원본 동작을 유지하려면 반드시 super()를 호출하세요. 계산 필드(computed fields)와 의존성 설정에 신경 써야 합니다.
Odoo Studio
Odoo Studio를 쓰면 코드 없이 필드를 추가할 수 있어 빠른 커스터마이징에 편리합니다. 하지만 복잡한 비즈니스 로직이나 장기적인 유지보수 관점에서는 전용 커스텀 모듈이 더 안정적입니다.
권장 실무(베스트 프랙티스)
- 템플릿-변형 관계를 올바르게 사용하세요. 공통 속성은 템플릿에, 변형 고유 속성(바코드, SKU 등)은 product.product에 둡니다.
- categ_id를 적절히 설정해 라우팅과 보고가 정상 작동하도록 하세요. 카테고리가 기본 동작을 좌우합니다.
- 외부 시스템과 매핑할 때는 default_code를 활용하세요. 가능하면 고유값으로 관리하면 동기화 오류를 줄일 수 있습니다.
- API 연동 시에는 XML-RPC 또는 JSON-RPC를 사용하세요. product.template은 API로 완전히 노출되어 있어 외부 시스템에서 직접 읽고 쓸 수 있습니다. 외부 ID 매핑을 신중히 설계하세요.
- 커스텀 필드명은
x_접두사나 모듈 접두사를 사용해 향후 Odoo 버전과의 충돌을 피하세요.
자주 발생하는 실수
- 템플릿을 중복 생성하고 변형을 사용하지 않는 실수는 피하세요. 사이즈·색상 등으로만 다른 제품은 attribute_line_ids로 변형을 구성해야 합니다.
- product.template과 product.product를 혼동하지 마세요. 바코드나 SKU처럼 변형별 정보가 필요하면 product.product에 저장해야 합니다.
- sale_ok이나 purchase_ok를 설정하지 않아 제품이 보이지 않는 상황을 자주 봅니다. 이 플래그를 확인하세요.
- super()를 호출하지 않고 핵심 메서드를 덮어쓰면 다른 모듈과 충돌하거나 업그레이드 시 문제가 발생할 수 있습니다.
- 필수 커스텀 필드를 추가하면서 기본값을 제공하지 않으면 기존 레코드가 유효성 검사를 통과하지 못해 업그레이드 실패로 이어질 수 있습니다.
마무리 요약
product.template은 Odoo의 제품 정의와 공유 속성을 저장하는 핵심 모델입니다. 필드 구조와 모듈 확장 방식을 이해하면 Odoo 구성, 커스터마이징, 통합 작업을 훨씬 수월하게 수행할 수 있습니다.
제품 카탈로그를 매핑하는 기능 컨설턴트든, 맞춤 모듈을 개발하는 엔지니어든, product.template을 잘 이해하면 시간과 오류를 절약할 수 있습니다.
Dasolo로 시작하기
Dasolo는 기업의 Odoo 도입·커스터마이징·최적화를 지원합니다. 특히 API 연동과 개발 역량을 갖추고 있으며, product.template 같은 핵심 모델에 대한 실무 경험이 풍부합니다.
Odoo 구현, 커스텀 모듈, 통합 작업이 필요하시다면 저희가 도와드리겠습니다. 데모 예약하기 프로젝트 상담을 신청하세요.