소개
판매 주문에 수량을 입력하거나, 작업의 진행일수를 세거나, 리드 우선순위 점수를 설정해 본 적이 있다면 Odoo의 정수형 필드를 이미 사용한 것입니다. 데이터 모델에서 아주 흔히 쓰이는 필드지만, 단순해 보인다는 이유로 중요성을 간과하기 쉽습니다.
정수형 필드의 동작을 이해하는 것은 화면을 구성하는 사용자는 물론, 커스텀 모듈을 만드는 개발자와 고객을 위한 데이터 모델을 설계하는 컨설턴트에게도 필수적입니다.
이 가이드는 Integer 필드가 어떤 값을 저장하는지, Odoo 프레임워크와 화면에서 어떻게 동작하는지, Studio와 Python을 통해 어떻게 추가·변경하는지, 그리고 실제 사례와 주의할 점까지 실무 관점에서 정리합니다.
Odoo의 Integer 필드란 무엇인가
Odoo ORM에서 Integer 필드는 소수점이 없는 정수만 저장하도록 설계되어 있습니다. PostgreSQL의 INTEGER 열에 대응하며, 일반적으로 약 -20억에서 +20억 범위의 4바이트 부호 있는 정수를 담습니다.
사용자 인터페이스에서 Integer 필드는 단순한 숫자 입력 상자나 리스트 안의 숫자 열로 보입니다. 수량, 점수, 일수, 시퀀스 번호처럼 반 단위나 소수점이 의미가 없는 값을 표현할 때 적합합니다.
아래는 Python 모듈에서 흔히 정의하는 예입니다:
from odoo import fields, models
class ProjectTask(models.Model):
_inherit = 'project.task'
estimated_hours = fields.Integer(
string='Estimated Hours',
default=0,
)
여기서 string은 화면에 표시되는 레이블을 지정하고, default는 새 레코드 생성 시 자동으로 들어갈 기본값을 결정합니다.
Odoo Studio에서는 이 필드를 단순히 Integer라고 표기합니다. Studio로 생성하면 기술명에 x_studio_ 접두사가 붙고, 코드나 XML-RPC로 만들 때는 원하는 기술명을 직접 정할 수 있습니다.
Integer 필드의 동작 원리
Integer 필드를 정의하면 모듈 설치나 업데이트 과정에서 프레임워크가 자동으로 데이터베이스 열을 생성합니다. 별도의 SQL 마이그레이션을 직접 작성할 필요가 없습니다.
데이터베이스 레벨에서는 PostgreSQL의 INTEGER로 타입이 설정됩니다. Odoo ORM은 타입 강제를 처리해 빈 입력값의 경우 None이나 False 대신 0을 반환합니다. 이 점은 Float나 Char 같은 다른 필드 타입과 구분되는 중요한 동작입니다.
주요 필드 속성
Integer 필드에서 자주 설정하는 핵심 속성들은 다음과 같습니다.
- string: 사용자 인터페이스에 표시되는 라벨입니다.
- default: 새 레코드에 자동 할당되는 기본값. 지정하지 않으면 기본적으로
0이 들어갑니다. - required: 필드를 필수로 만듭니다. 기본값이 이미
0이므로, 이 속성은 값이 0일 때 저장을 막고 싶을 때 유용합니다. - readonly: 사용자가 인터페이스에서 직접 수정하지 못하도록 합니다.
- index: 해당 열에 PostgreSQL 인덱스를 생성해 필터와 검색 속도를 개선합니다.
- compute: 다른 필드로부터 값을 계산하는 파이썬 메서드와 연결합니다.
- store:
compute와 함께 사용되며 계산된 값을 DB에 저장할지 실시간 계산할지 결정합니다. - copy: 레코드 복제 시 값을 복사할지 제어합니다.
- groups: 특정 사용자 그룹에게만 필드가 보이도록 제한합니다.
뷰에서의 표시 방식
폼(view)에서는 Integer 필드가 숫자 입력 상자로 렌더링됩니다. 큰 숫자는 가독성을 위해 천단위 구분 기호가 자동으로 추가됩니다.
리스트 뷰에서는 숫자가 오른쪽 정렬로 표시되는 것이 관례입니다. 검색 뷰에서는 같음(=), 초과(>), 미만(<) 같은 비교 필터를 지원합니다.
뷰에서 특정 위젯을 연결해 시각적 표현을 바꿀 수 있습니다. 예를 들어 priority 위젯은 정수 값을 클릭 가능한 별점으로 바꾸고, progressbar 위젯은 최대값과 결합해 정수를 진행 바 형태로 보여줍니다.
Odoo ORM과의 상호작용
개발자 입장에서는 Integer 필드의 읽기·쓰기 동작이 단순합니다. 값은 항상 파이썬 int 타입이며, 비어 있으면 0을 반환합니다. 따라서 값의 부재를 확인하는 조건을 작성할 때 0과 ‘없음’의 구분이 되지 않는 점을 염두에 둬야 합니다.
Integer 필드는 계산 필드나 뷰의 도메인 필터, 서버 액션, 자동화된 액션 등 다양한 Odoo 기능과 자연스럽게 연동됩니다.
비즈니스 적용 사례
Integer 필드는 거의 모든 모듈에 등장합니다. 다음은 실무에서 자주 쓰이는 다섯 가지 사례입니다.
1. CRM: 리드 스코어링
영업팀은 리드를 우선순위로 정하기 위해 점수를 부여하곤 합니다. CRM 모델에 사용자 정의 Integer 필드(예: 'Lead Score')를 추가해 영업 담당자가 직접 점수를 입력하게 하거나, 자동 액션으로 회사 규모, 예산, 활동 수준 등을 기준으로 점수를 계산하게 할 수 있습니다.
이렇게 하면 파이프라인을 점수순으로 정렬해 가장 유망한 기회에 집중하기 쉬워집니다.
2. 영업: 최소 주문 수량
영업·재고 모듈에서 제품 또는 가격표에 최소 주문 수량을 Integer로 설정하면, 예를 들어 10개 미만 주문을 시스템에서 차단해 고객과의 불필요한 커뮤니케이션을 줄일 수 있습니다.
3. 재고: 재주문 규칙
재주문 규칙은 최소/최대 수량을 Integer로 관리합니다. 재고가 최소 수량 아래로 내려가면 Odoo가 자동으로 보충 주문을 생성하여 최대 수량까지 채웁니다. 이 값들을 정확히 설정하는 것은 품절과 과잉 재고를 예방하는 데 매우 중요합니다.
4. 프로젝트 관리: 스토리 포인트와 추정 노력
애자일 방식으로 프로젝트를 운영하는 팀은 작업에 스토리 포인트나 예상 시간을 Integer로 추가합니다. 칸반 보드나 리스트 뷰에서 팀의 용량과 속도를 추적하는 데 유용합니다.
5. 회계: 결제 기한(일수)
회계에서 결제 조건은 결제 가능 일수를 Integer로 정의합니다. 예컨대 Net 30이나 Net 60 같은 규칙은 정수 값으로 설정되어 청구서 만기일 계산에 바로 반영되므로, 현금 흐름 관리를 위해 정확성이 중요합니다.
Integer 필드 생성 및 커스터마이징 방법
Odoo 모델에 Integer 필드를 추가하는 방법은 크게 두 가지입니다: 코드 없이 Studio를 이용하거나, 더 세밀한 제어가 필요하면 Python으로 정의하는 방법입니다.
Odoo Studio 사용하기
Odoo Studio는 코드 작성 없이 필드와 뷰를 맞춤화할 수 있는 도구입니다. Studio로 Integer 필드를 추가하려면 다음 절차를 따릅니다.
- 필드를 추가할 폼을 엽니다.
- 우측 상단 메뉴에서 Studio를 활성화합니다.
- 왼쪽 필드 목록에서 Integer 타입을 폼으로 드래그합니다.
- 필드 라벨을 지정하고 필수 여부와 기본값을 설정합니다.
- 저장한 후 Studio를 종료합니다.
Studio는 자동으로 x_studio_ 접두사가 붙은 필드를 생성하고 정의를 ir.model.fields에 저장합니다. 필드는 즉시 폼과 리스트 뷰에서 사용할 수 있습니다.
Python으로 정의하기(기술적 커스터마이징)
커스텀 모듈을 개발하거나 더 많은 제어가 필요할 때는 Python 모델 클래스에서 Integer 필드를 직접 정의합니다.
from odoo import fields, models
class CrmLead(models.Model):
_inherit = 'crm.lead'
x_lead_score = fields.Integer(
string='Lead Score',
default=0,
index=True,
help='Score from 0 to 100 used to prioritize opportunities',
)
코드에 필드를 추가한 뒤에는 odoo-bin -u your_module 같은 명령으로 모듈을 업데이트하면 데이터베이스에 컬럼이 자동 생성됩니다.
XML-RPC API로 생성하기
서버에 직접 접근할 수 없거나 자동 배포 스크립트로 필드를 만들고 싶을 때는 Odoo의 XML-RPC API를 통해 원격으로 Integer 필드를 생성할 수 있습니다.
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_lead_score',
'field_description': 'Lead Score',
'model_id': crm_lead_model_id,
'ttype': 'integer',
'state': 'manual',
}]
)
Integer 필드의 ttype 값은 'integer'이며, 사용자 정의 필드임을 나타내려면 state를 'manual'로 설정합니다.
계산된 Integer 필드 추가하기
계산된 Integer 필드는 자동으로 값을 유도할 때 유용합니다. 예를 들어 프로젝트에 연결된 미완료 작업 수를 셀 때처럼요.
class Project(models.Model):
_inherit = 'project.project'
open_task_count = fields.Integer(
string='Open Tasks',
compute='_compute_open_task_count',
store=True,
)
def _compute_open_task_count(self):
for project in self:
project.open_task_count = self.env['project.task'].search_count([
('project_id', '=', project.id),
('stage_id.fold', '=', False),
])
store=True로 설정하면 계산된 값이 데이터베이스에 저장되어 리스트 뷰에서 필터나 정렬 시마다 다시 계산하지 않아도 됩니다.
모범 사례
Integer 필드를 효과적으로 사용하기 위한 실용적인 팁입니다.
집계나 정수 단위 수량에는 Integer 사용
값이 항상 정수여야 하고 소수점이 의미가 없다면 Integer를 선택하세요. 금액, 측정 단위, 소수점이 필요한 수량은 Float나 Monetary 필드를 사용해야 합니다.
합리적인 기본값 설정
Odoo의 Integer 필드 기본값은 0입니다. 많은 경우 괜찮지만, 0이 ‘값이 지정되지 않음’과 혼동을 일으킨다면 비즈니스 로직으로 이를 명확히 처리하거나 값 설정 여부를 기록하는 Boolean 필드를 추가하는 것을 고려하세요.
자주 필터할 필드에는 인덱스 추가
정수 필드를 자주 필터·정렬·그룹화할 계획이라면 index=True를 설정해 DB 인덱스를 생성하세요. 대량 데이터에서 쿼리 성능을 크게 개선할 수 있습니다. 단, 약간의 저장 공간 증가와 쓰기 비용이 발생합니다.
계산 필드는 store=True 사용 권장
사용자가 리스트에서 필터·정렬할 계산 필드는 반드시 store=True로 저장하세요. 저장하지 않으면 도메인 필터에서 사용하거나 그룹화할 수 없습니다.
허용 범위 문서화
예: 점수가 0~100 범위라면 help에 범위를 명시해 사용자에게 유효한 입력값을 안내하세요. 툴팁으로 표시되어 혼란을 줄일 수 있습니다.
ID나 참조를 Integer로 저장하는 것에 신중하라
다른 레코드를 참조해야 한다면 Many2one을 사용하세요. 단순히 ID를 Integer로 저장하면 ORM 기능과 내비게이션, 연쇄 규칙을 활용할 수 없어 취약해집니다.
자주 발생하는 실수
Integer 필드 작업에서 흔히 저지르는 실수들입니다.
Integer와 Float 혼동하기
사용자가 1.5나 0.25 같은 소수값을 입력해야 하는데 Integer를 쓰면 소수점이 잘려 데이터가 손실됩니다. 소수점 가능성이 있다면 Float, 통화라면 Monetary를 사용하세요.
0을 ‘비어있음’으로 오해하기
Integer 필드는 비어 있으면 항상 0을 반환하므로 ‘입력되지 않음’과 ‘의도적 0’의 구분이 불가능합니다. 이 구분이 중요하면 별도의 Boolean 필드(예: has_score)를 두거나, 필요에 따라 Float와 False 기본값을 고려하세요.
자주 쓰는 필드에 인덱스 추가를 잊음
나중에 필터로 자주 쓰게 될 필드를 처음에 인덱싱하지 않으면 대형 DB에서 리스트 뷰가 느려질 수 있습니다. 처음부터 인덱스를 고려하는 편이 낫습니다.
소수 기반 비율을 Integer로 저장
예컨대 75를 75%로 저장하는 방식은 표면적으로는 작동하지만 72.5% 같은 요구가 생기면 문제가 됩니다. 비율에 소수점이 필요할 가능성이 있다면 처음부터 Float를 선택하세요.
필터에 쓰이는 계산 필드에 store=True 설정 안 함
계산된 Integer 필드에 store=True를 빼먹으면 도메인 필터, 자동화된 액션, 리스트 뷰 그룹화 등에서 문제를 겪습니다. 필드의 용도를 생각해 저장 여부를 결정하세요.
결론
Integer 필드는 Odoo 데이터 모델에서 기본이 되는 구성 요소입니다. 단순해 보이지만 빈 필드는 0으로 반환된다는 점, 계산 필드는 필터에 쓰려면 store=True가 필요하다는 점 등 특성을 잘 알면 나중에 고치기 어려운 설계 실수를 미연에 방지할 수 있습니다.
판매 팀을 위한 화면을 구성하든, 커스텀 모듈을 개발하든, 창고의 재주문 규칙을 설계하든 Integer 필드는 모든 단계에 등장합니다. 언제 Integer를 쓰고 언제 Float·Monetary를 선택해야 하는지 아는 것이 견고한 Odoo 구현의 핵심입니다.
Odoo 커스터마이징을 진행 중이고 초기부터 올바른 데이터 모델을 설계하고 싶다면, 이 같은 기초 지식이 프로젝트 전반에 걸쳐 큰 이득을 줍니다.
Odoo 전문가와 함께하기
Dasolo는 다양한 산업의 기업이 Odoo를 도입·커스터마이즈·최적화하도록 돕습니다. 깔끔한 데이터 모델 설계, 맞춤 필드·워크플로우 구축, API를 통한 외부 시스템 연동 등 신뢰할 수 있는 경험을 제공합니다.
Odoo 설정에 대해 궁금한 점이 있거나 프로젝트 상담을 원하신다면, 저희 팀에게 연락하세요저희가 기꺼이 도와드리겠습니다.