소개
Boolean(불리언) 필드는 Odoo에서 가장 단순하지만 가장 빈번히 쓰이는 필드 유형 중 하나입니다. 판매 주문의 체크박스를 클릭하거나 고객을 활성화/비활성화하고, 상품을 즐겨찾기로 표시할 때마다 이 필드와 상호작용하고 있는 셈입니다.
겉보기에는 단순하지만 Boolean 필드만의 동작 특성을 잘 이해하면 시스템 설계가 훨씬 깔끔해집니다. 어디에 쓰기 적절한지, 언제 다른 타입을 선택해야 하는지, 설정 시 주의할 사항을 알면 운영상의 실수와 유지보수 비용을 크게 줄일 수 있습니다.
이 가이드는 Boolean 필드를 전방위적으로 다룹니다. 어떤 값을 저장하는지, 데이터 모델과 UI에서 어떻게 보이고 동작하는지, Odoo Studio나 Python으로 어떻게 추가하는지, 실무 사례와 함께 실제 운영에 유용한 팁까지 정리했습니다.
Odoo에서 Boolean 필드란 무엇인가
Odoo ORM에서 Boolean 필드는 두 가지 값만 가집니다: True 또는 False입니다. PostgreSQL에서는 BOOLEAN 컬럼으로 매핑되며, 중간 상태나 애매모호함이 없습니다. 즉 체크되어 있거나(참), 체크되어 있지 않거나(거짓) 두 가지만 존재합니다.
사용자 관점에서는 폼 뷰에선 표준 체크박스로 보입니다. 리스트(목록) 뷰에서는 True면 체크 아이콘이 보이고 False면 비어 있는 방식이 기본 동작입니다. 설정에 따라 토글 스위치 형태의 위젯으로 표시되기도 합니다.
Python으로 정의할 때의 전형적인 예시는 다음과 같습니다.
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
needs_manual_review = fields.Boolean(
string='Needs Manual Review',
default=False,
)
string 파라미터는 UI에 표시될 레이블을 정하고, default는 신규 레코드 생성 시 초기값을 제어합니다. Odoo는 기본적으로 값이 없을 때 False로 취급하지만, 의도를 명확히 하기 위해 default를 명시하는 것이 권장됩니다.
Odoo Studio에서 같은 타입은 단순히 'Checkbox'라고 불립니다. Studio에서 만든 필드는 자동으로 x_studio_ 접두사를 받고, Python이나 API로 만들 때는 기술명(name)을 직접 정하게 됩니다.
필드의 동작 방식
모델에 Boolean 필드를 추가하면 모듈 설치나 업그레이드 과정에서 Odoo가 자동으로 PostgreSQL 컬럼을 생성해 줍니다. 별도의 SQL 마이그레이션을 수동으로 할 필요가 없습니다.
중요한 점은: Odoo에서 Boolean 필드는 결코 NULL을 가지지 않습니다. ORM은 항상 True 또는 False를 반환합니다. 데이터베이스에 값이 없어도 읽을 때 False로 돌려주므로 다른 타입과 달리 None/NULL을 별도로 체크할 필요가 없습니다.
주요 필드 속성
Odoo에서 Boolean 필드에 설정할 수 있는 주요 속성은 다음과 같습니다.
- default: 레코드 생성 시 기본값을 설정합니다. 대부분 False로 설정하지만, 옵트아웃(opt-out) 같은 시나리오에서는 True로 둘 수 있습니다.
- compute: Python 메서드로 값을 계산하게 합니다. 다른 필드 상태에 따라 도출되는 파생 플래그에 유용합니다.
- store: compute와 함께 사용하면 값이 DB에 저장됩니다. store=True로 두면 계산된 Boolean 필드를 검색 필터나 보고서에 활용할 수 있습니다.
- readonly: UI에서 사용자가 값을 변경하지 못하도록 막습니다. 시스템이 설정해야 하는 계산형 플래그에 자주 사용됩니다.
- copy: 레코드 복제 시 값 복사를 제어합니다. 기본값은 True지만, 승인 여부 같은 상태 플래그에는 copy=False를 설정해 복제 시 초기 상태를 유지하게 하는 것이 좋습니다.
- groups: 특정 사용자 그룹만 조회·편집할 수 있게 제한합니다.
뷰에서의 표시 방식
폼 뷰에서는 HTML 체크박스로 렌더링되고, 리스트 뷰에서는 True에 체크 아이콘이 표시되어 한눈에 파악하기 쉽습니다.
위젯을 변경하면 표시 방식을 바꿀 수 있습니다. toggle 위젯은 스위치 형태로 보여 설정·선호 옵션에 적합하고, boolean_favorite 같은 위젯은 별 모양 등 아이콘으로 표시해 제품 즐겨찾기 등 UI에 맞춤형 표현을 제공합니다.
도메인(검색 필터)에서의 사용
Boolean 필드는 도메인(검색식)에서 쓰기 편합니다. 예를 들어 특정 조건에 맞는 레코드만 골라내려면 다음과 같이 필터를 씁니다.
[('needs_manual_review', '=', True)]
값이 두 가지뿐이므로 간단한 형태로 필터를 표현할 수 있습니다.
[('needs_manual_review', '=', False)]
이런 단순한 필터링 동작 덕분에 자동화 액션, 스케줄 액션, 서버 액션 등과도 자연스럽게 결합되어 복잡한 조건 없이도 쉽게 처리할 수 있습니다.
Odoo ORM과의 상호작용
개발 관점에서 Boolean 필드를 읽고 쓰는 과정은 매우 직관적입니다. 레코드 객체에서 값을 확인하고 True/False로 비교하거나 직접 할당하면 ORM이 알아서 처리합니다. XML-RPC API로 전송할 때도 True/False가 정확히 매핑되어 변환 이슈가 거의 없습니다.
비즈니스 활용 사례
실무에서 Boolean 필드는 거의 모든 부서에서 활용됩니다. 아래는 자주 쓰이는 다섯 가지 사례입니다.
CRM: 리드(잠재고객) 자격 확인 여부 표시
영업팀은 상위 담당자가 리드를 검토해 유효하다고 판단했는지 표시할 필요가 많습니다. CRM 리드 모델에 is_qualified 같은 Boolean을 두면 파이프라인 필터링이 쉬워져, 초급 담당자는 미검토 리드를 처리하고 검증된 리드는 우선적으로 배정하는 식의 업무 분담이 간단해집니다.
영업: 수동 검토가 필요한 주문 표시
대량 금액 주문이나 신규 고객 주문처럼 추가 승인 절차가 필요한 경우, sales.order에 needs_manual_review 플래그를 두고 비즈니스 규칙으로 자동 설정하면 재무나 운영팀이 명확한 작업대기를 확인해 승인 프로세스를 빠르게 처리할 수 있습니다.
재고: 카탈로그에서 제외된 상품 표시
판매 중단된 상품을 역사 기록용으로 시스템에 남겨둬야 할 때가 있습니다. product.template에 is_discontinued 같은 Boolean을 추가하면 구매·영업팀이 재주문이나 고객 제공에서 해당 상품을 배제할 수 있고, 가격표나 구매 검증 규칙, 웹사이트 노출 설정에도 쉽게 활용할 수 있습니다.
회계: 주의가 필요한 송장 식별
분쟁 중이거나 가격 차이가 있는 송장은 회계팀이 별도로 관리해야 합니다. under_dispute 같은 Boolean 플래그로 표시하면 필터와 보고서가 구조화되어 자동 알림을 억제하거나, 문제 해결 전까지 불필요한 결제 압박을 줄이는 등의 처리가 가능해집니다.
인사: 교육·자격증 이수 관리
필수 교육 이수 여부나 자격 보유 여부를 직원 레코드에 Boolean으로 두면 관리가 단순해집니다. 예: safety_training_completed. 관리자는 누가 아직 교육을 이수하지 않았는지 필터링해서 추적할 수 있고, 컴플라이언스 보고서에도 바로 활용할 수 있습니다.
Boolean 필드 생성 및 커스터마이징 방법
Boolean 필드를 추가하는 방법은 기술 스택과 커스터마이징 수준에 따라 세 가지로 나뉩니다.
Odoo Studio 사용(코딩 불필요)
Odoo Studio는 코드 작성 없이 커스터마이징 할 수 있는 저코드 도구입니다. Studio로 Boolean 필드를 추가하는 절차는 간단합니다.
- 메인 메뉴에서 Odoo Studio 앱을 엽니다(Studio 앱 필요).
- 필드를 추가할 폼 화면으로 이동합니다.
- 사이드바에서 Checkbox 필드를 드래그해서 폼 레이아웃에 놓습니다.
- 필드 속성 패널에서 레이블, 기본값, 필수/읽기 전용 제약 등을 설정합니다.
- 저장 후 Studio를 닫습니다.
Studio는 내부적으로 DB 컬럼을 생성하고 x_studio_ 접두사로 필드를 등록합니다. 별도 서버 재시작이나 업그레이드 없이 바로 사용 가능합니다.
커스텀 모듈에서 Python 사용
버전 관리, 테스트, 프로덕션 배포가 필요한 커스터마이징은 Python 모듈에서 필드를 정의하는 것이 권장됩니다. 예를 들어 다음처럼 모델에 Boolean을 정의합니다.
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
x_is_key_account = fields.Boolean(
string='Key Account',
default=False,
copy=False,
)
필드를 정의한 뒤에는 관련 뷰의 XML에 추가해 UI에 보이도록 합니다. 모듈 설치·업그레이드 시 Odoo가 DB 컬럼을 생성합니다.
계산형(Boolean compute) 필드는 다음 패턴으로 구성합니다.
from odoo import api, fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
is_high_value = fields.Boolean(
string='High Value Order',
compute='_compute_is_high_value',
store=True,
)
@api.depends('amount_total')
def _compute_is_high_value(self):
for order in self:
order.is_high_value = order.amount_total >= 10000
store=True로 두면 계산된 값이 DB에 저장되어 검색 필터나 그룹화에서 재계산 없이 사용할 수 있습니다.
XML-RPC API 사용
배포 파이프라인이나 원격 구성 스크립트에서 프로그래밍 방식으로 필드를 생성해야 할 때는 ir.model.fields 모델을 통해 XML-RPC로 Boolean 필드를 만들 수 있습니다.
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_needs_manual_review',
'field_description': 'Needs Manual Review',
'model_id': model_id,
'ttype': 'boolean',
'state': 'manual',
}]
)
state: 'manual'은 해당 필드가 모듈 바깥(Studio나 API)에서 생성되었음을 나타냅니다. 원격 구성 워크플로우에서 필드를 자동 생성할 때 이 설정을 사용하는 것이 일반적입니다.
모범 사례
1. 항상 기본값을 명시하라
Odoo가 기본적으로 비어 있는 Boolean을 False로 취급하더라도, 모델 정의에 default=False를 명시하는 것이 좋은 습관입니다. 코드 읽는 이에게 의도를 분명히 전달하고 자동화 규칙이나 필터 사용 시 혼란을 줄여줍니다.
2. 질문 형태로 읽히는 이름을 사용하라
Boolean 이름은 예/아니오 질문처럼 읽히는 것이 가장 이해하기 쉽습니다. is_verified, needs_approval, has_warranty, is_key_account 같은 이름은 즉시 의미가 와닿습니다. 반면 flag, status, check 같은 모호한 이름은 무엇을 뜻하는지 알기 어렵습니다.
3. 승인·상태 플래그에는 copy=False 설정
복제 시 상태를 이어받지 말아야 하는 승인 플래그에는 copy=False를 지정하세요. 그렇지 않으면 복제된 레코드가 이미 승인된 상태로 보이는 등 잘못된 상태가 생깁니다.
4. 파생 상태는 compute 필드로 처리하라
다른 필드에 따라 결정되는 상태를 업데이트하는 코드를 여기저기 흩어놓지 말고, compute와 @api.depends 데코레이터로 한 곳에서 관리하세요. 유지보수와 디버깅이 훨씬 쉬워집니다.
5. 자주 필터링하는 Boolean은 검색 뷰에 추가하라
If users regularly need to filter records based on a Boolean field, add it explicitly to the search view. In Studio, enable the search option in the field properties panel. In code, add it to the <search> view XML. This gives users a clean filter button in the search bar rather than forcing them to use advanced filters every time.
자주 빠지는 함정
Boolean으로 다중 상태를 흉내내지 마라
가장 흔한 실수는 세 가지 이상 상태를 표현하려고 Boolean을 여러 개 조합하는 것입니다. 예: pending, approved, rejected 같은 경우에는 Selection 필드나 워크플로우를 사용해야 합니다. Boolean은 진짜 이분법(binary) 상황에만 사용하세요.
승인 플래그에 copy=False를 설정하지 않는 것
레코드 복제 시 기본적으로 모든 값이 복사됩니다. 승인된 주문을 복제하면 승인 플래그도 같이 복제되어 잘못된 처리가 발생할 수 있습니다. 복제 시 초기화되어야 할 플래그에는 꼭 copy=False를 지정하세요.
검색 뷰에 필드를 추가하지 않는 것
사용자가 자주 그 필드로 검색해야 하는데 검색 뷰에 추가하지 않으면 매번 고급 필터를 열어야 해 업무 속도가 느려집니다. 자주 쓰는 필드는 검색 뷰 추가를 잊지 마세요.
표준 active 필드를 대신해 커스텀 Boolean을 사용하지 마라
레코드를 숨기거나 아카이브하려는 목적이라면 모델에 기본으로 제공되는 active 필드를 활용하세요. 커스텀 가시성 플래그를 만들면 Odoo 표준 동작과 어긋나고 아카이브/언아카이브 기능과 충돌할 수 있습니다.
store=True가 없는 계산형 Boolean을 필터에서 사용하려는 것
compute만 있고 store=True가 아닌 필드는 메모리상에만 존재하기 때문에 SQL 쿼리에서 사용할 수 없습니다. 검색이나 그룹화에 쓰려면 반드시 store=True로 저장하세요.
결론
Boolean 필드는 제대로 작동할 때 사용자에게는 ‘없는 듯 자연스럽게’ 작동합니다. active 플래그, is_published 같은 사이트 노출 제어뿐 아니라, 각사별로 추가하는 수십 가지 커스텀 플래그까지 Odoo 전반에 널리 퍼져 있습니다.
데이터 모델에서의 동작 방식, 적절한 기본값과 속성 설정, 그리고 Selection 같은 다른 필드 타입과의 선택 기준을 이해하면 유지보수 쉽고 예측 가능한 시스템을 설계할 수 있습니다.
잘 설계된 Boolean 필드는 최종 사용자에게는 눈에 띄지 않게 ‘그냥 작동’합니다. 반대로 잘못 쓰이면 혼란과 상태 불일치, 비효율적인 예외처리만 쌓입니다. 규칙을 알고 일관되게 적용하는 것이 차이를 만듭니다.
Dasolo은 기업들이 Odoo를 설계·커스터마이즈·최적화하도록 돕습니다. 깔끔한 데이터 모델 설계, 업무에 맞는 커스텀 필드 추가, 혹은 완전한 모듈 개발까지 필요하시면 지원해 드립니다. 문의하기 귀사의 Odoo 프로젝트에 대해 이야기해 보겠습니다.