소개
Odoo에서 ‘모델’은 데이터가 데이터베이스에 어떻게 쌓이고 연결되는지를 규정하는 설계도입니다. 판매 주문, 재고, 제품 같은 각종 업무 데이터는 모두 모델에 저장되며, 모델 구조를 이해하면 시스템이 데이터를 어떻게 처리하는지 한눈에 파악할 수 있습니다.
모델을 이해하는 일은 개발자와 기능 컨설턴트 모두에게 필수적입니다. 모델은 필드 정의, 관계 설정, 그리고 비즈니스 로직의 기반이 되어 Odoo 데이터 아키텍처를 구성합니다. 여기서 잘못 설계하면 전체 프로세스에 영향이 미칩니다.
이 글은 Odoo에서 핵심적 역할을 하는 모델 중 하나인 product.product에 초점을 맞춥니다. 커스텀 모듈 개발, 외부 시스템 연동, 제품 카탈로그 세팅 등 제품 관련 작업을 한다면 이 모델을 반드시 다루게 됩니다.
product.product 모델이란 무엇인가
product.product는 실제로 판매·구매되는 ‘제품 단위(Variant)’를 나타냅니다. 즉 견적서나 발주서, 재고 이동에 기록되는 구체적 품목이 바로 이 모델의 레코드입니다.
product.product는 product.template과 역할이 구분됩니다. 템플릿은 제품군의 공통 속성을 담고, product.product는 각 변형(예: 사이즈·색상 조합)을 표현합니다. 변형이 없는 단순 제품은 템플릿 당 단일 variant로 존재하고, 옵션이 많은 제품은 조합별로 여러 product.product가 생성됩니다.
이 모델은 Odoo의 product 모듈에 정의되어 있으며, 판매(Sales), 구매(Purchase), 재고(Inventory), 전자상거래 등 거의 모든 영역에서 참조됩니다. 견적에 항목을 추가하거나 재고 입고를 할 때 실무적으로 product.product 레코드를 다루게 됩니다.
product.product는 product.template로부터 delegation(위임) 상속을 사용합니다. 공통 필드는 템플릿에 두고, 변형별로 덮어쓸 수 있게 설계되어 공유 데이터와 개별 속성 관리를 균형 있게 합니다.
모델의 주요 필드들
아래는 product.product에서 특히 자주 쓰이고 알아두면 유용한 필드들입니다. 이들을 이해하면 변형 관리와 연동 작업이 한결 수월해집니다.
1. name
형식: Char. 제품 변형의 이름을 저장합니다. 목록·폼·문서에 표시되며, 단순 제품에서는 템플릿 이름과 동일하고 변형이 있으면 속성값을 결합한 형태(예: "반팔티 - 파랑 / M")로 나타납니다.
2. product_tmpl_id
형식: Many2one (product.template). 변형을 부모 템플릿에 연결하는 핵심 관계입니다. 각 product.product는 정확히 하나의 product.template에 속하며, 템플릿 기반 상속·확장 시 이 관계를 사용합니다.
3. default_code
형식: Char. 내부 참조(SKU)로 제품 식별, 바코드 조회, 외부 연동에 사용됩니다. 변형별로 고유 코드를 가질 수 있습니다.
4. barcode
형식: Char. EAN·UPC 등 바코드 값으로 POS나 창고 스캔에 사용됩니다. 설정 시 제품 간 유일해야 빠른 조회가 가능합니다.
5. create_date
형식: Datetime. 레코드 생성 시각을 자동으로 기록합니다. 리포트와 감사 추적에 유용합니다.
6. write_date
형식: Datetime. 마지막 수정 시각을 자동으로 기록합니다. 데이터 업데이트 시점을 파악하는 데 사용합니다.
7. active
형식: Boolean. 소프트 삭제 플래그입니다. False로 설정하면 기본 화면에서 숨겨져 기록은 보존됩니다.
8. type
형식: Selection. 제품 유형을 지정합니다(Consumable, Service, Storable). 재고 추적·창고 흐름 여부와 연계되어 어떤 워크플로우가 적용될지 결정합니다.
9. categ_id
형식: Many2one (product.category). 제품 카테고리로 보고·가격 규칙·카탈로그 분류에 사용되며 계층 구조를 가질 수 있습니다.
10. list_price
형식: Float. 판매 가격으로 견적과 기본 가격으로 쓰입니다. 고객별 가격표에 따라 변경될 수 있습니다.
11. standard_price
형식: Float. 원가로 재고 평가와 마진 계산에 사용됩니다. 보통 구매 내역이나 수동 입력으로 갱신됩니다.
12. uom_id
형식: Many2one (uom.uom). 판매·재고의 기본 단위(개, kg, L 등)를 정의합니다.
13. uom_po_id
형식: Many2one (uom.uom). 구매 단위로, 예를 들어 박스로 구매하고 개로 판매하는 경우 단위 변환을 처리합니다.
14. description_sale
형식: Html. 견적서·주문·인보이스에 표시되는 판매용 설명으로 포맷과 상세 정보를 포함할 수 있습니다.
15. description_purchase
형식: Html. 구매 주문서·공급사 청구서에 표시되는 구매 관련 설명입니다.
16. sale_ok
형식: Boolean. 판매 가능 여부 플래그로 False면 판매·이커머스에서 숨겨집니다(내부 전용 품목에 유용).
17. purchase_ok
형식: Boolean. 구매 가능 여부 플래그로 False면 발주에서 숨겨집니다(완제품 전용 등에 사용).
18. image_1920
형식: Binary. 고해상도 제품 이미지입니다. Odoo는 다양한 크기의 이미지를 함께 저장해 폼·웹·리포트에 활용합니다.
19. weight
형식: Float. 운송비·물류 산정에 쓰이는 무게 값입니다. 단위는 회사 설정을 따릅니다.
20. volume
형식: Float. 부피 정보로 배송 비용이나 창고 적재량 산정에 중요합니다.
21. company_id
형식: Many2one (res.company). 멀티 컴퍼니 환경에서 어떤 회사 소유인지 지정하며, 가시성과 재고 처리에 영향을 줍니다.
22. currency_id
형식: Many2one (res.currency). list_price와 standard_price의 통화입니다. 보통 회사 통화를 사용하며, 가격표는 다른 통화로 변환할 수 있습니다.
23. qty_available
형식: Float. 실제 가용 재고 수량입니다. 재고 쿼트에서 계산된 읽기 전용 값으로 재고 확인과 리포트에 쓰이며, 추적되는(storable) 제품에만 의미가 있습니다.
24. virtual_available
형식: Float. 예측 재고(가용 재고 + 입고 예정 - 출고 예정)로 보충 필요 판단에 사용되는 계산 필드입니다.
25. product_template_attribute_value_ids
형식: Many2many. 이 변형을 정의하는 속성값(예: 색상=파랑, 사이즈=M)과 연결되어 변형 설정과 필터링에 쓰입니다.
26. sequence
형식: Integer. 목록·컨피규레이터에서 정렬 순서를 결정합니다. 낮은 값이 먼저 노출됩니다.
27. display_name
형식: Char. 표시용 이름으로 제품명과 변형 속성을 합쳐 보여줍니다. many2one 드롭다운이나 검색 결과에 사용되는 읽기 전용 필드입니다.
28. responsible_id
형식: Many2one (res.users). 제품 담당자 지정 필드로 재주문 규칙이나 내부 업무 할당에 활용됩니다(선택적).
비즈니스 워크플로우에서의 활용 사례
1. 영업과 견적
영업 담당자가 견적을 만들 때 카탈로그에서 product.product를 선택하면 해당 변형의 list_price, description_sale, uom_id가 주문 줄로 넘어갑니다. 가격은 가격표에 따라 덮어씌워질 수 있으며, sale_ok가 True인 제품만 표시됩니다.
2. 구매와 공급사
구매 주문과 공급사 청구서는 product.product를 참조합니다. 구매 단가가 standard_price 갱신에 반영되며, purchase_ok=True인 제품만 발주 가능합니다. uom_po_id는 발주 단위를 정의합니다(예: 박스로 주문).
3. 재고와 창고관리
재고 이동, 피킹, 쿼트는 모두 product.product를 기준으로 처리됩니다. qty_available와 virtual_available가 가용성 판단에 사용되며, 재고 추적이 필요한 제품만 기록됩니다. 빠른 입출고를 위해 바코드 필드로 스캔 조회를 합니다.
4. 이커머스·웹사이트
온라인 상점은 product.product 레코드를 그대로 노출합니다. 사이즈·색상같은 변형은 옵션으로 표시되고 이미지·설명·가격은 모델에서 가져옵니다. sale_ok로 노출 제어를 합니다.
5. 제조(MRP)
BOM(자재명세서)은 부품과 완제품 모두에서 product.product를 참조합니다. 제품 유형(type)에 따라 제조 대상인지 소비자재인지 구분되고, 재고 수준에 따라 생산 계획이 좌우됩니다.
개발자가 이 모델을 확장하는 방법
개발자는 다양한 패턴으로 product.product를 확장할 수 있으며, 핵심은 Odoo의 모델 상속 메커니즘입니다.
모델 상속
_inherit = 'product.product'를 사용해 모델을 확장합니다. 필드를 추가하거나 메서드를 덮어쓰고 제약을 걸 수 있습니다. 변경 사항은 별도 모듈에 보관해 업그레이드 관리를 쉽게 하는 것이 좋습니다. 변형별로 적용되는 속성은 product.product에, 제품군 전체에 속하는 속성은 product.template에 두는 것이 원칙입니다.
필드 추가
상속한 모델에 새 필드를 정의하세요. Char, Many2one, Boolean, Integer, Text, Selection 등 적절한 타입을 사용하고 그 필드가 템플릿에 두어야 할지 변형에 두어야 할지를 판단합니다. SKU나 변형별 바코드처럼 변형 고유 정보는 product.product에 두는 것이 맞습니다.
파이썬 확장
create, write, unlink 같은 기본 메서드를 오버라이드해 커스텀 로직을 넣을 수 있습니다. 기존 동작을 유지하려면 반드시 super()를 호출하세요. 특히 계산 필드와 의존성 관리에 주의해야 합니다. product.product는 재고·판매 모듈에서 많은 계산 필드를 가집니다.
Odoo Studio
Odoo Studio로 코드 없이 필드를 추가할 수 있어 빠른 커스터마이징에 편리합니다. 다만 복잡한 비즈니스 로직이나 장기 유지보수를 고려하면 커스텀 모듈로 구현하는 편이 안전합니다. product.product API는 XML-RPC/JSON-RPC를 통해 외부 연동에도 공개되어 있습니다.
권장 실무(베스트 프랙티스)
- 외부 시스템 매핑에는 default_code나 barcode를 사용하세요. 값의 고유성과 일관성을 유지하는 것이 통합 안정성에 중요합니다.
- 제품의 type를 올바르게 설정하세요. Consumable, Storable, Service 중 선택에 따라 적용되는 모듈과 워크플로우가 달라집니다.
- API 연동 시 주문 라인·거래는 product.product를 사용하고, 카탈로그 단위 작업은 product.template을 사용하는 것이 좋습니다.
- 커스텀 필드는 충돌을 피하기 위해
x_접두사나 모듈 고유 접두사를 사용하세요. 향후 Odoo 버전 업에서 이름 충돌을 줄여줍니다. - 브랜드나 전체 카탈로그에 적용되는 필드(예: 브랜드, 기본 카테고리)는 product.template에 두고 변형별로 달라지는 속성은 product.product에 두어 설계를 깔끔하게 유지하세요.
자주 하는 실수들
- 변형별 로직이 필요할 때는 product.product를 상속하고, 템플릿 수준에서 처리해야 할 공통 로직은 product.template을 상속하는 방식으로 구분하세요.
- 변형 제품을 직접 product.product로 수동 생성하는 대신 제품 구성기(configurator)를 통해 생성하면 속성값 관리와 조합 관리를 자동화할 수 있습니다.
- sale_ok이나 purchase_ok를 설정하지 않아서 제품이 판매·구매 화면에서 보이지 않는 경우가 자주 발생합니다. 기본 설정을 확인하세요.
- core 메서드를 덮어쓸 때 super()를 호출하지 않으면 다른 모듈 동작이나 향후 업그레이드에 문제를 일으킬 수 있습니다.
- 템플릿 기준으로 필터링해야 할 때 product.product로 도메인을 걸어 잘못된 결과를 초래하는 실수가 발생합니다. 기능에 맞는 모델을 사용하세요.
결론
product.product는 Odoo 제품 아키텍처의 핵심입니다. 실제로 거래되는 품목을 표현하며, product.template과의 관계를 이해하면 설정·커스터마이징·연동 작업을 안정적으로 진행할 수 있습니다.
제품 카탈로그를 매핑하는 기능 컨설턴트든 커스텀 모듈을 개발하는 엔지니어든, product.product를 제대로 이해하면 시간과 비용을 절약하고 오류를 줄일 수 있습니다.
Odoo 도입 지원이 필요하신가요?
Dasolo는 기업의 Odoo 도입·커스터마이즈·최적화를 돕습니다. API 연동과 Odoo 개발에 전문성을 갖춘 팀이 product.product 같은 데이터 모델 설계와 구현을 지원합니다.
Odoo 도입, 커스텀 모듈 개발, 외부 연동이 필요하시면 저희가 도와드리겠습니다. 데모 예약 프로젝트 상담을 시작하세요.