기업마다 관리하는 정보가 다릅니다. 표준 소프트웨어로는 담기 힘든 회사 고유의 데이터가 있을 때, Odoo의 커스텀 필드가 그 빈틈을 메워줍니다.
Odoo는 고객, 견적서, 상품, 송장 등 거의 모든 레코드에 새로운 속성을 추가할 수 있도록 설계되어 있습니다. 필요한 정보를 직접 정의하면 Odoo가 해당 데이터까지 기존 레코드와 함께 저장해 줍니다.
이 글은 커스텀 필드의 개념, 내부 동작 원리, 코드 유무에 따른 생성 방법, 그리고 유지보수하기 쉬운 활용법까지 실무에 바로 적용할 수 있게 정리한 안내서입니다.
Odoo에서 커스텀 필드란 무엇인가요?
커스텀 필드는 기본 제공 필드 외에 사용자가 모델에 새로 추가하는 데이터 열입니다. 본질적으로 레코드에 연결된 하나의 정보 조각을 저장하는 점에서 기본 필드와 다르지 않습니다.
Odoo에서는 커스텀 필드 이름이 보통 'x_' 접두사를 가집니다. Studio로 만든 필드는 예를 들어 'x_studio_priority_level'처럼, 코드로 만든 필드는 회사나 프로젝트 접두사를 붙여 'x_mycompany_cost_center'처럼 정합니다.
UI 관점에서 커스텀 필드는 기본 필드와 똑같이 보이고 동작합니다. 폼, 목록, 필터, 그룹화, 보고서 등 모든 위치에 놓일 수 있어 사용자가 기술적 차이를 느끼지 못합니다.
지원되는 필드 유형
Odoo는 다양한 데이터 요구를 커버하는 여러 필드 유형을 제공합니다.
- 텍스트(짧은 문자열): 참조 코드나 라벨 등 짧은 문자열 입력용
- 긴 텍스트: 메모나 상세 설명을 위한 여러 줄 입력
- 정수(Integer): 개수나 점수처럼 정수 값 저장
- 소수(Decimal/Float): 소수점이 필요한 측정값이나 비율
- 화폐(Monetary): 통화 단위를 고려한 금액, 통화 필드와 연동
- 불린(Boolean): 체크박스 방식의 참/거짓 값
- 날짜 / 날짜·시간: 달력 날짜 또는 타임스탬프
- 선택(Selection): 미리 정의된 옵션 목록 드롭다운
- Many2one: 다른 모델의 단일 레코드로 연결하는 외래키
- One2many: 다른 모델의 관련 레코드 목록
- Many2many: 다수의 레코드를 다대다로 연결
- 바이너리(Binary): 파일 첨부용
- HTML: 서식 있는 리치 텍스트
초기에 적절한 필드 유형을 고르는 것이 나중의 골칫거리를 줄입니다. 가능 값이 정해져 있다면 자유 텍스트보다 선택 필드를 사용하는 편이 데이터 일관성에 훨씬 유리합니다.
필드의 동작 방식
Odoo는 ORM(Object-Relational Mapping) 기반 프레임워크 위에 구축되어 있습니다. 화면에 보이는 각 폼이나 목록은 Python 모델이 데이터베이스 테이블과 매핑되어 있고, 커스텀 필드를 추가하면 ORM이 이를 등록해 PostgreSQL에 해당 컬럼을 생성합니다.
즉, 소스 코드를 직접 건드리는 대신 메타데이터 계층(ir.model.fields)에 확장을 저장하는 방식으로 Odoo 데이터 모델을 유연하게 확장합니다. Odoo는 시작 시 이 테이블을 읽어 동적으로 필드를 구성합니다.
코드로 정의한 필드와 데이터베이스에 저장된 필드의 차이
표준 Odoo 개발에서는 Python 모델 클래스 안에 필드를 선언합니다. 프레임워크의 필드 정의 문법을 사용해 모델을 확장하는 방식입니다.
예를 들어 판매 주문에 비용 센터 필드를 추가하는 전형적인 정의는 Python 파일의 모델 클래스에 다음과 같이 선언합니다:
반면 UI나 API로 만든 커스텀 필드는 ir.model.fields에 state='manual'로 저장되어 런타임에 로드됩니다. 양쪽 모두 실제 데이터베이스 컬럼을 생성하고 사용자 관점에서는 동일하게 동작합니다.
관계형 필드와 상호성
Many2one 필드를 만들어 다른 모델로 연결하면, 반대편 모델에 대응하는 One2many 필드를 두는 것이 ORM이 관계를 탐색하는 표준 방식입니다.
예컨대 sale.order에 x_project_id(Many2one)를 추가하면 project 모델 쪽에 x_sale_order_ids(One2many)를 추가해야 프로젝트에서 연관된 주문을 정상적으로 조회할 수 있습니다. 대응 필드가 없으면 양방향 네비게이션이 제한됩니다.
계산형(Computed) 커스텀 필드
계산형 필드는 사용자가 입력하지 않고 다른 필드를 기반으로 값이 자동으로 계산되는 필드입니다. 기술적으로는 Python 메서드를 정의하고 compute 속성으로 연결합니다. 보통 읽기 전용이며 의존 필드가 바뀔 때마다 갱신됩니다.
강력한 도구지만 계산형 필드는 코드 작업이 필요합니다. Odoo Studio만으로는 개발자 모드와 Python 지식 없이 만들기 어렵습니다.
비즈니스 활용 사례
Dasolo가 참여한 프로젝트에서도 거의 예외 없이 커스텀 필드를 사용합니다. 실무에서 자주 등장하는 다섯 가지 사례를 소개합니다.
1. CRM: 리드 분류의 정밀화
기본 리드 정보 외에 업종, 세그먼트 등으로 리드를 세분화해야 하는 경우가 많습니다. '업종' 같은 Selection 필드나 내부 '시장 세그먼트' 모델로 연결되는 Many2one을 추가하면 영업 담당자가 리드를 빠르게 분류하고 관리자가 세그먼트별 파이프라인을 분석할 수 있습니다.
2. 영업: 내부 프로젝트 코드 추적
프로젝트 단위로 청구하는 기업은 각 견적서나 주문에 내부 프로젝트 코드나 예산 코드를 붙여야 할 때가 있습니다. sale.order에 간단한 Char 필드('Project Code')를 추가하면 별도 PM 시스템 없이 인쇄물과 리포트에서 활용할 수 있습니다.
3. 재고: 상품별 추가 속성 관리
업종 특성상 표준 상품 속성만으로 부족할 때가 있습니다. 제조업체라면 '보증기간(개월)'(Integer), '인증기준'(Selection), '원산지'(Many2one→res.country) 같은 필드를 추가해 상품 폼과 재고 보고서에 자연스럽게 통합할 수 있습니다.
4. 회계: 예산·원가 센터 표기
회계팀은 송장이나 전표에 비용 센터나 예산 라인을 태깅해야 합니다. account.move에 커스텀 Many2one으로 'Cost Center' 모델을 연결하면 분석 계정 구조를 변경하지 않고도 상세한 비용 배분과 필터링, 피벗 분석이 바로 가능합니다.
5. 인사: 온보딩 시 수집하는 맞춤 데이터
인사팀은 국가별 계약 유형, 내부 역량 분류, 차량 배정 정보 등 표준 직원 필드에 없는 데이터를 수집합니다. hr.employee에 커스텀 필드를 두면 스프레드시트 대신 Odoo 안에서 검색·보고가 가능합니다.
필드 생성과 커스터마이징 방법
커스텀 필드를 만드는 방법은 주로 두 가지입니다. 어떤 방법을 선택할지는 기술 자원과 필드 복잡도에 따라 달라집니다.
옵션 1: Odoo Studio(노코드)
Odoo Studio는 비개발자에게 가장 빠른 길입니다. Studio를 켜면 몇 번의 클릭으로 필드를 추가할 수 있습니다.
- 필드를 추가할 앱과 레코드 유형(예: 판매 주문 폼)을 엽니다.
- 연필 모양 아이콘을 눌러 Studio 편집 모드로 들어갑니다.
- 왼쪽 패널에서 원하는 필드 유형을 드래그해 폼에 놓습니다.
- 레이블, 기술명, 추가 속성을 설정합니다.
- 저장하고 Studio를 종료합니다.
Studio는 ir.model.fields에 x_studio_ 접두사로 필드를 만들고 뷰에 바로 추가합니다. 서버 재시작이나 배포 과정이 필요 없어 간단한 필드에 권장됩니다.
옵션 2: API를 통한 기술적 커스터마이징
개발 프로젝트에서는 XML-RPC API나 Python 모듈로 필드를 생성합니다. 계산 로직, 복잡한 도메인, 버전 관리가 필요한 경우 이 방법이 적합합니다.
API를 이용해 sale.order에 선택 필드를 만드는 예시는 다음과 같습니다.
(예시 코드) 모델 ID를 찾고 ir.model.fields에 selection 타입 필드를 생성하는 과정을 API 호출로 수행합니다.
이 방식은 소스 파일을 건드리지 않고 필드를 추가하는 Odoo 개발 워크플로의 일부로, 원격 설정이나 자동화 배포 스크립트에 유용합니다.
완전한 Python 모듈 방식에서는 모델 클래스에 필드를 정의하고 표준 모듈 로딩으로 배포합니다. 업그레이드와 버전 관리 측면에서 가장 관리하기 좋은 방법입니다.
뷰에 필드를 추가하기
필드를 생성했다고 해서 바로 화면에 보이는 것은 아닙니다. 해당 폼이나 목록 뷰에 필드를 삽입해야 합니다. Studio는 생성 시점에 함께 처리하지만, 코드 방식이면 뷰 XML을 수정하거나 상속된 뷰에서 필드를 주입해야 합니다.
모범 사례
커스텀 필드는 만들기 쉽지만 설계가 부실하면 나중에 고치기 어렵습니다. 깔끔하게 유지하려면 다음 원칙을 따르세요.
가능하면 선택(Selection) 필드를 사용하라
값의 집합이 미리 정해져 있다면 Char처럼 자유 텍스트를 쓰지 마십시오. 자유 입력은 철자·대문자 차이 등으로 일관성을 해치고 필터·리포팅을 망칩니다. 드롭다운으로 표준화하세요.
명확하고 일관된 네이밍을 사용하라
기술명(x_project_type 등)은 필드가 담는 의미를 반영해야 합니다. x_field_1 같은 이름은 몇 달 뒤 유지보수를 불가능하게 만듭니다. 명명 규칙을 세우고 목적을 문서화하세요.
기본 모델을 과도하게 확장하지 마라
sale.order에 필드를 열 개 이상 추가해야 한다면 별도의 커스텀 모델을 만들고 Many2one로 연결하는 편이 더 바람직할 수 있습니다. 관련 필드들이 하나의 엔티티를 구성한다면 새로운 모델로 분리하세요.
스테이징에서 먼저 테스트하라
운영 DB에 바로 추가하기 전에 복제된 환경에서 검증하세요. 필드 타입이나 대상 모델을 잘못 선택하면 수동 복구가 필요할 수 있습니다. 스테이징에서 문제를 미리 발견하세요.
커스텀 필드 문서를 남겨라
추가한 필드의 모델, 기술명, 목적, 요청자를 기록해 두세요. 시간이 지나면 필드가 쌓여 어떤 것이 사용 중이고 버려진 것인지 구별하기 어려워집니다.
계산 로직에는 적절한 도구를 사용하라
값이 다른 필드에 의존한다면 사용자가 수동 입력하게 하지 말고 계산형 필드로 처리하세요. 일관성이 높아지고 데이터 입력 오류가 줄어듭니다. 계산형 필드는 Odoo Python 필드 기능의 일부로 공인된 방법입니다.
자주 발생하는 실수
숙련된 팀도 커스텀 필드에서 흔히 겪는 문제들이 있습니다. 대표적인 예를 정리합니다.
Many2one을 만들고 One2many를 까먹는 경우
가장 흔한 실수입니다. 모델 A에 다른 모델 B를 가리키는 Many2one을 만들고, B 측에 대응하는 One2many를 만들지 않으면 B에서 A로 연결된 레코드를 볼 수 없습니다. 항상 쌍으로 생성하세요.
데이터가 들어있는 필드를 삭제하는 실수
필드를 삭제하면 해당 컬럼과 데이터가 영구 삭제됩니다. 복구 불가입니다. 향후 필요할 가능성이 있다면 삭제 대신 숨기거나 아카이브 처리하세요.
운영 환경에서 바로 필드를 만드는 실수
라이브 환경에서 테스트 없이 변경하면 뷰 설정 오류 등으로 사용자가 곤란을 겪을 수 있습니다. 항상 테스트 환경에서 먼저 검증하세요.
표준 필드와의 이름 충돌
Odoo는 동일한 이름의 필드를 거부하지만, 향후 설치할 모듈의 필드를 가리는 이름을 실수로 만들 수 있습니다. 회사 고유 접두사(x_acme_ 등)를 사용하면 충돌 위험이 줄어듭니다.
사용자 경험(UX)을 고려하지 않은 뷰 추가
필드를 폼에 넣는다고 해서 기본적으로 보여줘야 하는 것은 아닙니다. 화면이 복잡해지면 오히려 작업이 느려집니다. 특정 상황에서만 보이도록 탭으로 분리하거나 도메인 기반 가시성 규칙을 적용하세요.
Studio 필드와 코드 필드를 섞어 쓰면서 정책이 없는 경우
Studio와 코드 기반 커스터마이징을 혼용하면 중복 목적의 필드나 이름 충돌이 생길 수 있습니다. 프로젝트 초기에 원칙을 정하세요: 단순 필드는 Studio, 복잡 로직은 코드로 하거나 모든 것을 코드로 관리하는 방식 중 하나를 선택하세요.
결론
커스텀 필드는 Odoo를 비즈니스에 맞추는 가장 간단하면서도 효과적인 방법입니다. 소스 변경 없이 플랫폼과 자연스럽게 통합되고, 사용자에게 필요한 데이터 캡처를 정확히 제공합니다.
핵심은 설계입니다. 올바른 필드 타입 선택, 명확한 네이밍, 관계 필드 규약 준수, 문서화가 필수입니다. 잘 설계된 필드 구조는 Odoo 운영을 더 쉽고 유연하게 만듭니다.
Odoo Studio로 빠르게 노코드 필드를 추가하든, Python 모듈로 확장하든 기본 원칙은 같습니다: 데이터에 맞는 필드를 만들고 모델을 깔끔하게 유지하며 운영 전 반드시 테스트하세요.
Dasolo는 기업의 실제 업무에 맞춰 Odoo를 도입하고 커스터마이징하며 최적화하는 것을 돕습니다. 몇 개의 필드 추가부터 완전한 커스텀 모듈 개발까지 필요에 맞게 지원합니다.
도움이 필요하면 연락 주세요. 현재 설정을 검토하고 가장 깔끔한 진행 방향을 제안해 드립니다.